Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Разработка модулей PAM, часть 1

Оригинал: Writing PAM Modules, Part One
Автор: Jennifer Vesperman
Дата публикации: 16 Мая 2002 г.
Перевод: А.Панин
Дата перевода: 20 Февраля 2013 г.

Аббревиатура PAM расшифровывается как Pluggable Authentication Modules (система подключаемых модулей аутентификации) и используется для обозначения системы, позволяющей приложениям осуществлять независимую аутентификацию. Приложение, работающее с PAM, использует стек модулей PAM для осуществления аутентификации, открытия и закрытия сессий и проверки работоспособности учетной записи.

Данная статья является первой в серии из трех статей о разработке модулей PAM. В ней приводится необходимая для разработки модулей информация. Во второй части приводится описание процесса взаимодействия с пользователем, а в третьей - описания важных функций, которые должны присутствовать в каждом модуле.

Взаимодействия

Модули PAM предоставляют приложению те возможности, в которых оно нуждается. Для работы с PAM в случае приложения необходимо как минимум использовать функцию обмена данными (conversation function), а в случае модуля - как минимум один из наборов функций. К модулям обычно предъявляются более жесткие требования, нежели к приложениям, так как модуль должен иметь возможность предоставлять ответ на каждый запрос (даже в случае возврата кода ошибки или стандартного кода успешного выполнения) от приложения.

Типы модулей

Система PAM позволяет осуществлять действия, выходящие за пределы процесса аутентификации, хотя процесс аутентификации является ее главной целью. С помощью нее также происходит управление учетными записями и сессиями наряду с изменением аутентификационных данных. Файл настроек PAM классифицирует модули на основе выполняемых ими действий и требует от системного администратора четкого указания того, какие модули должны вызываться системой в случаях необходимости использования каждого из их типов.

Четыре типа модулей:
Account
Управление учетными записями, чаще всего с помощью данных модулей производится определение того, имееет ли пользователь доступ в данный момент времени к заданной консоли.
Auth
Аутентификация, главная причина существования технологии PAM. С помощью заданных системным администратором модулей осуществляется проверка того, является ли пользователь тем, кем он представляется системе. Также с помощью данных модулей осуществляется изменение аутентификационных данных, таких, как принадлежность пользователей к группам.
Password
Изменение данных аутентификации, чаще всего пароля.
Session
Выполнение задач во время начала и окончания пользовательской сессии, таких, как показ времени последнего входа в систему, проверка доступной почты или монтирование директорий.

Стеки модулей

Описание стеков модулей PAM осуществляется в файлах настроек. Возможность формирование стеков модулей обуславливает значительную гибкость системы PAM - в ней не используются модули, выполняющие все возможные задачи; напротив, каждый модуль разрабатывается с учетом выполнения отдельной задачи. Система PAM следует традициям UNIX-систем в процессе осуществления аутентификации: используются небольшие программы, каждая из которых выполняет отдельное действие и выполняет его хорошо.

Разрабатывайте ваш модуль с целью выполнения единственного действия, независимо от того, является ли это действие таким сложным, как аутентификация с помощью Kerberos, или таким простым, как проигрывание звука при входе в систему. Если системному администратору понадобится выполнить описанную задачу в момент запуска или завершения работы приложения, он сможет добавить ваш модуль в стек PAM-модулей для приложения.

Под стеком понимается список модулей заданного типа для заданного приложения в последовательности, заданной в файле настроек.

В случае успешного выполнения стека приложение получает ответ со статусом PAM_SUCCESS и обычно переходит в выполнению следующей задачи. В случае неудачного выполнения стека, приложение получает ответ с одним из статусов ошибок и отвечает на него. Успех выполнения стека модулей зависит от флагов управления, заданных системным администратором в отношении каждого из модулей стека. Наиболее простые флаги управления описаны ниже:
required
Исполнение функций модуля должно успешно завершиться. В случае неудачи функции других модулей стека также будут исполнены, но в качестве результата исполнения стека будет возвращен статус неудачи.
requisite
Исполнение функций модуля должно завершиться успешно. В случае неудачи функции других модулей стека не исполняются. Статус неудачного исполнения возвращается немедленно. В качестве статуса исполнения стека возвращается статус ошибки первого модуля.
sufficient
В случае успешного исполнения функций модуля возвращается статус успешного исполнения стека. Функции последующих модулей не исполняются. Статус успешного исполнения стека возвращается немедленно. Неудача не препятствует успешному исполнению стека.
optional
Не оказывает влияния на статус исполнения стека до тех пор, пока не будут успешно или неудачно исполнены функции модуля, не использующего данный флаг управления.

Для более полного представления о стеках модулей PAM в Linux с точки зрения системного администратора следует обратиться к руководству системного администратора.

Какие функции могут исполняться модулями

Функции модулей PAM не ограничиваются традиционной аутентификацией. Модули из категории аутентификации позволяют производить аутентификацию пользователей любыми способами, которые возможно реализовать - от простого вопроса "являетесь ли вы пользователем? (Y/N)" до биометрических тестов. Модули из категории аутентификации также могут выполнять полезные для системных администраторов функции процессе аутентификации; например, модуль pam_env устанавливает или убирает переменные окружения во время аутентификации, а модуль pam_group устанавливает принадлежность пользователя к группам.

