Чи варто відмовитися від chroot або скопіювати iproute2 до в'язниці?
Неповна в'язниця здається після запуску, а не під час завантаження. Виберіть між послабленням посилення та копіюванням бінарників разом із бібліотеками в новий корінь.
Служба запускається, клієнт під'єднується, і на боці сервера маршрут так і не з'являється. Або демон відмовляється запускатися і називає команду, яку не зміг виконати. Обидва результати дотримуються тих самих трьох рядків, які зазвичай копіюють разом із посібника з посилення: перехід на непривілейований обліковий запис, відмова від групи та зміна кореня файлової системи. Лише один із трьох приховує файли, і лише один із них забирає право змінювати таблицю маршрутизації. Розділити їх — це спосіб дізнатися, який рядок вам насправді потрібен.
Що в'язниця прибирає, а демону це все ще потрібно
Зміна кореня відбувається після запуску, тому демон зберігає все, що вже відкрив, і втрачає все, що відкрив би пізніше. Будь-який помічник, який з'єднання запускає після цього моменту, має існувати всередині нового кореня разом із завантажуваними спільними бібліотеками. У в'язниці, зібраній із файлу конфігурації та сертифіката, немає ні того, ні іншого.
Перехід на непривілейований обліковий запис — окреме обмеження. Процес, який відмовився від root, може не змогти змінювати маршрути або підняти інтерфейс, навіть коли бінарник лежить поруч, тому дві несправності треба діагностувати окремо.
Яке виправлення потрібне, вирішують три умови
Перша умова — як ваша збірка встановлює маршрути. Нові OpenVPN випуски налаштовують інтерфейс і таблицю маршрутизації всередині процесу, тоді як старі пакети та власні конфігурації покладаються на зовнішні утиліти або на скрипти up і down. Якщо журнал називає команду, задіяна зовнішня утиліта, і в'язниця її приховує. Якщо журнал показує помилку прав, проблема в обліковому записі.
Друга — обслуговування. В'язницю зі скопійованими бінарниками треба оновлювати щоразу, коли оновлюється пакет, який їх постачає, інакше перше оновлення залишить по собі зламаний тунель. Третя — чи справді конкретний механізм вимагає chroot; якщо вимога насправді про розділення привілеїв, самої зміни облікового запису може бути достатньо.
| Signal in the log | Other side of the boundary | Repair direction |
|---|---|---|
| Command not found after startup | Binary and its libraries absent inside the new root | Populate the jail, or drop the chroot line |
| Operation not permitted | Account lost the privilege to edit routes | Keep the account privileged, or pre-create routes elsewhere |
| No such device | Jail lacks the tun device node | Create the node inside, or open it before the root change |
Що має містити робоча в'язниця
В'язниці, яка запускає команди, потрібен бінарник, кожна бібліотека, з якою він злінкований, і будь-який вузол пристрою, який демон відкриває пізно. Скопіюйте частини й перевірте їх без VPN у картині:
ldd /usr/sbin/ip
chroot /etc/openvpn/jail /sbin/ip route show
chroot /etc/openvpn/jail /sbin/ip link set tun0 up
Перша команда перелічує залежності, і саме її люди пропускають. Скопійований бінарник, який не знаходить бібліотеку, падає з іншим повідомленням, ніж відсутній бінарник, і обидва виглядають як збій OpenVPN, якщо дивитися з боку клієнта. Запуск команди вручну всередині в'язниці відтворює збій без перезапуску служби.
Скопіюйте у в'язницю також конфігурацію, сертифікати й будь-який CRL, бо файл, який демон розраховує перечитати після запуску, не буде знайдено після зміни кореня. Запишіть, що скопіювали, оскільки наступне оновлення мережевого пакета замінить оригінали й залишить в'язницю на старій копії.
Натомість послабте посилення
Якщо в'язниця існує лише тому, що так сказав посібник, видалити цей один рядок, зберігши обмеження облікового запису, — захищене рішення. Демон зберігає свій погляд на файлову систему й позбувається проблеми, а скидання привілеїв усе одно прибирає root у довгоживучого процесу.
Запишіть, що залишилося і чому. Конфігурація, яка тихо втратила контроль без нотатки, — це шлях дрейфу посилення, і наступний аудит запитає, чому рядок зник.
Розділіть три рядки, перш ніж обирати
Скопіюйте конфігурацію, вимкніть усі три директиви й переконайтеся, що клієнт під'єднується і з'являються очікувані маршрути. Потім увімкніть назад лише рядки облікового запису, а потім сам chroot. Крок, на якому тунель ламається, указує межу, і ви уникаєте перебудови в'язниці, яка ніколи не була причиною.
Коли маршрутизація знову працює, запустіть один сеанс клієнта з вищою докладністю і прочитайте рядок, який називає команду або відсутнє право. Цей рядок цінніший за тайм-аут, який клієнт зрештою повідомляє.