Настройка аутентификации с помощью PAM в Ubuntu 12.04

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).

Tags: ,

Добавить комментарий