Модули управления учетными записями используются для установления того, может ли пользователь получить доступ к учетной записи. Модули pam_time и pam_nologin являются типичными модулями управления учетными записями и служат для ограничения доступа пользователя к учетной записи на основе времени дня или недели и стандартной системы "nologin" соответственно.

Модуль сессий pam_lastlog записывает время входа пользователя в систему и выхода из системы в файл журнала /var/log/lastlog. Другой часто используемый модуль pam_limits ограничивает использование системных ресурсов пользователем. Модули сессий обычно управляют задачами, которые должны выполняться или вызываться в моменты открытия или закрытия сессий.

Чрезвычайно полезный модуль паролей pam_cracklib позволяет проводить ряд проверок простоты паролей. На самом деле он не изменяет пароли, а просто сообщает о нестойком пароле и после этого передает проверенный пароль следующему модулю стека. Традиционная для UNIX работа с паролями производится с помощью модуля pam_unix.

Наиболее важным аспектом, который необходимо понять до начала разработки модулей PAM, является то, что они работают в стеке, поэтому ваш модуль не должен выполнять все действия. Если вам необходимо выполнить какое-либо действие во время входа в систему или выхода из нее, вы можете разработать небольшой модуль с реализацией только этой функции и разместить его в стеке после модуля pam_unix. Вам не следует разрабатывать аналог или изменять модуль pam_unix при реализации необходимой функции.

Требования к модулям

Независимость функций

Большая часть приложений сначала использует функции аутентификации, затем функции управления учетной записью, открывает сессию, возможно изменяет данные аутентификации, представленные паролем, после чего закрывает сессию. Однако, именно такая последовательность вызовов функций не гарантируется.

Модули должны быть разработаны с учетом их независимого использования в любой последовательности.

Модуль должен провести необходимые проверки для корректной работы в не зависимости от того, выполнены или нет функции из других модулей - например, в случае использования функции для работы с паролем без предшествующей аутентификации или в случае открытия сессии без использования функций для работы с учетной записью.

Завершенность реализации модуля

Разработка модулей с реализацией функций, специфичных только для заданного типа модулей, является допустимой. Однако, для повышения удобства использования модулей, неплохой идеей является также реализация функций, отвечающих на запросы для модулей других типов. Эти фиктивные функции должны возвращать статус PAM_SERVICE_ERR или PAM_IGNORE.

Требуемые флаги

Флаг PAM_SILENT должен приниматься любым модулем. Он передается с помощью параметра flags всех функций модуля. Если флаг PAM_SILENT установлен (обычно он устанавливается вместе с другими флагами с помощью логической операции "ИЛИ"), модуль не должен передавать любые текстовые сообщения с предупреждениями или ошибками приложению.

Передача аргументов

Система PAM читает файл настроек для приложения, производит разбор модулей стека, выделяя тип каждого из модулей, после чего разбирает строки описания модулей, проводя исследование аргументов для каждого модуля. Каждая функция модуля имеет аргументы argc и argv, которые являются счетчиком аргументов и массивом указателей на аргументы соответственно.

Данные параметры аналогичны параметрам функции main() в языке C, однако, argv[0] является аргументом, а не именем модуля.

Стандартные аргументы

Существует ряд аргументов, которые могут быть переданы любому модулю. Модуль должен реализовывать обработку данных аргументов (с одним возможным исключением) и при этом не должен реагировать на их отсутствие.
debug
Отправлять данные отладки в системный журнал с использованием функции syslog().
expose_account
Если ваш модуль поддерживает этот аргумент, в сообщениях будет выводиться соответствующая информация о учетных записях пользователей, такая, как реальное имя пользователя вместо идентификатора пользователя.
no_warn
Не отправлять предупреждения приложению.
try_first_pass
Получить данные аутентификации из элемента PAM_AUTHOK и попытаться использовать их в модуле. В случае неудачи запросить эти данные у пользователя.
use_first_pass
Получить данные аутентификации из элемента PAM_AUTHOK и использовать их в модуле. В случае неудачи возвратить соответствующий статус.
use_mapped_pass
Использование этого аргумента может повлечь нарушение законов о шифровании данных. В этом случае не стоит его использовать. Никто не хочет подвергать преследованию по закону лиц, разрабатывающих код. (Закон об экспортных ограничениях на криптографические алгоритмы актуален только для США - прим.пер.) Если у вас есть возможность использовать этот аргумент, модуль должен работать с существующими данными аутентификации из элемента PAM_AUTHTOK и использовать их в качестве ключа для получения аутентификационных данных, используемых данным модулем.

Заключительные слова

Данная статья является частью серии из трех статей о разработке модулей PAM. Во второй части рассказывается о работе в окружении Linux PAM, взаимодействии с пользователем, а также о получении и отправке данных модулю. В третьей части описываются функции, который должен предоставлять любой модуль, рассматриваются вопросы безопасности и приводится список статусов ответов модулей.

Дополнительные ресурсы