Отладка PAM
PAM - Pluggable Authentication Modules
Когда «не пускает», самое бесполезное — гадать. PAM сам рассказывает, кто отказал: нужно только включить подробный вывод и знать, где смотреть.
Где смотреть журнал
# всё, что касается PAM, за последнее время
$ journalctl -n 200 --no-pager | grep -i pam
# журнал конкретной службы
$ journalctl -u gdm -n 50 --no-pager
$ journalctl -u ssh -n 50 --no-pager
# если в системе есть классический журнал аутентификации
$ sudo tail -n 50 /var/log/auth.log
На Debian и Ubuntu /var/log/auth.log ведёт rsyslog; если его нет (чистая systemd-система без rsyslog), все сообщения всё равно есть в журнале systemd.
Строка модуля читается по частям:
pam_unix(login:auth): authentication failure; logname= uid=0 tty=/dev/tty1 user=user
└ служба ┘└тип┘
Служба и тип — главное в этой строке: они сразу говорят, в каком файле искать (login → /etc/pam.d/login) и на каком шаге оборвалось (auth — проверка пароля, account — учётная запись, session — открытие сессии).
Подробный вывод: аргумент debug
Модули PAM умеют писать больше, если добавить им аргумент debug. Правка в файле службы:
auth required pam_unix.so debug
После этого модуль печатает в журнал каждый шаг. Включать стоит на одном модуле, а не во всей цепочке: иначе в выводе утонешь.
Есть и более общий инструмент — модуль pam_debug. Поставленный в начало цепочки, он одним сообщением печатает весь собранный стек: какие модули и с какими аргументами увидела программа. Удобно, когда подозреваешь, что @include собрал не то, что вы ожидали:
auth optional pam_debug.so
Проверка без входа в систему
Если в репозитории доступен пакет pamtester, он позволяет проверить цепочку, не выходя из своей сессии:
$ sudo apt install pamtester # пакет есть не во всех выпусках
$ pamtester login user authenticate
Пакет есть не везде — если его нет, отлаживают по журналу: он для этого вполне достаточен.
Частые сообщения и что они значат
| Сообщение | Что случилось |
|---|---|
authentication failure |
Модуль auth не подтвердил пароль: не тот пароль, нет пользователя или источник недоступен |
user unknown |
Пользователь не найден там, где его искали (нет в /etc/passwd, нет в домене) |
Module is unknown |
В строке указан модуль, которого нет. Опечатка в имени или не установлен пакет |
PAM unable to dlopen(...) |
Модуль есть в конфиге, но файла нет по указанному пути |
pam_unix(...): authentication failure при верном пароле |
Чаще всего истёк срок действия пароля (account) или учётной записи нет в /etc/shadow |
conversation failed |
Модуль не смог задать вопрос пользователю: не хватает терминала (su без tty, запуск из скрипта) |
Permission denied при работе pam_unix |
Программа запущена не от root и не смогла прочитать /etc/shadow |
account is locked / expired |
Сработал pam_faillock или истёк срок учётной записи |
Порядок разбора
- Определить службу. Что именно не пускает:
login,gdm-password,sshd,su? Служба видна в журнале, а файл службы — в/etc/pam.d/<имя>. - Найти тип. Отказ на
auth— не то же самое, что наaccount. Первое — «не тот человек», второе — «человек тот, но сейчас нельзя». - Пройти цепочку глазами, включая всё, что подключено через
@include. - Включить
debugна подозреваемом модуле и повторить попытку. - Проверить руками то, что проверяет модуль: есть ли пользователь (
getent passwd), читается ли источник (ldapsearch,realm discover), цел ли файл (ls -l /etc/shadow).
Осторожно: легко запереть себя снаружи
Правка PAM может закрыть вход всем, включая root. Поэтому:
- не редактировать единственный рабочий вход. Открыть вторую сессию (терминал
Ctrl+Alt+F3, или SSH, илиscreen/tmux) и править из неё: если правило окажется нерабочим, старая сессия останется; - сохранить копию файла перед правкой:
sudo cp -a /etc/pam.d/login /etc/pam.d/login.bak; - проверять конфиг сразу — открыть новый вход и убедиться, что он работает, до того как закрыть старый;
- на Debian и Ubuntu не править
common-*руками. Эти файлы собираетpam-auth-updateиз профилей пакетов, и он может вернуть своё. Свою проверку добавляют отдельным правилом в файл службы, а общие настройки меняют черезpam-auth-update.
Если вход всё-таки потерян, выручает rescue.target из загрузчика: там PAM для обычного входа не участвует.
Источники
man 8 pam_debug,man 8 pam_unix(аргументdebug),man 8 pam-auth-update.man 1 pamtester— при наличии пакета.- Виды сообщений и раскладка файлов — по журналам и содержимому
/etc/pam.d/рабочей системы (Ubuntu 26.04).
Что ещё не проверено
- Сообщения из таблицы приведены по документации модулей и типичным записям журнала; отдельного стенда с намеренно сломанным стеком мы не собирали.
- Пакет
pamtesterв проверенном выпуске (Ubuntu 26.04) в доступных репозиториях не нашёлся — проверка делалась черезapt-cache policy. На других выпусках он есть.
Комментарии
Пока комментариев нет.