Pluggable Authentication Modules
Причины
Вход пользователя в любую систему состоит из нескольких этапов:
- аутентификация (проверка что пользователь является тем, за кого себя выдаёт);
- авторизация (проверка наличия прав на запрашиваемый ресурс);
- настройка окружения (в случает shell-доступа это, например, переменные окружения, uid, gid и список групп, в которые входит пользователь);
Эти операции выполняются для большого количества разных приложений в современных UNIX-like ОС. Вот пример таких утилит с моей рабочей станции:
- утилитами изменения параметров пользователя
- chfn
- chpasswd
- chsh
- groupadd
- groupdel
- groupmod
- useradd
- usermod
- userdel
- user-group-mod
- а также
- crond
- cups
- ftp
- *dm (gdm/wdm/xdm)
- halt
- imap
- kbdrate
- login
- passwd
- popa3d
- poweroff
- ppp
- reboot
- samba
- sshd
- su
- sudo
- synaptic
- vlock
- vsftpd
- xscreensaver
- xserver
Дублировать один и тот же код сразу в группе утилит (например в su, login, sshd авторизация/аутентификация производится идентичным образом) это во-первых хороший способ сделать море ошибок, а во-вторых просто море удовольствия при попытке сменить систему авторизации (например при желании использовать LDAP).
Для того, чтобы решить эту проблему раз и навсегда была создана технология и сопутствующая инфраструктура PAM (Pluggable Authentication Modules).
Как это работает?
Основа
В /lib/security располагается код самих подгружаемых модулей (pam_*.so). В /etc/pam.d располагаются файлы-сценарии для испоьлзования PAM из конкретных программ. Имя файла-сценария совпадает с именем программы, его использующей
Формат строки сценария:
<тип модуля> <флаг контроля> <имя модуля> <параметры>
Тип модуля:
- auth — собственно аутентификация пользователя
- account — настройки прав доступа
- session — настройки пользовательской сессии
- password — проверка паролей
Флаг контроля указывает системе как обрабатывать удачное или неудачное завершение модуля:
- required — завершение с ошибкой модуля запрещает доступ пользователю, однако остальные модули будут обработаны
- requisite — завершение с ошибкой модуля запрещает доступ пользователю, последовательность выполнения модулей будет остановлена
- sufficient — удачное завершение этого модуля означат разрешение доступа пользователя
- optional — результат выполнения модуля не сказывается на результате аутентификации, используется как дополнительный. Удобен для выдачи предупреждений, а также для дополнительных настроек (например модуль pam_mktemp я предпочитаю использовать именно с этим флагом контроля)
Аутентификация
Авторизация
Настройка