Немає причин мати / run і / tmp
Я думаю, ти маєш рацію. /tmp
істотно застаріло зараз у нас /run
. Якщо ваша програма може це зробити (що вимагає, щоб вона була встановлена як привілейована операція), то сьогодні ви будете використовувати підкаталог /run
. Це з міркувань безпеки.
Наприклад, демон друку CUPS не працює як root, але зазвичай встановлюється з пакета ОС. Пакет встановлюється /usr/lib/tmpfiles.d/cups.conf
та systemd-tmpfiles
створює каталог, до якого він може отримати доступ. Оскільки каталог знаходиться під /run
назвою, непривілейований користувач не може зловмисно стверджувати ім'я, на відміну від /tmp
світового запису.
"Непривілейовані програми", які не можуть використовуватись /run
безпосередньо
Справжня відмінність полягає в тому, якщо вашою програмою керує довільний непривілейований користувач під власним ідентифікатором користувача. Але ви все ще не бажаєте користуватися /tmp
, оскільки до нього можуть отримати доступ інші непривілейовані користувачі. Ви б вважали за краще використовувати $XDG_RUNTIME_DIR
. Зазвичай це реалізується як /run/user/$(id -u)
- так воно буває і підкаталогом /run
. Місце не гарантується, хоча; програми завжди повинні використовувати змінну середовища.
/tmp
було б корисно лише для тимчасової співпраці між різними непривілейованими користувачами в системі. Такі спеціальні системи є вразливими для зловмисного користувача, який відмовляється співпрацювати та псувати речі для всіх :). Одним із прикладів можуть бути непривілейовані користувачі, які вирішили запустити версію talk
демона, використовуючи unix-сокет.
Зауважимо, контрольний список Поеттерінга нижче стверджував, що /tmp
він буде корисним для "невеликих файлів", тоді як його /run
слід використовувати лише для "примітивів зв'язку". Я також не думаю, що це відмінність правдиве. Хлопчик, що /run
займається плакатами, є udev
, і я впевнений, що він /run/udev
включає внутрішні бази даних. Після того, як у вас є /run
каталог, я не думаю, що хтось хоче слідувати заявленому розрізненню і створити інший каталог, щоб захаращувати /tmp
. Тому на практиці ми просто використовуємо /run
сьогодні.
Використання спільно використовуваних просторів загальних імен [like / tmp] для цілей спілкування завжди було проблематичним, оскільки для встановлення зв’язку потрібні стабільні імена, але стабільні імена відкривають двері для DoS-атак. Це можна виправити частково, встановивши захищені каталоги на додаток для певних служб під час раннього завантаження (як це робимо для X11), але це усуває проблему лише частково, оскільки це працює лише правильно, якщо за кожною установкою пакета йде перезавантаження.
...
Ще одна функція Fedora (для Fedora 17) змінила семантику / tmp для багатьох системних служб, щоб зробити їх більш безпечними, виділивши / tmp простори імен різних служб
...
Оскільки / tmp більше не є спільним простором імен, воно, як правило, не підходить як місце для примітивів для зв'язку.
...
[/ run] гарантовано є tmpfs і, отже, автоматично змивається під черевиками. Поза цим не робиться автоматична очистка.
...
Ось приблизне керівництво про те, як ми пропонуємо вам (розробнику додатків Linux) вибрати потрібний каталог для використання:
- Вам потрібне місце, щоб розмістити ваш сокет (або інший примітивний зв’язок), і ваш код працює привілейовано: використовуйте підкаталог під / запуском. (Або під / var / run для додаткової сумісності.)
- Вам потрібне місце, щоб поставити ваш сокет (або інший примітивний зв’язок), і ваш код працює непривілейовано: використовуйте підкаталог під $ XDG_RUNTIME_DIR.
- Вам потрібне місце, щоб розмістити великі завантаження та завантаження та непривілейовано: використовувати $ XDG_DOWNLOAD_DIR.
- Вам потрібно розмістити кеш-файли, які мають бути стійкими та працювати непривілейовано: використовуйте $ XDG_CACHE_HOME.
- Нічого з вищезазначеного не застосовується, і вам потрібно розмістити невеликий файл, який не потребує стійкості: використовуйте $ TMPDIR із резервним ввімкненням на / tmp. І використовувати mkstemp (), і mkdtemp () і нічого домашнього.
- В іншому випадку використовуйте $ TMPDIR із резервним відключенням на / var / tmp. Також використовуйте mkstemp () / mkdtemp ().
Зауважте, що зазначені вище правила запропоновані лише нами. Ці правила враховують усе, що ми знаємо про цю тему, і уникаємо проблем із поточними та майбутніми дистрибутивами, наскільки ми їх бачимо. Будь ласка, подумайте над оновленням своїх проектів відповідно до цих правил і пам’ятайте про них, якщо ви пишете новий код.
Одне, що ми хотіли б підкреслити, це те, що / tmp та / var / tmp найчастіше - це насправді не є правильним вибором для вашої використання. Існує дійсне використання цих каталогів, але досить часто інший каталог насправді може бути кращим місцем. Отже, будьте обережні, розгляньте інші варіанти, але якщо ви все-таки переходите до / tmp або / var / tmp, то принаймні обов'язково використовуйте mkstemp () / mkdtemp ().
Ми начебто відходимо від застарілого /tmp
розетки, використовуваного віконною системою X, як описано вище. Я неправильно прочитав tmpfiles.d/x11.conf
. Схоже, це покладається на співпрацю :). Я припускаю, що код перевіряли, таким чином, що відмова в обслуговуванні є найгіршим, що може статися.