PAM (Pluggable Authentication Modules, подключаемые модули аутентификации) – это набор библиотек для Linux и Unix-подобных операционных систем, предназначенный для настройки аутентификации между различными приложениями.
Данное руководство научит настраивать авторизацию на сервере при помощи PAM.
Примечание: Руководство выполнено на сервере Ubuntu 12.04, но более новые версии системы будут работать аналогичным образом.
Краткий обзор PAM
Как работают подключаемые модули?
Многие популярные приложения, с которыми вы ежедневно сталкиваетесь в среде Linux, на самом деле используют PAM.
Приложение должно быть написано с поддержкой библиотеки PAM. Чтобы получить список приложений системы, которые поддерживают PAM, введите:
ldd /{,usr/}{bin,sbin}/* | grep -B 5 libpam | grep '^/'
/bin/login:
/bin/su:
/sbin/mkhomedir_helper:
/sbin/pam_tally2:
/usr/bin/chfn:
/usr/bin/chsh:
/usr/bin/passwd:
/usr/sbin/atd:
/usr/sbin/chpasswd:
/usr/sbin/cron:
/usr/sbin/newusers:
/usr/sbin/sshd:
Чтобы узнать, поддерживает ли PAM какое-либо конкретное приложение, введите:
ldd $(which prog_name) | grep libpam
Если команда не вернула ничего, то такое приложение не поддерживает PAM.
Как устроена библиотека PAM?
В Linux PAM делит модули на различные категории в зависимости от того, в какой части процесса они участвуют:
- Модули аутентификации (Authentication): модули аутентификации проверяют валидность учетных данных пользователя.
- Модули аккаунтов (Account) : эти модули решают, имеет ли учетная запись, которая пытается войти в систему, доступ к запрашиваемым ресурсам.
- Модули сеансов (Session): эти модули устанавливают окружение для работы пользователя, который проходит аутентификацию. Файлы сессий позволяют определить команды, которые нужно запустить для подготовки среды.
- Модули паролей (Password): такие модули отвечают за обновление учётных данных. Если сервис должен обновить пароль, этот модуль свяжется с ним и внесёт соответствующие изменения в данные.
Модули первых двух категорий используются каждый раз, когда программа успешно аутентифицируется с помощью PAM. Модули сеансов запускаются только после первых двух категорий. Модули паролей доступны по запросу.
Конфигурационные файлы PAM хранятся в каталоге /etc/pam.d:
ls /etc/pam.d
atd chsh common-password cron other su
chfn common-account common-session login passwd sudo
chpasswd common-auth common-session-noninteractive newusers sshd
Этот каталог содержит конфигурационные файлы для каждого приложения, которое использует аутентификацию PAM. Если приложение вызывает PAM, но у него нет конфигурационного файла, PAM использует конфигурационный файл other.
Модули, на которые ссылаются конфигурационные файлы, можно просмотреть с помощью этой команды:
ls /lib/*/security
pam_access.so pam_keyinit.so pam_permit.so pam_tally.so
pam_debug.so pam_lastlog.so pam_pwhistory.so pam_time.so
pam_deny.so pam_limits.so pam_rhosts.so pam_timestamp.so
pam_echo.so pam_listfile.so pam_rootok.so pam_umask.so
. . .
Просмотрите содержимое этого каталога, чтобы ознакомиться с доступными модулями. В мануале можно найти информацию почти о каждом модуле.
Как происходит аутентификация PAM?
Когда приложение запрашивает аутентификацию, PAM считывает соответствующий конфигурационный файл.
Конфигурационные файлы содержат списки модулей PAM и методы их обработки. Модули вызываются по очереди. Каждый вызов модуля генерирует успешный результат или отказ.
Исходя из этих значений, конфигурационный файл возвращает либо сообщение об успешной аутентификации (authentication okay), либо сообщение об ошибке (authentication failure).
Файлы читаются сверху вниз.
Политика PAM
Каждая строка в файле конфигурации использует следующий синтаксис (поля разделены пробелами).
[service] type control module-path [module-arguments]
Файлы в каталоге /etc/pam.d исключают поле service, вместо него они используют название приложения. Если каталога pam.d не существует, используется файл /etc/pam.conf.
Type задаёт вид сервиса. Здесь нужно указать категорию (authentication, account, password, session).
Control указывает свойство модуля (действие, которое нужно выполнить после вызова модуля). Вот список доступных свойств:
- required: такие модули должны вернуть положительный ответ. Если результат вызова модуля возвращает отрицательный ответ, это приведет к ошибке аутентификации. Запрос будет сброшен, но остальные модули будут вызваны.
- requisite: Аналог required, который, однако, сразу же приводит к сбою аутентификации и игнорирует остальные модули.
- sufficient: если перед таким модулем ни один из модулей required или sufficient не вернул отрицательного результата, то модуль вернёт положительный ответ. Оставшиеся модули будут проигнорированы.
- optional: если в стеке нет модулей required и ни один из модулей sufficient не вернул положительного результата, то хотя бы один из модулей optional должен вернуть положительный ответ.
- include: позволяет добавлять строки из других сценариев конфигурации; часто используется для ссылки на файлы common-.
Module-path – это путь к вызываемому модулю.
Module-arguments – опциональные параметры модуля. Иногда они необходимы, чтобы определить действия модуля в случае положительного ответа.
Файлы могут ссылаться на другие файлы, которые нужно проверить. Для этого существует такой синтаксис:
@include config_file
Эта команда перечитывает целый конфигурационный файл.
Примечание: Не путайте эту команду со свойством модуля include.
Примеры настроек
В каталоге /etc/pam.d можно ознакомиться с примерами настроек.
Откройте файл, описывающий требования аутентификации планировщика atd.
less /etc/pam.d/atd
auth required pam_env.so
@include common-auth
@include common-account
@include common-session-noninteractive
session required pam_limits.so
Первая строка вызывает модуль pam_env, который используется для установки переменных среды, хранящихся в /etc/security/pamenv.conf по умолчанию. Свойство required значит, что в случае отрицательного ответа возникнет ошибка аутентификации, но такого произойти не должно.
Следующие строки читают файлы common-auth, common-account и common-session-noninteractive.
Последняя строка вызывает модуль pam_limits, который проверяет файл /etc/security/limits.conf или каталог /etc/security/limits.d/. Этот модуль позволяет устанавливать ограничения на количество пользователей, которые могут одновременно использовать сервис.
Файл common-auth
Примечание: Закомментированные строки опущены ради удобства.
less /etc/pam.d/common-auth
auth [success=1 default=ignore] pam_unix.so nullok_secure
auth requisite pam_deny.so
auth required pam_permit.so
auth optional pam_ecryptfs.so unwrap
Обратите внимание на первую строку. Она вызывает модуль pam_unix, который выполняет стандартную аутентификацию unix с помощью файла etc/nsswitch.conf. как правило, он просто проверяет файлы /etc/passwd и /etc/shadow.
Аргумент nullok_secure разрешает доступ аккаунтам без паролей, если учётные данные можно проверить в файле /etc/securetty. Свойство [success=1 default=ignore] – самая сложная часть этой строки. Как видите, PAM предоставляет возможности тонкой настройки свойств. В данном случае, если модуль вернёт положительный ответ, то одна следующая строка будет пропущена.
Свойство второй строки – requisite. Это значит, что в случае отрицательного ответа возникнет ошибка авторизации, а все оставшиеся модули будут проигнорированы. Строка вызывает модуль pam_deny, который блокирует все модули PAM.
Третья строка имеет свойство required и вызывает модуль pam_permit, который всегда возвращает положительный ответ.
Четвёртая строка опциональна, она вызывает модуль pam_ecryptfs с опцией unwrap, которая может развернуть ключевую фразу с помощью прилагаемого пароля, что в дальнейшем будет использоваться для монтирования частного каталога. Это работает только в контексте данной конфигурации, поэтому эта строка опциональна.
Файл common-account
Рассмотрим ещё один файл конфигурации atd.
Примечание: Закомментированные строки опущены для удобства.
less /etc/pam.d/common-account
account [success=1 new_authtok_reqd=done default=ignore] pam_unix.so
account requisite pam_deny.so
account requisite pam_permit.so
Как видите, этот файл очень похож на common-auth. Первая строка проверяет аккаунт при помощи модуля pam_unix.
Модули могут выполнять разные функции в зависимости от типа их вызова. Например, вызванный модулем аккаунтов pam_unix проверяет срок действия учётной записи и убеждается, что доступ для этой записи не был временно заблокирован.
В случае положительного ответа модуль pam_deny игнорируется, и учётная запись проходит аутентификацию. в противном случае возникнет ошибка и доступ будет заблокирован.
Файл common-session-noninteractive
Теперь откройте файл common-session-noninteractive.
less /etc/pam.d/common-session-noninteractive
session [default=1] pam_permit.so
session requisite pam_deny.so
session required pam_permit.so
session optional pam_umask.so
session required pam_unix.so
session optional pam_ecryptfs.so unwrap
Первые три строки могут показаться странными (первая и третья – всегда положительный ответ, вторая будет пропущена).
Многие настройки PAM генерируются автоматически и нуждаются в корректировке. По сути, они просто предоставляют базу для разработки пользовательских настроек аутентификации.
Четвёртая строка опциональна, она вызывает модуль pam_umask. Пятая строка также вызывает pam_unix. В модулях сценариев unix выполняет аутентификацию с помощью утилит системы.
Заключение
Поначалу PAM кажется достаточно сложным инструментом. Базовое понимание того, как работает система и как она связывает различные компоненты, позволяет настроить разумную процедуру аутентификации.
Особенно важны навыки работы с библиотекой PAM при использовании современных моделей аутентификации (например LDAP).