 | Уровень сложности: средний Паллави Галгали, программист, IBM Рахул Гайтонде, программист, IBM
15.07.2008 В статье рассматривается методика создания единой системы идентификации и аутентификации (I and A) в гетерогенной многоплатформенной среде. Система идентификации и аутентификации обеспечивает уровень абстракции между пользовательским приложением и необходимым данному приложению механизмом аутентификации.
Вступление
Интерфейс прикладного программирования (API) позволяет приложению не заботиться о конкретном используемом методе идентификации или аутентификации, например имя пользователя и пароль либо биометрические отпечатки пальцев.
AIX®, Linux® и Solaris применяют различные системы идентификации и аутентификации, поэтому для реализации данной задачи в многоплатформенной гетерогенной среде необходимо выработать единую стратегию идентификации и аутентификации. Данная статья адресована IT-персоналу, занимающемуся разработкой и реализацией I and A в гетерогенной среде окружения.
Начнем с описания системы I and A , затем расскажем о реализациях ее на трех платформах: LAM (loadable authentication modules), PAM (pluggable authentication modules) и NSS (name service switch). После общего описания будут представлены конкретные советы для реализации единой I and A.
Обзор идентификации и аутентификации
Под идентификацией понимается проверка того, что пользователь является зарегистрированным в системе пользователем; под аутентификацией понимается проверка подлинности данного пользователя.
В качестве простого примера рассмотрим обычный вход в систему с использованием telnet:
- клиент telnet открывает TCP-соединение к telnet-серверу;
- пользователь вводит свое имя пользователя, идентифицируя себя для системы (идентификация);
- пользователю предлагается ввести пароль (начало аутентификации);
- проверка пароля гарантирует подлинность пользователя, завершая аутентификацию.
Системы, которые предоставляют идентификацию и аутентификацию, называются I and A. Такие системы позволяют использовать новые методы идентификации и аутентификации.
I and A предоставляет уровень абстракции между пользовательским приложением и реализацией любой функции аутентификации и идентификации. Для идентификации и аутентификации пользовательское приложение должно использовать только стандартные функции библиотеки C. Администратором системы определяются доступные для этих целей механизмы, предоставляемые работающими на уровне пользователя модулями.
Например, системный администратор может задать требование аутентификации для пользователя A на машине M простой парой имя пользователя/пароль, используя для проверки подлинности локальный файл паролей, в то время как другой пользователь B на машине M может аутентифицироваться с помощью методов биометрического контроля. Во всех этих случаях будет использована одна и та же программа аутентификации с использованием одних и тех же функций библиотеки безопасности. Однако в каждом из этих случаев будут использованы различные модули реализации аутентификации, каждый модуль будет решать эту задачу своим методом.
Сравнение механизмов аутентификации и идентификации в AIX, Linux и Solaris
Существуют некоторые отличия между тем как различные UNIX-платформы реализуют идентификацию и аутентификацию. В таблице 1 можно увидеть отличия, имеющиеся у данных функций в AIX, Linux, Solaris. Ниже приведены названия подсистем, реализующих идентификацию и аутентификацию.
Таблица 1. Названия подсистем
| Платформа | Идентификация | Аутентификация |
|---|
| AIX | LAM | LAM / PAM | | Solaris | NSS | PAM | | Linux | NSS | PAM |
Служба NSS
Даже после того как пользователь был успешно аутентифицирован, многим приложениям по-прежнему необходима информация, которую он использовал при аутентификации. Данная информация обычно содержится в текстовых файлах (/etc/passwd, /etc/shadow, /etc/group), но может быть предоставлена и другими способами, для реализации которых в UNIX-системах имеются обычные API для предоставления этой информации и написаны ряд модулей, выполняющих эту задачу в зависимости от выбранной технологии. Такая служба называется NSS, она использует обычный API и файл конфигурации(/etc/nsswitch.conf), в котором заданы имена всех провайдеров службы имён для каждой поддерживаемой базы данных. Для получения дополнительной информации смотрите раздел "Системные базы данных и переключение службы имён" в описании библиотеки GNU C.
Рисунок 1. Путь выполнения запросов идентификации
На рисунке изображён путь выполнения запросов при вызове функции библиотеки C, относящейся к идентификации. Сначала библиотечный вызов перенаправляется в NSS- библиотеку, которая, собственно, реализует эти функции и экспортирует данный API. Библиотека NSS сверяется с настройками в /etc/nsswitch.conf и затем подгружает соответствующие, необходимые для запроса модули.
Файл настроек nsswitch.conf приведён в листинге 1. Первый столбец задаёт имя базы данных, все последующие ключевые слова определяют, каким образом должны обрабатываться запросы.
Листинг 1. Конфигурационный файл NSS
# /etc/nsswitch.conf
#
# Name Service Switch configuration file.
#
passwd: db files nis
shadow: files
group: db files nis
hosts: files nisplus nis dns
networks: nisplus [NOTFOUND=return] files
ethers: nisplus [NOTFOUND=return] db files
protocols: nisplus [NOTFOUND=return] db files
rpc: nisplus [NOTFOUND=return] db files
services: nisplus [NOTFOUND=return] db files
|
Инфрастуктура PAM
PAM предоставляет администратору возможность выбора любой доступной службы аутентификации вместе с подгрузкой дополнительных модулей аутентификации без какой-либо модификации приложения.
PAM состоит из библиотеки с интерфейсом и множества модулей аутентификации. На уровне библиотеки реализуется API, в модулях аутентификации реализуется конкретный алгоритм аутентификации пользователя.
На рисунке 2 показано взаимодействие между приложением, библиотекой и модулями. Приложение (ftp, telnet, login) использует библиотеку для доступа к подходящему модулю. Файл конфигурации pam.conf определяет, какой из модулей должен быть использован для каждого приложения. Ответы модулей перенаправляются в приложение.
Рисунок 2. Взаимодействие с приложением
В файле конфигурации PAM /etc/pam.conf можно задать, какой именно механизм аутентификации должен быть использован для каждого системного приложения. Файл имеет следующий синтаксис:
Service_name module_type control_flag module_path module_option |
То есть:
имя_сервиса тип_модуля флаги_управления путь_к_модулю опции_модуля. |
Имя сервиса задаёт имя приложения, тип модуля определяет тип модуля для заданного приложения, флаги управления определяют семантику поведения при неудачных попытках авторизации, путь к модулю задаёт путь к подгружаемой библиотеке, которая реализует функциональность аутентификации, опции модуля задают специфичные для каждого модуля опции. Пример записи в pam.conf:
login auth required /usr/lib/security/pam_unix debug
|
Инфраструктура LAM
Интерфейс LAM является стандартной системой идентификации и аутентификации в AIX. Каждый модуль системы LAM определяет подфункции интерфейса. По требуемому функционалу определяется, какая именно из набора подфункций должна быть вызвана.
LAM-модуль представляет собой динамически подгружаемую библиотеку, которая настраивается при загрузке функцией инициализации. Данная функция инициализации модуля - точка входа в библиотеку, она определяется в момент компиляции. В дальнейшем LAM-модуль взаимодействует с системой безопасности AIX через интерфейс secmethod_table, который представляет собой набор указателей на функции. Каждая функция интерфейса решает чётко определённую задачу. Функция инициализации получает указатель на структуру secmethod_table и задаёт его указатели на соответствующие реализации данных функций. Таким образом, системная библиотека безопасности использует заданные функции вместо обычных функций, работающих с локальными файловыми базами пользователей.
Рассмотрим простой пример аутентификации и идентификации с использованием LAM-модулей.
- Приложение вызывает функцию аутентификации в системной библиотеке безопасности AIX.
- Считывается файл /etc/security/user. Данный файл является набором директив, каждая директива состоит из одной или нескольких пар имя/значение. LAM задаёт политику безопасности, базируясь на информации о пользователе. Каждая директива в /etc/security/user соответствует одному пользователю, для которого заданы данные политики (существует директива для политики по умолчанию!) Значение переменной
SYSTEM определяет механизм аутентификации для заданного пользователя. Это ключевое слово - индекс в файле /usr/lib/security/methods.cfg Например, доступ для пользователя "rahul" настраивается следующим образом:
* /etc/security/user:
* stanza for user "rahul"
rahul:
.
.
.
SYSTEM="MY_AUTH"
.
.
.
|
- После того как прочитана переменная
SYSTEM, читается файл /usr/lib/security/methods.cfg. Cинтаксис этого файла похож на синтаксис /etc/security/user - это набор директив, каждая директива - это пара имя/значение. Определяется директива, которая соответствует ключевому слову в /etc/security/user. Главной частью директивы является имя и путь к подгружаемому LAM-модулю. Так, запись в methods.cfg, соответствующая ключевому слову "MY_AUTH" в вышеприведённом листинге, могла бы быть:
* /usr/lib/security/methods.cfg
*stanza for "MY_AUTH"
MY_AUTH:
program = /usr/lib/security/LAM_MY_AUTH
.
.
.
|
/usr/lib/security/LAM_MY_AUTH в данном примере - это модуль, который и реализует аутентификацию или идентификацию, которая была бы выполнена без этого модуля при помощи стандартных файлов типа /etc/passwd. Данный модуль будет загружен, затем будет выполнена соответствующая функция.
Возвращаемое модулем значение передаётся приложению через код возврата функции системной библиотеки безопасности.
 |
