Два склеенных рецепта минимальных привилегий не дают более строгого развёртывания. Одна модель позволяет демону стартовать с привилегиями и после инициализации переходить на непривилегированную учётную запись; другая заставляет менеджер служб запускать его с ограниченной идентичностью уже с первой инструкции. Каждый работает сам по себе, а сочетание часто даёт службу, которая не может чисто выполнить ни одну из двух задач. Дальше решение разбирается по порядку.

Две модели, один владелец переключения

Первая модель принадлежит демону. Параметры OpenVPN из сборки сообщества user и group меняют идентичность после настройки туннеля и ключей, а persist-key вместе с persist-tun сохраняют эти ресурсы пригодными к использованию после этого.

Вторая модель принадлежит менеджеру служб. Настройка systemd User= или Group= определяет идентичность, под которой стартует процесс, а директивы возможностей определяют, что он может удерживать. Выбор между моделями — вопрос упаковки прежде, чем вопрос безопасности, и сопровождающий пакета уже на него ответил. Ваша задача — найти этот ответ, а не изобрести третий вариант.

Обе легитимны. Ошибка — относиться к ним как к слоям одного проекта, потому что вторая модель может сделать смену идентичности первой операцией, которую процессу больше не разрешено выполнять.

Решите, где меняется идентичность

Если юнит уже стартует как отдельная учётная запись, инструкция демону стать другой учётной записью требует перехода setuid, который усиленная служба никогда не должна была выполнять. Сбой выглядит как ошибка прав при запуске, а не как ясное сообщение политики. Это читается как отсутствующая возможность, что толкает людей к более широкому набору ограничений вместо вопроса об идентичности.

Прочитайте, что на самом деле поставляет установленный пакет, прежде чем что-либо править, включая его каталог drop-in. Некоторые юниты намеренно опускают собственный сброс демона, потому что менеджер уже занимается этим, а некоторые полагаются на эти параметры для переключения после инициализации. Удаление любого из них без знания того, какая модель вам досталась, — это путь, которым работающая служба перестаёт запускаться.

Запишите выбранную модель одной строкой: принадлежит менеджеру или демону. Каждая последующая директива должна соответствовать этой фразе, а смешанный юнит следует считать ошибкой, а не компромиссом.

Возможности — это границы, а не дар

Набор ограничений возможностей говорит, что процесс может удерживать максимум. Это потолок, и перечисление возможности там само по себе ничего не даёт, поэтому юнит с щедрым набором ограничений всё равно может не суметь создать туннель.

То, что действительно помещает возможность в окружающий набор службы, — это AmbientCapabilities=. справочник по выполнению systemd документирует эти две директивы отдельно, и это различие объясняет большую часть путаных советов о возможностях в интернете.

Добавляйте возможность только после того, как сбойная операция её определила. Более широкий набор ограничений скрывает настоящую причину и оставляет службу с большими правами, чем задумывал проект. Он также усложняет проверку юнита, потому что потолок больше не описывает работу. Уберите лишнюю возможность, когда настоящая неисправность исправлена.

Распределите полномочия на жизненный цикл

Перечислите, что процесс должен делать на каждом этапе: запуск, устойчивое состояние, повторная аутентификация и демонтаж. Создание интерфейса, изменения маршрутов, чтение защищённого ключа и вызов помощника происходят не все в один момент и не при одних и тех же требованиях. Отсортируйте список по этапу, прежде чем сортировать его по возможности.

Параметры сохранения сохраняют ресурсы между пересогласованиями и не дают прав, которых никогда не было. Ключ, который процесс не может прочитать при запуске, останется нечитаемым и позже, что бы ни говорили флаги сохранения. Флаги сохраняют то, что уже работало.

Используйте отдельную учётную запись, а не общую. Разработчики OpenVPN предупреждают против привычки использовать nobody как общий пример, потому что другие службы на хосте могут уже работать под этой учётной записью, и изоляции, которую вы думаете, что имеете, там нет.

Функции, меняющие локальную нагрузку, например разгрузка канала данных или сборка с другим связыванием, могут сдвинуть, какие операции нужны. Пересматривайте карту при изменении пакета, а не только когда что-то ломается.

Запишите план и сохраните доступ для восстановления

Запись о развёртывании должна называть менеджер, стартовую идентичность, предполагаемую устойчивую идентичность и каждое разрешение вместе с операцией, которая его требует. Именно эта запись делает следующее изменение проверяемым, а не экспериментальным.

Держите доступ к консоли, пока редактируете, потому что юнит, падающий при запуске, трудно чинить удалённо. Проверьте перезапуск и полную перезагрузку, прежде чем объявить изменение завершённым. Юнит, переживший перезапуск, всё равно может отказать до поднятия сети.

Успех — это понятный жизненный цикл с минимальными полномочиями, а не процесс, который случайно работает под именем, отличным от root.

Похожие статьи