Разработка приложений в среде Linux. Второе издание
Шрифт:
#include <security/pam_appl.h>
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 необходимо задавать для сетевых протоколов, в которых имя удаленного хоста может использоваться как компонент аутентификации, или при управлении учетной записью. |
Все остальные функции принимают по два аргумента: непрозрачный объект
pamh
и целое число, которое может быть либо нулевым, либо флагом РАМ_SILENT
. Флаг PAM_SILENT
требует, чтобы каркас и модули РАМ не генерировали информационных сообщений, однако при этом будет производиться запрос на ввод пароля. В обычных приложениях флаг РАМ_SILENT
не задается. Функция
pam_authenticate
, показанная в строке 100 кода pamexample.с
, выполняет все, что было сконфигурировано администратором системы в данном приложении (что определяется аргументом service_name
функции pam_start
) для аутентификации пользователя. Сюда может быть включено следующее: запрос на ввод одного или нескольких паролей; проверка, что пользователь с текущим именем пользователя (что определяется по элементу РАМ РАМ_USER
, а не по текущему uid; модули РАМ не рассматривают uid, поскольку приложения, вызывающие РАМ, обычно явным образом не выполняются после аутентификации пользователя) является текущим пользователем консоли; проверка, что текущий пользователь (снова по имени пользователя) недавно прошел аутентификацию для эквивалентного уровня обслуживания; проверка элементов РАМ PAM_RUSER и PAM_RHOST в отношении локальных таблиц эквивалентных удаленных пользователей и хостов (например, то, что выполняет демон rsh
), или что-либо подобное. (Обратите внимание, что в большинстве систем задействована система "теневых паролей", при котором с целью защиты пароля только процессы с полномочиями root могут проверять пароли произвольных пользователей; процесс, который не выполняется как root, может проверять только собственный пароль uid. Это единственное исключение из правила, когда модули РАМ принимают во внимание uid.) Функция
pam_acct_mgmt
, показанная в строке 107, предполагает, что функция pam_authenticate
уже была вызвана и продолжает свою работу, а затем проверяет (также по имени), разрешено ли пользователю осуществлять запрошенный доступ. Она может рассматривать элементы РАМ PAM_USER
, PAM_TTY
, PAM_RUSER
и PAM_RHOST
,
Функция
pam_setcred
, показанная в строке 118, предполагает, что аутентификация была пройдена, и затем устанавливает сертификаты для пользователя. Хотя uid, gid и дополнительные группы технически являются сертификатами, они не находятся под управлением функции pam_setcred
, поскольку во многих приложениях это не будет соответствовать модели безопасности. Наоборот, она устанавливает дополнительные сертификаты. Вероятным кандидатом для использования в качестве сертификата является мандат Kerberos — файл, содержащий зашифрованные данные, которые предоставляют пользователю разрешение на доступ к некоторым ресурсам. Функция
pam_open_session
, показанная в строке 113, открывает новый сеанс. Если в процессе есть ветвления, то функцию pam_open_session
необходимо вызывать после ветвления, поскольку при этом могут происходить такие действия, как установка rlimits
(см. стр. 120–121). Если ваш процесс запускается как root, а затем изменяется на uid аутентифицированного пользователя, функцию pam_open_session
нужно вызывать перед сбросом привилегий root, поскольку модули сеанса могут попытаться выполнить системные операции (например, монтирование домашних каталогов), которые зарезервированы только для root. Функция
pam_close_session
, показанная в строке 128, закрывает существующий сеанс. Ее можно вызывать из другого процесса, а не только из того, который вызвал функцию pam_open_session
, при том условии, что РАМ будут доступны одни и те же данные — те же аргументы, заданные для РАМ, и те же элементы РАМ, которые используются для открытия сеанса. Обратите внимание, что поскольку элемент PAM_USER
может быть изменен во время аутентификации и управления учетной записью, вы должны убедиться, что производится учет любых изменений, производимых с PAM_USER
, если вы вызываете ее из отдельного процесса, установившего сеанс. Для работы функции pam_close_session
могут потребоваться привилегии root. 1: /* pamexample.с */
2:
3: /* Программа pamexample демонстрирует вариант простой обработки РАМ.
4: * Вам нужно будет либо использовать параметр командной строки —service
5: * для выбора имени уже установленной службы (может работать "system-auth",
6: * проверьте наличие /etc/pam.d/system-auth в своей системе), либо
7: * установки системного файла */etc/pam.d/pamexample со следующими
8: * четырьмя строками (игнорируя ведущие символы "*") :
9: * #%РАМ-1.0
10: * auth required /lib/security/pam_unix.so
11: * account required /lib/security/pam_unix.so
12: * session required /lib/security/pam_limits.so
13: *
14: * Обратите внимание, что если вы запустите эту программу не как root, то
15: * можете столкнуться с ограничениями системы; при управлении учетными
16: * записями может произойти сбой, вам может быть не разрешено проверять
17: * другие пароли пользователей, в управлении сеансом может произойти
18: * сбой - все будет зависеть от того, как сконфигурирована служба.
19: */
20:
21: #include <security/pam_appl.h>
22: #include <security/pam_misc.h>
23: #include <popt.h>
Поделиться:
Популярные книги
Инцел на службе демоницы 1 и 2: Секса будет много
Инцел на службе демоницы
Фантастика:
фэнтези
5.25
рейтинг книги
Весь цикл «Десантник на престоле». Шесть книг
Десантник на престоле
Фантастика:
альтернативная история
8.38
рейтинг книги
Предатель. Цена ошибки
Измена
Любовные романы:
современные любовные романы
5.75
рейтинг книги
Жандарм 2
2. Жандарм
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Прогрессор поневоле
2. Фараон
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Всемирная энциклопедия афоризмов. Собрание мудрости всех народов и времен
Документальная литература:
публицистика
5.40
рейтинг книги
Истребитель. Ас из будущего
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.25
рейтинг книги
Очешуеть! Я - жена дракона?!
Фантастика:
юмористическая фантастика
5.43
рейтинг книги
Отмороженный 4.0
4. Отмороженный
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Треугольная шляпа. Пепита Хименес. Донья Перфекта. Кровь и песок.
65. Библиотека всемирной литературы
Проза:
классическая проза
5.00
рейтинг книги
Измена. Жизнь заново
1. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Три `Д` для миллиардера. Свадебный салон
Любовные романы:
современные любовные романы
короткие любовные романы
7.14
рейтинг книги
Бастард Императора. Том 5
5. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 21
21. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00