Я сейчас пытаюсь использовать pam_cracklib
который правильно не работает в соответствии с моим debug.log, но даже если он настроен как password requisite
запись в моем конфигурационном файле PAM, она все равно переходит к следующему pam_unix
модуль, позволяющий менять пароль. Почему разрешена смена пароля?
Я запускаю приложение драйвера входа через sudo
, это единственный способ аутентификации, который я знаю.
Вот мой файл конфигурации PAM (названный /etc/pam.d/validate
):
auth required pam_env.so
auth required pam_tally.so onerr=fail deny=3
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 500 quiet
auth required pam_deny.so
account required pam_unix.so
account required pam_tally.so
account sufficient pam_succeed_if.so uid < 500 quiet
account required pam_permit.so
password requisite pam_cracklib.so debug retry=3 minlen=14 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1
password sufficient pam_unix.so md5 shadow nullok try_first_pass use_authtok
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
Я аннулирую свой пароль пользователя, вынуждая их изменить его:
# chage -d 0 <user>
когда я запускаю пользовательское приложение, используя sudo
мой /var/log/debug.log
производит следующее.
pam_unix(validate:account): expired password for user mike (root enforced)
pam_cracklib(validate:chauthtok): bad password: it is WAY too short
pam_unix(validate:chauthtok): password changed for mike
Это потому что sudo
выполняет ваши команды как root.
Если вы проверите man pam_cracklib
вы увидите следующее
enforce_for_root
The module will return error on failed check also if the user
changing the password is root. This option is off by default which
means that just the message about the failed check is printed but
root can change the password anyway. Note that root is not asked
for an old password so the checks that compare the old and new
password are not performed.
Итак, что вам нужно сделать, это изменить свой pam_cracklib.so
линия, чтобы сказать
password requisite pam_cracklib.so debug retry=3 minlen=14 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1 enforce_for_root
Посмотрев на источник pam_cracklib.so, он делает следующее в строке 804 (во всяком случае, в Fedora 20)
if (getuid() || options.enforce_for_root || (flags & PAM_CHANGE_EXPIRED_AUTHTOK))
Таким образом, он проверяет реальный UID вызывающего абонента и применяет изменение или нет, в зависимости от того, равен ли реальный UID 0.
Таким образом, вы должны просто иметь возможность установить свой двоичный файл и убедиться, что он принадлежит root, тогда он сможет изменить пароль и принудительно применить решение cracklib. setuid'ing ваших двоичных файлов устанавливает только эффективный uid на 0, а не реальный.