OpenVPN PAM: аргумент login — это служба, а не пользователь
Слово после пути к плагину auth-pam выбирает стек PAM. Прочитайте этот стек, найдите источник учётных записей, а затем проверьте его с помощью pamtester, прежде чем править профили.
Пользователя добавили на сервере, пароль ввели правильно, а соединение всё равно завершается с AUTH_FAILED. Обычно причину объясняет строка плагина: слово после пути к плагину — это имя службы PAM, и именно оно определяет, какой набор модулей отвечает на запрос. Это не имя пользователя и не ссылка на файл с паролями, который OpenVPN читает сам.
Что выбирает второе слово
Строка конфигурации принимает путь к плагину и один аргумент:
plugin /usr/lib/openvpn/plugins/openvpn-plugin-auth-pam.so openvpnЭтот аргумент передаётся библиотеке PAM как имя службы, поэтому запускается набор из /etc/pam.d/openvpn. Напишите там login, и вместо него будет действовать политика интерактивного входа со всеми модулями, которые она включает в вашем дистрибутиве.
Используйте путь к плагину из установленного пакета, а не путь, скопированный с другого хоста. Имя файла и каталог различаются между дистрибутивами, и неверный путь приводит к ошибке загрузки плагина при запуске, а не при аутентификации.
Откуда набор на самом деле берёт учётные записи
PAM — это диспетчер. Файл службы перечисляет модули по порядку, и первый, кто может ответить, решает исход. Набор с pam_unix читает локальные учётные записи; набор с модулем LDAP или RADIUS отправляет учётные данные совсем в другое место.
Прочитайте файл, в который разрешается имя службы, включая всё, что он подключает:
cat /etc/pam.d/openvpn
grep -H pam_ /etc/pam.d/openvpn /etc/pam.d/common-authЕсли набор передаёт решение каталогу, добавление локальной учётной записи ничего не меняет. Если он читает локальные учётные записи, создание пользователя в каталоге тоже ничего не меняет. Учётная запись должна существовать там, где ищет набор, и именно в этом состоит весь диагноз в большинстве таких отчётов.
Одна попытка, два журнала
Проследите одно неудачное соединение по обеим сторонам. Журнал OpenVPN показывает результат работы плагина и отказ клиента; системный журнал аутентификации показывает, какой модуль запускался и что он решил. Чтение их в одном временном окне — то, что отличает отсутствующий файл службы от тайм-аута серверной части. Пробел в журнале аутентификации означает, что до набора дело не дошло вовсе.
journalctl -u openvpn-server@server --since "-2 min"
journalctl -t sshd -t sudo --since "-2 min"Проверьте службу напрямую утилитой, которая говорит на языке PAM, чтобы не отлаживать одновременно VPN и набор. Успешная прямая проверка с тем же именем службы и той же учётной записью сводит проблему к тому, как демон передаёт учётные данные, а не к самой учётной записи.
pamtester openvpn alice authenticateЕсли прямая проверка не проходит с теми же учётными данными, которые работают в консоли, набор читает не тот источник учётных записей, который вы предполагали. Если она проходит, посмотрите на диалог, который ведёт плагин, и на то, что клиент действительно отправил. Запустите её ещё раз с заведомо неверным паролем, чтобы увидеть разницу между отказом и ошибкой модуля. Эти два исхода выглядят одинаково в журнале VPN и совершенно по-разному здесь.
Отдельная служба лучше, чем правка login
Дайте VPN собственный файл службы, если её требования отличаются от интерактивного входа, а обычно они отличаются. Правка login или common-auth меняет политику для каждой программы, которая их подключает, и следующий человек, разбирающий не связанную с этим проблему входа, унаследует ваше изменение.
Скопируйте нужные модули в небольшой файл службы, сохраните явный порядок и отметьте, кто за него отвечает. Именно этот файл нужно проверять, когда сброс пароля, кажется, не даёт эффекта.
Что клиент отправляет, а что нет
Клиент передаёт имя пользователя и пароль через поддерживаемое приглашение или файл. Серверный плагин передаёт эти значения в диалог PAM; он не читает их из конфигурации сервера. Строка на стороне сервера, которая выглядит как задание пароля, этого не делает, и никакая правка профиля не создаст учётную запись.
Имя пользователя и пароль могут сосуществовать с клиентскими сертификатами, и включение PAM не повод перестать проверять сертификаты. Сохраните уровни, которые задумала эксплуатация, и исправьте только источник учётных записей.
Проверка проходит в обе стороны: нужная учётная запись входит успешно, а учётная запись, которую следует отклонить, по-прежнему получает отказ. README плагина auth-pam описывает аргумент службы и серверные части, которые он может обслуживать, и именно там стоит подтвердить схему, которую вы пытаетесь построить.