Расширенные журнальные возможности модуля pam_warn важны не только при отладке, но и с точки зрения безопасности. Например, если выявляется какая-то подозрительная деятельность, можно добавить модуль pam_warn в стеки auth, где осуществляются вызовы проверяемых служб. Многие модули поддерживают также аргумент debug, позволяющий фиксировать подробную информацию об их работе. Но следите за размером журнальных файлов, так как они быстро разрастаются. Кроме того, если злоумышленник проник в систему, он тоже может читать эти файлы!
В данную категорию входит еще модуль pam_permit, являющийся полной противоположностью модулю pam_deny. Как нетрудно догадаться, он разрешает любой доступ. Этот модуль доступен во всех стеках и должен использоваться с большой осторожностью.
Создание более гибких стеков
С точки зрения управления аутентификацией модули РАМ проявляют чрезвычайную гибкость. Существуют также средства точного контроля над выполнением модулей в рамках стеков. В этом подразделе мы познакомимся с так называемым флагом расширенного контроля. Синтаксис этого флага таков (табл. 5.2):
[значение 1=действие! значение2=действие2...]
Рассмотрим конкретный пример. Допустим, необходимо направлять в систему Syslog сообщение всякий раз, когда происходит несанкционированная попытка выполнить команду su root. Один из способов сделать это — вызвать модуль pam_warn, если пользователь не является членом группы wheel. В листинге 5.29 показан файл /etc/pam. d/su, где используется данная возможность.
Листинг 5.29. Использование флага расширенного контроля
auth sufficient /lib/security/pam_rootok.so
auth [success-ok ignore-ignore default-1]
/lib/security/pam_wheel.so use_uid group-wheel
auth sufficient /lib/security/pam_unix.so likeauth audit
auth required /lib/security/pam_warn.so
auth required /lib/security/pam_deny.so
account required /lib/security/pam_stack.so service=system-auth password required /lib/security/pam_stack.so service=system-auth session required /lib/security/pam_stack.so service=system-auth session optional /lib/security/pam_xauth.so
Поле управляющего флага в выделенной строке содержит запись
[success=ok ignore=ignore default=l]
Она интерпретируется следующим образом. Если модуль pam_wheel завершается успешно (success=ok), то возвращаемое значение считается частью общего кода успешного завершения стека. Если модуль pam_wheel возвращает код игнорирования (ignore=ignore), он не считается признаком успешного или неуспешного завершения стека. Если же модуль возвращает любое другое значение (default=l), то следующий модуль в стеке (pam_unix) пропускается и выполняются модули pam_warn и pam_deny. Таким образом, если пользователь является членом группы wheel (возвращается значение success или ignore), он имеет возможность пройти аутентификацию в модуле pam_unix. В противном случае, а также если модуль pam_unix завершится неудачей, доступ будет запрещен и модуль pam_warn сгенерирует журнальное сообщение.
В листинге 5.30 показаны типичные сообщения, регистрируемые модулями pam_wheel и pam_warn. Обратите внимание на то, что модуль pam_warn записывает дополнительную информацию о сеансе (например, имя удаленного пользователя). В данном случае говорится о том, что пользователь joe попытался стать пользователем root, но не смог этого сделать, так как не является членом группы wheel. Таким образом, можно отследить неудачные попытки выполнения команды su root.
Листинг 5.30. Журнальные сообщения модулей pam_wheel и pam_warn
Feb 23 14:06:25 topcat — joe[27941]: LOGIN ON tty5 BY joe
Feb 23 14:06:31 topcat PAM-Wheel[27984]: Access denied for 'joe' to 'root'
Feb 23 14:06:31 topcat PAM-warn[27984]: service: su [on terminal: pts4]
Feb 23 14:06:31 topcat PAM-warn[27984]: user: (uid=1006) -> root [remote:
joe@sylvester]
Feb 23 14:06:34 topcat login(pam_unix)[27941]: session closed for user joe
Есть целый ряд кодов завершения и действий, которые можно указывать в рамках флага расширенного контроля. Конкретные возвращаемые значения во многом зависят от модуля, но основные значения таковы:
success user_unknown maxtries
open_err new_authtok_reqd acct_expired
symbol_err session_err cred_unavail
service_err cred_expired cred_err
system_err no_module_data conv_err
buf_err authtok_err authtok_recover_err
perm_denied authtok_lock_busy authtok_disable_aging
auth_err try_again ignore
cred_insufficient abort authtok_expired
authinfo_unavail module_unknown bad_item
default
Единственный способ определить, возвращает ли модуль одно из упомянутых значений и если возвращает, то при каких обстоятельствах, — анализировать исходные коды (доступны по адресу www. kernel. org/pub/linux/libs/pam). Значения некоторых кодов вполне очевидны (например, success или user_unknown). Точную интерпретацию имеет лишь код default, который всегда означает одно и то же: указанное действие применяется в том случае, когда ни один другой код не встретился. Возможные действия определены гораздо более четко (табл. 5.17).