Тривалий час роботи доводить лише те, що запуск вдався з тими привілеями, які демон мав у ту мить. Збої, важливі тут, приходять пізніше: підключається новий клієнт, замінюється список відкликання, допоміжному скрипту треба записати файл. Кожен із них це нове відкриття, виконане обліковим записом без привілеїв, зі своїм питанням про права й своїм повідомленням про помилку. Три рішення відділяють конфігурацію, яка далі працює, від тієї, що зривається на наступній події.

Відокремте завантажене рано від того, що відкривається пізніше

Дескриптор це ручка на відкритому описі файлу, і режим доступу було зафіксовано під час створення цього опису. Пізніша зміна користувача процесу ручку не закриває, тому файл ключа, прочитаний як root, працює й після скидання. Режим теж не змінюється: ручка, відкрита для читання, не стає записуваною, а записувана ручка не відкликається лише тому, що обліковий запис втратив права на шлях. Ці два факти пояснюють більшість несподіваної поведінки в таких звітах.

Друга половина це пам’ять. Демон може розібрати сертифікат, зберегти розібраний матеріал і закрити файл; у використанні залишаються дані, а не відкритий файл. Тому безперервний трафік не доводить ні того, що дескриптор відкритий, ні того, що ім’я шляху досяжне. Він доводить лише те, що матеріал, потрібний поточній сесії, було отримано раніше.

Пізніше відкриття це інша транзакція. Воно виконується під поточними обліковими даними, поточним контекстом безпеки й поточним поданням монтування, тож шлях, читабельний під час запуску, може бути відхилений при наступному підключенні. Ротація додає пастку: запис нового файлу поверх того самого імені шляху залишає наявний дескриптор прив’язаним до старого об’єкта, тож перезавантаження може виглядати успішним, поки демон ще використовує попередній вміст. Порівняйте inode, який тримає процес, із тим, що на диску, перш ніж повірити в ротацію.

Назвіть три читання часу виконання й коли відбувається кожне

Три ресурси зазвичай відкриваються значно пізніше за ініціалізацію, і вони зриваються в різні моменти. Файл конфігурації конкретного клієнта читається, коли той клієнт підключається, тому може зламатися для одного користувача, поки інші працюють. Дані відкликання перевіряються під час автентифікації партнера і ще раз, коли файл замінюють. Тимчасовий каталог зачіпають лише тоді, коли скрипт або плагін щось записує.

Жоден із трьох не належить до шляху запуску, тому сервер, здоровий тижнями, може зірватися на наступному підключенні. Категорія також називає власника виправлення: перші два це права читання конфігурації під обліковим записом демона, а третій це записуване місце з вузьким призначенням.

Path reopened laterWhat triggers the openFirst sign when it fails
Client configuration fileA connection for that client identityOne client rejected while others connect
Revocation dataPeer authentication, including after replacementRevoked and valid peers both refused
Script or plugin temporary directoryA helper needs to create a fileThe helper exits with a path error

persist-key відповідає на вужче питання, ніж більшість припускає. Він тримає файл ключа відкритим упродовж документованих скидань SIGUSR1 і ping-restart, і він нічого не робить для файлів CCD, даних відкликання, допоміжних виконуваних файлів або повного перезапуску процесу. Вони далі йдуть власними шляхами відкриття, під тим обліковим записом, який тоді працює.

Підтвердьте обліковий запис і подання, яке він справді має

Запитайте в працюючого демона, який обліковий запис він використовує, замість того щоб довіряти файлу unit, а тоді порівняйте відповідь із тим, що задає unit. Розбіжність це перше, що треба вирішити, адже кожна наступна перевірка прав іде від імені того, ким процес є насправді. Далі пройдіть шлях покомпонентно; прохідність оцінюють на кожному рівні, тож читабельний файл у каталозі, крізь який не пройти, лишається нечитабельним. Остаточний режим файлу це останнє питання, а не перше.

Простори імен і пісочниці служби додають межі, яких не описують власність і біти режиму. Шлях, видимий у вашій оболонці, може бути відсутнім або доступним лише для читання всередині chroot, простору імен монтування чи unit, що ховає домашні каталоги. Модулі безпеки додають ще один шар, тож файл, який виглядає читабельним, усе одно може бути відхилений при відкритті.

ps -o user:12,pid,args -C openvpn
systemctl show -p User -p Group -p ProtectHome -p RootDirectory [email protected]
sudo -u openvpn namei -l /etc/openvpn/ccd/alice

Успішне читання в оболонці адміністратора не перевіряє жодної з цих поєднаних умов. Виконайте перевірку від імені облікового запису демона, з тим самим простором імен і пісочницею, або прийміть, що результат описує вашу оболонку, а не сервер. Третя команда це дешева версія того тесту: вона друкує режим кожного компонента й зривається на першому, крізь який обліковий запис демона не може пройти.

Дайте запису часу виконання окремий каталог

Читання це лише половина опису. Допоміжному скрипту може знадобитися створити файл стану, плагіну записати стан поруч зі своєю конфігурацією, і ці записи не покриває те, що дерево конфігурації стає записуваним. Дайте конкретному каталогу право запису, якого потребує його функція, з власником і режимом, які ви можете пояснити. Віддавайте перевагу доступу лише для читання всьому, що лише читається.

Тримайте права приватного ключа окремо від файлів політики. Ключ, який треба перечитати після скидання, має іншу вимогу, ніж клієнтський файл, який читають при кожному підключенні, а один м’який режим для обох дає більше доступу, ніж просить проблема. Виділений обліковий запис демона з вузькою власністю перевіряти легше, ніж широку групу. Коли ключ має пережити скидання, persist-key усуває повторне читання замість розширення каталогу.

Вирішуйте за подією, яку можете відтворити

Живий тунель доводить один шлях у коді. Подія, якій потрібен файл, це єдиний тест, що покриває потрібне вам відкриття, чи то нове підключення клієнта, замінений файл відкликання, дозволене м’яке скидання або запланований перезапуск. Виберіть подію, виконайте її й збережіть першу помилку, а не останню.

Для м’якого скидання один сигнал і журнал unit показують, чи перечитано ключ. Надішліть сигнал, а тоді прочитайте останні рядки, які записав unit:

systemctl kill -s SIGUSR1 [email protected]
journalctl -u [email protected] -n 40 --no-pager

Не робіть висновку, що скомпрометований демон більше не може змінювати файли лише тому, що привілеї знижено. Що він ще може, залежить від решти облікових даних, його можливостей, каталогів, у які він може писати, і кожної ще втримуваної записуваної ручки. Зниження привілеїв звужує повноваження, а опис відкриттів часу виконання показує, наскільки. Запишіть цю межу поруч із конфігурацією, щоб наступній людині не довелося відкривати її заново.

Схожі статті