Ограничить входы OpenVPN одной группой с помощью политики PAM
Отдельная служба PAM может допускать только членов группы VPN, не затрагивая системные правила входа. Направьте на неё плагин auth-pam и проверьте результаты.
Оставьте каждому аккаунту возможность входить как обычно, но разрешите использовать VPN только одной группе. PAM может выразить это различие без второго хранилища паролей, а плагин OpenVPN можно направить на службу, которая содержит только нужные вам проверки. Хитрость в том, чтобы построить эту службу, случайно не унаследовав системный стек.
Этот разбор начинается с имени службы плагина, строит политику, а затем проверяет три важных исхода: участника, постороннего с верным паролем и неверные учётные данные.
Зачем отдельная служба PAM
Плагин auth-pam принимает имя службы как аргумент. Это имя выбирает файл в /etc/pam.d, и именно стек из этого файла выполняется при входе через VPN. Если передать то же имя, которое использует системный вход, вы унаследуете каждое решение из этого стека, включая добавленные позже по не связанным причинам.
Вместо этого создайте отдельную службу. Начните с рабочего стека, который уже аутентифицирует через нужный backend, например локальный файл паролей, SSSD или службу каталога, затем добавьте правило допустимости. Копирование двух строк в пустой файл — распространённая ошибка: срок действия пароля, блокировка аккаунта и другие проверки могут находиться в стеке, который вы не скопировали.
Отделение службы также ограничивает масштаб ущерба. Правило только для VPN в общем стеке может запретить доступ по SSH или через консоль всем, что превращает изменение доступа в сбой.
Написание правила группы
Проверка допустимости относится к фазе аккаунта, после проверки учётных данных. Правило вида account required pam_succeed_if.so user ingroup vpnusers позволяет обработке продолжаться только тогда, когда аутентифицированный пользователь является членом этой группы.
Эта строка — фрагмент, а не полная служба. Встройте её туда, куда доходит каждый допустимый путь, и проверьте управляющие флаги вокруг неё. Управление sufficient или переход выше в стеке может завершить обработку до того, как сработает ваше правило, и тогда ограничение превращается в пожелание.
Не добавляйте use_uid по привычке. Без него модуль оценивает пользователя, который аутентифицируется; с ним модуль оценивает аккаунт, под которым работает процесс OpenVPN, а это обычно root или служебный аккаунт и поэтому не тот человек, который входит.
Членство в группе берётся из разрешения идентичности системы, а не из знакомого вам имени. Для пользователей каталога убедитесь, что тот же backend отвечает на групповые запросы для этого пользователя, поскольку локальная группа со знакомым именем — другой объект, чем группа каталога с тем же именем.
Ловушки порядка и идентичности
Разместите правило группы после стека аутентификации и после каждой проверки, которая всё ещё должна действовать, но до или рядом с проверками аккаунта, которые вы сохраняете. PAM оценивает модули в порядке файла, и управляющее значение в каждой строке решает, является ли сбой окончательным.
Следите за дублирующимися стеками. Частый шаблон — include, который уже содержит правило аккаунта, а за ним ваше собственное правило группы, что даёт два решения там, где вы ожидали одно. Читайте включённый файл, а не только тот, который редактировали. Быстрый способ увидеть фактический порядок — читать файл сверху вниз и записывать каждое управляющее значение.
Сохраните остальные требования допуска нетронутыми. Успешный пароль не заменяет проверки сертификата, второй фактор или авторизацию после подключения, и эта политика не заменяет ни одно из них. Она лишь решает, может ли аккаунт рассматриваться для доступа к VPN.
Проверка участников, посторонних и неверных паролей
Проверьте три случая, прежде чем считать политику готовой. Участник успешно подключается. Действительный аккаунт вне группы подтверждает свой пароль, но получает отказ в доступе к VPN. Неверный пароль для любого из аккаунтов отклоняется на этапе аутентификации, а не правилом группы.
Смотрите на ошибку, видимую клиенту, и журнал сервера вместе, потому что оба отказа могут выглядеть одинаково для подключающегося человека. Различие важно для поддержки: постороннему с правильным паролем нужно изменить группу, а неверный пароль требует сброса учётных данных.
Держите вторую сессию открытой, пока правите PAM, и после изменения проверьте также обычный вход по SSH. Смысл отдельной службы в том, что системный вход должен остаться незатронутым, и единственный способ это узнать — проверить.
Если что-то сломалось, восстановите предыдущий файл службы из копии. Нужное правило легко сформулировать: членство делает аккаунт допустимым для доступа к VPN, и все остальные обязательные проверки по-прежнему действуют.