. У меня есть машина CentOS 7, на которой я хотел бы отображать сообщение, если аутентификация не удалась во время sudo. Я попытался сделать это, добавив строку pam_echo в /etc/pam.d/sudo.
auth включает system-auth
auth необязательный файл pam_echo.so = / etc / security / foo
учетная запись включает системную аутентификацию
пароль включает system-auth
сеанс необязательный pam_keyinit.so отозвать
требуется сеанс pam_limits.so
По какой-то причине я не вижу этот вывод pam_echo, когда мне не удается пройти аутентификацию.
$ sudo ls
[sudo] пароль для стива:
Извините, попробуйте еще раз.
[sudo] пароль для стива:
Извините, попробуйте еще раз.
[sudo] пароль для стива:
sudo: 3 попытки ввода неверного пароля
Я протестировал стек sudo pam с помощью pamtester и получил ожидаемый результат после ввода неправильного пароля.
$ pamtester sudo steve аутентифицировать
Пароль:
бар
Точно так же я не получил вывода при вводе правильного пароля.
$ pamtester sudo steve аутентифицировать
Пароль:
pamtester: успешно аутентифицирован
Похоже, что sudo каким-то образом переопределяет или мешает выводам pam. Зачем sudo это нужно? Могу ли я изменить поведение sudo, чтобы вывод проходил?
Я запустил sudo и использовал GDB для обратной трассировки. Я проследил за хлебными крошками и обнаружил, что предотвращение вывода PAM жестко закодировано в sudo.
Обратная трассировка:
#13 0x00007f9879eba7e0 in pam_authenticate (pamh=0x56373c553960, flags=flags@entry=32768) at pam_auth.c:34 #14 0x00007f987a3510de in sudo_pam_verify (pw=, prompt=0x56373c553d00 "[sudo] password for steve: ", auth=, callback=0x7ffea8406880) at auth/pam.c:182 #15 0x00007f987a35052c in verify_user (pw=0x56373c54ce98, prompt=prompt@entry=0x56373c553d00 "[sudo] password for steve: ", validated=validated@entry=2, callback=callback@entry=0x7ffea8406880) at auth/sudo_auth.c:294 #16 0x00007f987a3520e5 in check_user (auth_pw=0x56373c54ce98, mode=, validated=2) at ./check.c:149 #17 0x00007f987a3520e5 in check_user (validated=validated@entry=2, mode=) at ./check.c:212 #18 0x00007f987a36506d in sudoers_policy_main (argc=argc@entry=1, argv=argv@entry=0x7ffea8406cf0, pwflag=pwflag@entry=0, env_add=env_add@entry=0x56373c5414f0, closure=closure@entry=0x7ffea84069f0) at ./sudoers.c:423 #19 0x00007f987a35eca4 in sudoers_policy_check (argc=1, argv=0x7ffea8406cf0, env_add=0x56373c5414f0, command_infop=0x7ffea8406a80, argv_out=0x7ffea8406a88, user_env_out=0x7ffea8406a90) at ./policy.c:758 #20 0x000056373aee448f in main (plugin=0x56373b102480 , user_env_out=0x7ffea8406a90, argv_out=0x7ffea8406a88, command_info=0x7ffea8406a80, env_add=0x56373c5414f0, argv=0x7ffea8406cf0, argc=1) at ./sudo.c:1342 #21 0x000056373aee448f in main (argc=, argv=, envp=) at ./sudo.c:261
В строках 181-182 auth / pam.c я обнаружил, что pam_authenticate вызывается с флагом PAM_SILENT для предотвращения любой вывод.
/* PAM_SILENT prevents the authentication service from generating output. */ *pam_status = pam_authenticate(pamh, PAM_SILENT);