РАМ не хранит никакой статической информации в библиотеке между вызовами, а хранит всю постоянную информацию с использованием непрозрачной структуры данных, передаваемой всем вызовам. Этот непрозрачный объект, pam_handle
, управляется РАМ, однако хранится в вызывающем приложении. Он инициализируется с помощью функции pam_start()
и освобождается функцией pam_end()
.
#include
int pam_start (const char * service_name, const char * user,
const struct pam_conv * pam_conversation,
pam_handle_t ** pamh);
int pam_end(pam_handle_t * pamh, int pam_status);
Аргумент service_name
должен представлять уникальное имя для вашего приложения. Это уникальное имя позволяет администратору системы конфигурировать защиту применительно к вашему приложению; два приложения, использующие одно и то же имя service name
, разделяют одну и ту же конфигурацию. Аргумент user
представляет имя аутентифицированного пользователя. Аргумент pam_conversation
представляет структуру диалога, о которой мы уже говорили. Аргумент pamh
представляет непрозрачный объект, который следит за внутренним состоянием. Функция pam_start()
показана в строке 97 кода.
Функция pam_end()
, показанная в строке 137 кода pamexample.с
, очищает каждое; состояние, хранящееся в непрозрачном объекте pamh
, и информирует модули, на которые он ссылается, о конечном состоянии действий. Если приложение успешно использовало РАМ, оно должно присвоить pam_status
значение PAM_SUCCESS
; в противном случае оно должно предоставить самую последнюю ошибку, возвращенную РАМ.
Бывают ситуации, когда модули РАМ могут использовать дополнительную информацию при принятии решения об аутентификации пользователя; эту информацию предоставляет система, а не пользователь. Кроме того, в некоторых случаях модули РАМ должны посылать приложению предупреждение об изменениях. Механизмом передачи этой дополнительной информации является pam_set_item()
, а его запрос осуществляется функцией pam_get_item()
.
#include
extern int pam_set_item(pam_handle_t * pamh, int item_type,
const void * item);
extern int pam_get_item(const pam_handle_t * pamh, int item_type,
const void ** item);
Аргумент item_type
определяет идентичность и семантику элемента РАМ item
. Мы рассмотрим только наиболее часто используемые значения item_type
.
PAM_TTY | item представляет указатель на строку, содержащую имя устройства TTY, с которым связан запрос аутентификации. Это может быть tty59 для первого последовательного порта в стандартной системе или pts/0 для первого псевдотерминала, или tty1 для первой виртуальной консоли. |
PAM_USER | Функция pam_start() автоматически присваивает это значение аргументу user , переданному функции pam_start() . Важно отметить, что это имя может изменяться! Если вашему приложению нужно имя пользователя, то оно должно проверять значение посредством функции pam_get_item() после попадания в стек РАМ и перед производством изменения имени в другом коде. |
PAM_RUSER | Для сетевых протоколов (например, rsh и ssh) этот элемент должен применяться для передачи имени пользователя удаленной системы любым модулям РАМ, которые используют его. Благодаря этому администратор системы сможет определить, разрешена ли аутентификация типа rhost . |
PAM_RHOST | Подобно PAM_RUSER , PAM_RHOST необходимо задавать для сетевых протоколов, в которых имя удаленного хоста может использоваться как компонент аутентификации, или при управлении учетной записью. |