Стоит ли отказаться от 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. Шаг, на котором туннель ломается, указывает границу, и вы избегаете пересборки тюрьмы, которая никогда не была причиной.
Когда маршрутизация снова работает, запустите один сеанс клиента с повышенной подробностью и прочитайте строку, называющую команду или отсутствующее право. Эта строка ценнее тайм-аута, который клиент в итоге сообщает.