Управление учетными записями. Создание и использование групп пользователей в ОС Linux, страница 3

Исторически за процесс авторизации отвечала команда /bin/login. Затем появилось два направления по улучшению качества и гибкости системы авторизации. Первое направление: всевозможные улучшения базы учётных записей, начиная от LDAP и заканчивая СУБД. Второе направление: независимая аутентификация пользователей при доступе к различным сервисам (почта, прокси, ftp), так как у каждого сервиса могут быть свои пользователи. Для решения этих задач была создана система PAM = Pluggable Authentication Modules, то есть подключаемых модулей аутентификации. При их использовании смена источника учётных записей сводится всего лишь к подключению соответствующего модуля и для каждой программы, которая выполняет авторизацию может быть свой набор этих модулей. Сами модули в Linux можно найти в каталоге /lib/security, а их настройки (и наборы модулей для каджой функции) в /etc/pam.d. Например, для упомянутой команды login настройки PAM будут в /etc/pam.d/login. Файлы конфигурации имеют достаточно простой синтаксис: текстовые строки, состоящие из четырех полей разделенных пробельными промежутками (пробелами и табами). Вот эти поля:

<действие модуля>: auth, account, password, session

<тип контроля>: required, requisite, sufficient, optional

<имя модуля>: полное имя файла с модулем

<параметры модуля>

Действие модуля определяет функцию, выполняемую системой PAM:

auth: аутентификация пользователя, то есть определение, кто он есть.

account: управление учётной записью: ограничение доступа по времени дня, ограничение времени действия пароля...

password: смена пароля

session: выполнение действий при установлении сессии: ведение журнала, подключение домашнего каталога (если сетевой)...

Для примера рассмотрим модуль стандартной авторизации UNIX pam_unix. Для auth он выполняет проверку введённого логина и пароля в файлах /etc/passwd и /etc/shadow. Для account он выполняет проверку сроков действия пароля по данным /etc/shadow. Для password выполняет запись пароля в /etc/shadow. Для session просто записывает в системный журнал. Теперь рассмотрим типы контроля. Они указывают, как реагировать системе PAM на успешное окончание соответствующего модуля и как на неуспешное.

required: для успеха набора необходим успех этого модуля, но даже в случае неуспеха выполняются остальные модули

requisite: то же, что и required, но прерывает выполнение сразу. Например, можно таким образом сразу прерывать процесс аутентификации при неверном имени пользователя.

sufficient: успех модуля приводит к успеху всего набора, если не было неуспехов до этого, дальнейшие модули не рассматриваются

optional: результат модуля не влияет на результат набора, если есть другие модули

Последние версии PAM поддерживают ещё более гибкий синтаксис. Вместо стандартных типов контроля можно использовать строки вида “[значение1=действие1 значение2=действие2 ...]”. Соответственно, для каждого значения, возвращенного модулем, указывается соответствующее действие. Значение может быть одним из следующего списка:

success

open_err

symbol_err

service_err

system_err

buf_err

perm_denied

auth_err

cred_insufficient

authinfo_unavail

user_unknown

maxtries

new_authtok_reqd

acct_expired

session_err

cred_unavail

cred_expired

cred_err

no_module_data

conv_err

authtok_err

authtok_recover_err

authtok_lock_busy

authtok_disable_aging

try_again

ignore

abort

authtok_expired

module_unknown

bad_item

Для не указанных явно значений можно использовать значение “default”. Действие может быть числом или одним из указанных ниже. Число n означает, что следующие n модулей должны быть пропущены (эта возможность позволяет писать очень гибкие сценарии авторизации). Список возможных действий:

ignore: результат модуля не окажет влияния на результат набора

bad: результат набора = неуспех, выполнение продолжается

die: результат набора = неуспех, выполнение прекращается

ok: если результат модуля неуспех, то результат набора тоже неуспех, иначе успех, выполнение продолжается

done: то же, что ok, но выполнение прекращается

reset: сбросить информацию о выполнении предыдущих модулей