Отладка 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 или истёк срок учётной записи

Порядок разбора

  1. Определить службу. Что именно не пускает: login, gdm-password, sshd, su? Служба видна в журнале, а файл службы — в /etc/pam.d/<имя>.
  2. Найти тип. Отказ на auth — не то же самое, что на account. Первое — «не тот человек», второе — «человек тот, но сейчас нельзя».
  3. Пройти цепочку глазами, включая всё, что подключено через @include.
  4. Включить debug на подозреваемом модуле и повторить попытку.
  5. Проверить руками то, что проверяет модуль: есть ли пользователь (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. На других выпусках он есть.
Оценка статьи 0

Комментарии

Пока комментариев нет.