Вход пользователя в любую систему состоит из нескольких этапов:
аутентификация (проверка что пользователь является тем, за кого себя выдаёт);
авторизация (проверка наличия прав на запрашиваемый ресурс);
настройка окружения (в случает shell-доступа это, например, переменные окружения, uid, gid и список групп, в которые входит пользователь);
Эти операции выполняются для большого количества разных приложений в современных UNIX-like ОС. Это во-первых известное всем приложение login, авторизующее, в основном, локальных пользователей. Это sshd, а также некоторые другие демоны (некоторые реализации ftp, к примеру, умеют использовать PAM). Это утилиты passwd, утилиты изменения параметров пользователя (usermod/chfn/chsh). Это xdm/gdm/wdm. Это cron (ему это нужно, в первую очередь, чтобы правильно выставлять переменные окружения и лимиты для запускаемых процессов пользователя). Утилиты запуска процессов от другого пользователя su и sudo.
Дублировать один и тот же код сразу в группе утилит (например в su, login, sshd авторизация/аутентификация производится идентичным образом) это во-первых хороший способ сделать море ошибок, а во-вторых просто море удовольствия при попытке сменить систему авторизации (например при желании использовать LDAP).
Для того, чтобы решить эту проблему раз и навсегда была создана технология и сопутствующая инфраструктура PAM (Pluggable Authentication Modules).
Как это работает?
Основа
В /lib/security располагается код самих подгружаемых модулей (pam_*.so). В /etc/pam.d располагаются файлы-сценарии для испоьлзования PAM из конкретных программ. Имя файла-сценария совпадает с именем программы, его использующей
Флаг контроля указывает системе как обрабатывать удачное или неудачное завершение модуля:
required -- завершение с ошибкой модуля запрещает доступ пользователю, однако остальные модули будут обработаны
requisite -- завершение с ошибкой модуля запрещает доступ пользователю, последовательность выполнения модулей будет остановлена
sufficient -- удачное завершение этого модуля означат разрешение доступа пользователя
- optional -- результат выполнения модуля не сказывается на результате аутентификации, используется как дополнительный. Удобен для выдачи предупреждений, а также для дополнительных настроек (например модуль pam_mktemp я предпочитаю использовать именно с этим флагом контроля)
Также в /etc/security находятся конфигурационные файлы, используемые некоторыми мо
Резюме
Подсистема PAM это мощное и эффективное средство для удобства и реализации функциональности любой сложности для процесса аутентификации и авторизаии пользователя. Знание принципов её работы необходимо для любого системного администратора Linux и FreeBSD.