PAM, или Pluggable Authentication Modules, — слой между программой и механизмом проверки подлинности. sshd, login, sudo, su и экранный менеджер не реализуют пароли сами: они вызывают библиотеку PAM, а та проходит по стеку модулей. Понимание этого стека позволяет централизованно включить блокировку после неудачных попыток, политику паролей и аудит входа. Ниже — практическая настройка для собственных систем и безопасная проверка без риска потерять доступ.
Как работает стек PAM
Конфигурация лежит в /etc/pam.d/, отдельный файл на службу. Каждая строка содержит тип, управляющий флаг, модуль и его аргументы. Типов четыре: auth проверяет подлинность, account — право на вход, password — смену пароля, session — действия после входа.
Флаги определяют поведение при успехе и отказе. required продолжает проверку, но запоминает ошибку; requisite немедленно прекращает стек; sufficient при успехе пропускает оставшиеся модули; optional не влияет на результат. Порядок строк критичен: pam_faillock должен стоять до и после pam_unix, иначе счётчик не сработает.
# /etc/pam.d/sshd — фрагмент, не копировать целиком
auth requisite pam_faillock.so preauth silent
auth [success=1 default=ignore] pam_unix.so try_first_pass
auth [default=die] pam_faillock.so authfail
auth sufficient pam_faillock.so authsucc
account required pam_faillock.so
account required pam_unix.so
password requisite pam_pwquality.so retry=3
session required pam_unix.so
Разбирать стек удобно по потоку: preauth проверяет, не заблокирован ли пользователь; pam_unix сверяет пароль; при успехе управляющий переход пропускает authfail и вызывает authsucc, который сбрасывает счётчик; при ошибке authfail увеличивает его и завершает проверку. Флаг silent убирает сообщение о блокировке, чтобы не подсказывать злоумышленнику, существует ли учётная запись.
Где менять конфигурацию
В Debian и Ubuntu не редактируйте /etc/pam.d/common-auth и common-account вручную. Эти файлы собирает pam-auth-update из профилей в /usr/share/pam-configs/. Ручная правка помечает файлы как локально изменённые, и следующее обновление пакета может её перезаписать или проигнорировать. В Ubuntu готовых профилей для faillock нет: создайте профили в /usr/share/pam-configs/ и включите их через pam-auth-update.
В RHEL, Rocky Linux и AlmaLinux используется authselect. Файлы system-auth и password-auth — символические ссылки в /etc/authselect, поэтому правка через редактор теряется при следующем применении профиля. Проверяйте состояние командой authselect current, а изменения вносите включением возможностей профиля.
sudo authselect select local with-faillock --force
sudo authselect apply-changes
authselect current
grep faillock /etc/pam.d/system-auth
Профиль local подходит для локальных учётных записей; в домене выбирайте sssd. Возможность with-faillock добавляет три вызова модуля и читает настройки из /etc/security/faillock.conf. Не добавляйте without-nullok вслепую: сначала проверьте, не используются ли пустые пароли в вашей среде.
Блокировка после неудачных попыток
Модуль pam_faillock считает неудачные попытки в пределах интервала и блокирует вход на заданное время. Настройки вынесены в отдельный файл, поэтому менять стек при каждой корректировке не нужно.
# /etc/security/faillock.conf
deny = 5
fail_interval = 900
unlock_time = 900
# even_deny_root — только если у root есть пароль и это осознанное решение
Значения означают: пять неудач за 15 минут, блокировка на 15 минут. Счётчики хранятся в /run/faillock и очищаются при перезагрузке. Вход по SSH-ключу не проходит проверку пароля и не учитывается, поэтому блокировка не защищает от ключа, но и не мешает легитимному администрированию. Помните, что чужой человек, зная имя учётной записи, может намеренно заблокировать её на время — для сервисных и общих учётных записей политику стоит ослабить или исключить их.
Политика паролей
За качество пароля отвечает pam_pwquality. Он проверяет длину, классы символов, повторы и словарные слова. Настройки читаются из /etc/security/pwquality.conf; параметры в стеке PAM могут их переопределять.
# /etc/security/pwquality.conf
minlen = 12
minclass = 3
maxrepeat = 2
maxclassrepeat = 3
dictcheck = 1
usercheck = 1
minclass = 3 требует три класса символов, maxrepeat = 2 запрещает длинные повторы, dictcheck отсекает словарные пароли, а usercheck — пароли, содержащие имя пользователя. Для служебных учётных записей с длинными случайными паролями эти ограничения обычно не мешают. Не ставьте minlen больше 16 без необходимости: пользователи начнут записывать пароли на бумаге, и безопасность упадёт.
Включение и проверка без блокировки
Перед изменением PAM откройте второй терминал с активной сессией root или подготовьте доступ к консоли виртуальной машины. Если стек собран с ошибкой, вы можете потерять и SSH, и sudo. На production сначала проверьте конфигурацию на копии или в снимке VM.
sudo apt install pamtester
pamtester login alice authenticate
pamtester sshd alice authenticate
sudo faillock --user alice
sudo faillock --user alice --reset
pamtester прогоняет выбранную службу и пользователя через реальный стек, не открывая новый сеанс. Если проверка проходит, можно закрывать текущую сессию. Команда faillock --user показывает счётчик и время последней неудачи, а --reset снимает блокировку после разбора инцидента. В RHEL и производных pamtester может отсутствовать — тогда используйте одноразового пользователя и отдельный SSH-порт.
Диагностика и типичные ошибки
- правка
common-authилиsystem-authвручную — изменения теряются при обновлении; pam_faillockстоит послеpam_unix— счётчик не видит неудачу;requisiteвместоrequiredв неподходящем месте — стек обрывается раньше времени;- блокировка сервисной учётной записи — автоматизация перестаёт работать;
- нет резервного доступа — единственная ошибка закрывает вход всем;
- использование устаревшего
pam_tally2вместоpam_faillock.
Логи смотрите через journalctl -u ssh на Ubuntu или journalctl -u sshd на RHEL. Сообщения вида «authentication failure» и «account locked» показывают, какой модуль отказал. Не включайте отладочный вывод PAM на постоянной основе: в журнал могут попасть лишние данные.
Чек-лист
- Сделайте снимок VM или резервную копию конфигурации.
- Оставьте открытую сессию root и доступ к консоли.
- Меняйте стек только через
pam-auth-updateилиauthselect. - Проверьте вход через
pamtesterдо выхода из сессии. - Настройте мониторинг блокировок и очистку счётчиков.
- Задокументируйте откат: какие файлы и команды вернут исходное состояние.
Итог
PAM кажется сложным только до первого разбора стека. Достаточно запомнить четыре типа модулей, порядок строк и правило «не редактировать сгенерированные файлы вручную». Связка pam_faillock и pam_pwquality закрывает базовые риски подбора пароля, а pamtester и вторая root-сессия позволяют проверить изменения без аварии. Главное — относиться к PAM как к части периметра: сначала резервный доступ, потом политика, и только затем блокировка.