Назад | Перейти на главную страницу

pam_cracklib правильно сообщает неверный пароль, но модуль pam_unix ВСЕ ЕЩЕ изменяет пароль

Я сейчас пытаюсь использовать 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, а не реальный.