Я думаю, що багато деталей вашого запитання могло б однаково стосуватися того avahi-daemon
, на що я розглядав нещодавно. (Можливо, я пропустив ще одну деталь, яка відрізняється). Запуск avahi-демон в chroot має багато переваг, у випадку, якщо avahi-daemon буде порушений. До них належать:
- він не може читати домашній каталог будь-якого користувача та розробляти приватну інформацію.
- він не може використовувати помилки в інших програмах, записуючи в / tmp. Існує хоча б одна ціла категорія таких помилок. Наприклад, https://www.google.co.uk/search?q=tmp+race+security+bug
- він не може відкрити файл Unix, що знаходиться за межами chroot, який інші демони можуть слухати та читати повідомлення.
Точка 3 може бути особливо приємною, коли ви не використовуєте dbus або подібне ... Я думаю, що avahi-daemon використовує dbus, тому він гарантує збереження доступу до системного dbus навіть зсередини chroot. Якщо вам не потрібна можливість надсилати повідомлення на системний dbus, відмова від цієї здатності може бути дуже приємною функцією безпеки.
управління ним за допомогою файлу системного блоку
Зауважте, що якщо avahi-daemon був переписаний, він може потенційно вирішити покластися на systemd для безпеки та використовувати напр ProtectHome
. Я запропонував змінити avahi-daemon, щоб додати ці захисти як додатковий шар, а також деякі додаткові захисти, які не гарантуються chroot. Повний список запропонованих мною варіантів можна переглянути тут:
https://github.com/lathiat/avahi/pull/181/commits/67a7b10049c58d6afeebdc64ffd2023c5a93d49a
Схоже, існує більше обмежень, якими я міг би скористатися, якби avahi-daemon не використовував chroot, деякі з яких згадуються у повідомленні комісії. Я не впевнений, наскільки це стосується, хоча.
Зауважте, захист, який я використовував, не обмежував би демон відкривати файли сокетів Unix (пункт 3 вище).
Іншим підходом було б використання SELinux. Однак ви хотіли б прив’язати свою програму до цього підмножини дистрибутивів Linux. Причиною, чому я позитивно подумав про SELinux, є те, що SELinux обмежує доступ, який мають процеси на dbus, дрібнозернистим способом. Наприклад, я думаю, що ви часто можете очікувати, що systemd
їх не буде в списку імен шин, які вам потрібні, щоб мати змогу надсилати повідомлення на :-).
"Мені було цікаво, чи використовувати системну пісочницю безпечніше, ніж chroot / setuid / umask / ..."
Резюме: чому б не обидва? Давайте трохи розшифруємо вище :-).
Якщо ви думаєте про пункт 3, використання chroot забезпечує більше обмеженості. ProtectHome = та його друзі навіть не намагаються бути настільки обмежуючими, як chroot. (Наприклад, жоден із названих системних опцій чорний список /run
, де ми, як правило, ставимо файли сокетів Unix).
chroot показує, що обмеження доступу до файлової системи може бути дуже потужним, але не все в Linux - це файл :-). Є системні параметри, які можуть обмежувати інші речі, які не є файлами. Це корисно, якщо програма порушена, ви можете зменшити доступні для неї функції ядра, що може спробувати використати вразливість. Наприклад, avahi-daemon не потрібні розетки Bluetooth, і я думаю, що ваш веб-сервер також не :-). Тому не надайте йому доступ до родини адрес AF_BLUETOOTH. Просто білий список AF_INET, AF_INET6 і, можливо, AF_UNIX, використовуючи цю RestrictAddressFamilies=
опцію.
Будь ласка, прочитайте документи для кожної вашої опції. Деякі варіанти є більш ефективними в поєднанні з іншими, а деякі доступні не в усіх архітектурах процесора. (Не тому, що процесор поганий, а тому, що порт для цього процесора не був настільки гарний. Я думаю).
(Тут є загальний принцип. Це більш безпечно, якщо ви можете писати списки того, що ви хочете дозволити, а не того, що ви хочете відмовити. Як визначення chroot дає вам список файлів, до яких ви можете отримати доступ, і цей більш надійний ніж сказати, що ви хочете заблокувати /home
).
У принципі, ви можете застосувати всі ті ж самі обмеження перед setuid (). Це всього лише код, який можна скопіювати з systemd. Однак параметри системного блоку повинні бути значно простішими для запису, а оскільки вони є у стандартному форматі, їх слід легше читати та переглядати.
Тому я настійно рекомендую просто прочитати розділ пісочниці man systemd.exec
на вашій цільовій платформі. Але якщо ви хочете найбільш безпечний дизайн можна, я не боявся б спробувати chroot
(а потім видалити root
привілеї) у вашій програмі , а також . Тут є компроміс. Використання chroot
накладає деякі обмеження на ваш загальний дизайн. Якщо у вас вже є дизайн, який використовує chroot, і він, здається, робить те, що вам потрібно, це звучить досить чудово.