Проблемы при реализации систем I and A в старых версиях ОС AIX.
Данный раздел предназначен для администраторов, которым необходимо интегрировать старые AIX-системы (версия ниже 5.2) в обычную I and A.
AIX 5.2 и выше поддерживают PAM в стандартной версии; в них можно реализовать полноценное PAM-решение. Однако до версии 5.2 приложения в системе не поддерживали PAM, поэтому AIX использовала довольно сложный механизм для достижения аутентификации с использованием PAM. Ниже описан данный механизм с обзором работы механизма LAM.
В системе AIX имеются подгружаемые модули аутентификации для обеспечения поддержки PAM "родными" приложениями AIX. Приложения AIX вызывают функции, предоставляемые PAM, через существующую систему LAM.
Отметим, что это "PAM через LAM" - это не полноценный PAM; вот почему не рекомендуется использовать данный метод для обеспечения аутентификации для родных приложений AIX.
Это типичное использование LAM, однако в данном случае необходимо использовать PAM-модуль, для чего потребуется LAM-модуль (PAM), поэтому внесем изменение в файл /usr/lib/security/methods.cfg (см. раздел
Инфраструктура LAM
), изменив строку
program = /usr/lib/security/LAM_MY_AUTH
|
на строки:
program = /usr/lib/security/PAM
options = authonly
|
Данный LAM-модуль (PAM) перенаправляет вызовы от служб безопасности AIX в библиотеку PAM (libpam.a). Другими словами, оно переопределяет библиотечные функции на функции в PAM API. Таким образом, начиная с этого момента, это полноценное окружение PAM для пользовательского приложения. Библиотека libpam.a считывает /etc/pam.conf для определения PAM-модуля для загрузки и использования, основываясь на службе, которая осуществила первоначальный вызов. Как правило, в случае "PAM через LAM" все функции аутентификации, вне зависимости от службы, обрабатываются каким-либо PAM-модулем.
В таблице 2 показана часть привязки к PAM через LAM.
Таблица 2. Привязка к PAM через LAM
| AIX | PAM API |
|---|
| authenticate | pam_authenticate | | chpass | pam_chauthtok | | passwdexpired | pam_acct_mgmt | | passwdrestrictions | Привязки не существует, всегда возвращается код успешного выполнения. |
Как видно, не все функции библиотеки системной безопасности AIX имеют свои эквиваленты в PAM API. В таких случаях должны быть написаны и использоваться функции-заглушки, которые должны быть в PAM-модуле. В вышеприведённом примере такими заглушками являются функции, просто возвращающие код успешного завершения операции.
Предупреждаем, что в системах с PAM, где приложения напрямую взаимодействуют с PAM-модулями, PAM-модуль может выдавать предложение пользователю ввести различные данные, такие как имя пользователя и т.д. В данном случае будет невозможно организовывать взаимодействие с пользователем на уровне модуля PAM, так как все данные, выведенные службой сетевой безопасности AIX, перенаправляются в PAM-модуль с использованием pam_set_item метода, а не напрямую. Аналогично PAM-модули должны запрашивать все данные, используя функцию pam_get_item, и никогда напрямую: всё взаимодействие с пользователем обрабатывается библиотекой безопасности AIX.
Рекомендации по реализации I and A
Если необходимо написать собственную I and A, которая работала бы на AIX, Solaris и Linux, то придется написать следующие модули:
- модуль NSS. Данный модуль будет выполнять идентификацию в Solaris и Linux;
- модуль PAM. Данный модуль будет выполнять идентификацию в Solaris, Linux и AIX;
- модуль LAM. Данный модуль будет выполнять идентификацию в AIX.
Написание собственных PAM-модулей хорошо документировано, можно найти ссылки на примеры реализации PAM-модулей вместе с другой документацией по написанию PAM в разделе Ресурсы).
Ниже приводится написание модулей NSS и LAM, которые предоставляют одинаковую функциональность идентификации, для того чтобы было можно создать единое решение по аутентификации на всех трёх платформах. Фактическая реализация функций будет очень похожа на всех платформах (см. таблицу 3) вне зависимости от используемого модуля, LAM это или PAM-модуль.
Рассмотрим простую систему идентификации на базе паролей и групп.
Идентификация с помощью NSS
Рассмотрим, каким образом модуль NSS "mynss" выполняет идентификацию. В таблице 3 представлены записи, ориентированные на использование паролей, с использованием имени группы вместо логина пользователя. Таким образом, файл, который будет реализовывать идентификацию для парольных записей, будет иметь следующие функции (см. таблицу 3).
Модуль NSS
_nss_mynss_getpwnam
| Функция возвращает структуру пароля на основе заданного имени пользователя. |
_nss_mynss_getpwuid
| Функция возвращает структуру пароля на основе заданного id пользователя. |
_nss_mynss_setpwent
| Вызов этой функции должен установить указатель на пароли в первую запись базы данных паролей. Данная функция должна быть вызвана до первого вызова функции getpwent (см ниже). |
_nss_mynss_getpwent
| Первый вызов этой функции возвращает структуру пароля по указателю, установленному предыдущей функцией. Также происходит увеличение этого указателя, так что последующие вызовы будут возвращать следующие записи из базы данных паролей. |
nss_mynss_endpwent
| Функция заканчивает операции, начатые двумя вышеописанными функциями. |
В листинге 2 приведена типичная функция getpwnam().
Листинг 2. Функция getpwnam()
nss_status_t _nss_mynss_getpwnam( void* mynssinfo, void *data)
{
nss_XbyY_args_t *lookup_data = (nss_XbyY_args_t *)data;
int string_length;
printf ( "_nss_mynss_getpwnam: called for username %s\n",
lookup_data->key.name);
/* Эта реализация ищет записи в структуре passwd,
* используя username в качестве входного параметра.
* Структура passwd заполняется указателем на данные и возвращается.
*/
return SUCCESS;
}
|
Идентификация при помощи LAM
Рассмотрим типичный LAM-модуль с именем mylam, занимающийся идентификацией. В таблице 4 приведен набор функций, которые должны быть реализованы в этом модуле.
Таблица 4. Типичный LAM-модуль
mylam_getpwnam
| Функция возвращает структуру пароля для заданного имени пользователя. |
mylam_getpwuid
| Функция возвращает структуру пароля для заданного id пользователя. |
mylam_getgrnam
| Функция возвращает структуру с информацией о группе для заданного имени группы. |
mylam_getgrgid
| Функция возвращает структуру с информацией о группе для заданного id группы. |
mylam_getgrset
| Функция возвращает информацию о группах, в которые входит пользователь, для данного имени пользователя. |
В листинге 3 приведена типичная функция mylam_getpwnam:
Listing 3. mylam_getpwnam function
struct passwd* adfs_getpwnam (const char *username) {
/*
* Поместить информацию о пароле в структуру passwd
* и вернуть указатель на нее в случае успеха,
* в противном случае вернуть NULL.
*/
}
|
Ресурсы Научиться
-
A comparison of security subsystems on AIX, Linux, and Solaris (EN): оригинал статьи.
-
Loadable Authentication Module Programming Interface (EN): документ о концепциях программирования расширений ядра, поддержке устройств и интерфейсе подгружаемых модулей аутентификации описывает способы расширения модулей идентификации и аутентификации.
-
Pluggable Authentication Modules (EN): руководство по безопасности AIX 5L, раздел "Подгружаемые модули аутентификации" описывает модули PAM и подключение нескольких механизмов аутентификации в систему.
-
user file (EN): Web-cтраница "файл пользователя" раздела "описание файлов" руководства AIX представляет описание записей атрибутов для пользователей.
-
/usr/lib/security/methods.cfg file (EN): Web-cтраница "файл /usr/lib/security/methods.cfg" раздела "описание файлов" руководства AIX содержит информацию о конфигурации LAM.
-
System Databases and Name Service Switch (EN): описание "системные базы данных и служба переключения имён" в документации библиотеки GNU C описывает настройку корректной работы различных функций библиотеки C.
-
Linux-PAM: сайт Linux-PAM это главный сайт проекта Linux-PAM.(EN)
- В разделе AIX и UNIX сайта developerWorks размещена различная информация по всем аспектам системного администрирования AIX, которая поможет лучше изучить UNIX.
- Команда IBM developerWorks проводит по всему миру сотни бесплатных технических консультаций.(EN)
-
developerWorks eServer zone : в разделе developerWorks eServer zone размещена различная информация, которая поможет лучше изучить продукты eServer.(EN)
Получить продукты и технологии
Обсудить
Об авторах  | |  | Паллави Галгали (Pallavi Galgalli) работает программистом в лаборатории IBM India Software в Пуни (Индия). Паллави участвовала в разработке и поддержке проектов SAN File System, Advanced Distributed File System и Distributed Computing Environment. Она является соавтором учебника
IBM TotalStorage Solutions Handbook
. Закончила факультет вычислительной техники Института Компьютерных технологий в Пуни. Её интересы охватывают сетевое хранение, файловые системы и драйвера устройств. C ней можно связаться по адресу: pgalgali@in.ibm.com. |
 | |  | Рахул Гайтонде (Rahul Gaitonde) работает в команде разработки файловой системы SAN File System в лаборатории IBM India Software в Пуни (Индия). Он выпускник факультета вычислительной техники университета в Мумбаи. Рахул написал несколько статей для сайтов "Linux on the Desktop" и "Technology Strategy". Область его интересов - операционные системы, высокопроизводительные системы и Linux. C ним можно связаться по адресу: rahul.gaitonde@in.ibm.com. rahul.gaitonde@in.ibm.com. |
Выскажите мнение об этой странице
|  |