В этом подразделе мы проанализируем взаимодействие модулей pam_cracklib и pam_unix в листинге 5.6. Приведем еще раз соответствующий фрагмент файла /etc/ раш.d/passwd:
password required /lib/security/pam_cracklib.so retry=3
type=
password sufficient /lib/security/pam_unix.so use_authtok
Описание
Таблица 5.7. Аргументы модуля pam_cracklib
md5 shadow nis password required /lib/security/pam_deny.so
В первой записи вызывается модуль pam_cracklib, который отображает приглашение на ввод нового пароля (вспомните, что модуль pam_unix типа auth отвечает за ввод пользователем старого пароля для аутентификации). После того как пользователь ввел пароль, выдается просьба повторить пароль. По завершении этой процедуры модуль pam_cracklib проверяет, можно ли принять такой пароль. Если проверка прошла успешно, новый пароль передается модулю pam_unix, который вызывается с аргументом use_authtok, что означает прием нового пароля от предыдущего модуля. Полученный пароль записывается в соответствующую базу данных: в файл /etc/shadow (аргумент shadow) либо в базу данных главного сервера NIS (аргумент nis). Обратите внимание на то, что модулю pam_unix соответствует управляющий флаг sufficient. Это означает, что в случае успешного завершения следующий модуль стека не вызывается. Если же очередь дойдет до модуля pam_deny, пароль будет отвергнут.
В данном примере, как и в большинстве других, вместо стандартной функции crypt () используется алгоритм хеширования паролей MD5. Это существенно усложняет задачу утилитам типа Crack. Кроме того, появляется возможность потребовать более длинные пароли — 20, 30 символов и даже больше. В следующем примере (листинг 5.8) необходимая длйна пароля равна 20. Задается также аргумент type, чтобы привлечь внимание пользователей.
Листинг 5.8. Задание ограничения на длину пароля в файле /etc/раш. d/passwd
password required /lib/security/pam_cracklib.so minlen=20\
retry=3 type=SECRET password required /lib/security/pam_unix.so md5 use_authtok
Предупреждение
Внося подобные изменения, нужно поменять все аналогичные вызовы модулей pam_unix и pam_cracklib типа passwd. В Red Hat 7.2 это означает редактирование как минимум файлов chfn, chsh, login, rlogin, su и xdm в каталоге /etc/pam.d.
Теперь посмотрим, что произойдет, когда пользователь Мэри (тагу) попытается ввести новый пароль (листинг 5.9). Ей даются три попытки (аргумент retry=3 в листинге 5.8). На первый взгляд кажется, будто вводимые пароли вполне корректны. Но Мэри просто не знает об изменении модуля РАМ и вводит слишком короткие пароли. Когда администратор сообщает ей о том, что минимальная длина пароля составляет 20 символов, Мэри, естественно, делает круглые глаза ("Вы в своем уме?! Я никогда не запомню такой пароль!"). В таких ситуациях, конечно же, нужно составлять идентификационную фразу (листинг 5.10).
Листинг 5.9. Неудачная попытка сменить пароль $ passwd
Changing password for шагу (current) UNIX password: j3niKy New SECRET password: Rt!72g BAD PASSWORD: is too simple New SECRET password: 8хв$Н BAD PASSWORD: is too simple New SECRET password: P5-+yh BAD PASSWORD: is too simple?
New SECRET password: 8хв$Н
passwd: Authentication token manipulation error $
Листинг 5.10. Удачная смена пароля $ passwd
Changing password for тагу
(current) UNIX password: j3niKy
New SECRET password: I need a t%$3+ raise
Retype new SECRET password: I need a t%$3+ raise
passwd: all authentication tokens updated successfully $
Заметьте, что сообщение, отображаемое модулем pam_cracklib, выглядит немного не так, как обычно: "New SECRET password:" вместо "New UNIX password:". Это изменение не затрагивает сообщение (current) UNIX password:, выводимое модулем pam_unix, так как последний не поддерживает аргумент type.
Примечание
Пароли, показанные в листингах 5.9 и 5.10, не отображаются на экране. Они показаны здесь лишь для наглядности.
Отметим также, что 20-символьный (с учетом пробелов) пароль можно было сделать короче, так как по умолчанию аргументы "dcredit, ucredit, lcredit и ocredit равны единице каждый. В данном случае они позволяют укоротить пароль на четыре символа.