Почему я не могу использовать pam_echo.so в стеке sudo pam?
У меня есть машина CentOS 7, на которой я хотел бы отобразить сообщение, когда во время sudo происходит сбой аутентификации. Я попытался сделать это, добавив строку pam_echo в /etc/pam.d/sudo.
Для тестирования я создал файл / etc / security / foo, содержащий строку "bar".
Это мой стек sudo pam, /etc/pam.d/sudo:
auth include system-auth
auth optional pam_echo.so file=/etc/security/foo
account include system-auth
password include system-auth
session optional pam_keyinit.so revoke
session required pam_limits.so
По какой-то причине я не вижу этот вывод pam_echo, когда мне не удается пройти аутентификацию.
$ sudo ls
[sudo] password for steve:
Sorry, try again.
[sudo] password for steve:
Sorry, try again.
[sudo] password for steve:
sudo: 3 incorrect password attempts
Я протестировал стек sudo pam с помощью pamtester и получил ожидаемый результат после ввода неверного пароля.
$ pamtester sudo steve authenticate
Password:
bar
Кроме того, я не получил вывод при вводе правильного пароля.
$ pamtester sudo steve authenticate
Password:
pamtester: successfully authenticated
Кажется, что sudo каким-то образом переопределяет или мешает выводу pam. Зачем sudo нужно сделать это? Могу ли я изменить поведение sudo, чтобы вывод получился?
1 ответ
Я запустил sudo и использовал GDB для обратного отслеживания. Я проследил за хлебными крошками и обнаружил, что предотвращение вывода PAM жестко закодировано в sudo.
Обратный след:
# 13 0x00007f9879eba7e0 в pam_authenticate (pamh=0x56373c553960, flags=flags@entry=32768) в pam_auth.c:34 #14 0x00007f987a3510de в sudo_pam_verify (pw=, prompt=0x56373c553d00 "[sudo] пароль для steve: ", auth=, callback=0x7ffea8406880) по адресу auth/pam.c:182 #15 0x00007f987a35052c в verify_user (pw=0x56373c54ce98, prompt=prompt@entry=0x56373c553d00 "[sudo] пароль для steve:", проверено =validated@entry=2, callback=callback@entry=0x7ffea8406880) в auth/suuth.su: sudo 294 #16 0x00007f987a3520e5 в check_user (auth_pw=0x56373c54ce98, mode=, validated=2) at ./check.c:149 #17 0x00007f987a3520e5 в check_user (проверено = подтверждено @entry=2, mode=) в./check.c:212 #18 0x00007f987a36506d в sudoers_policy_main (argc=argc@entry=1, argv=argv@entry=0x7ffea8406cf0, pwflag=pwflag@entry=0, env_add=env_add@entry=0x56373c0 = 00 0 0) 0407).c:423 #19 0x00007f987a35eca4 в sudoers_policy_check (argc=1, argv=0x7ffea8406cf0, env_add=0x56373c5414f0, command_infop=0x7ffea8406a80, argv_out=0x7ffea080a8808806) #20 0x000056373aee448f в главном (плагин =0x56373b102480, user_env_out=0x7ffea8406a90, argv_out=0x7ffea8406a88, command_info=0x7ffea8406a80, env_add=0x56373c5414f0, ARGV = 0x7ffea8406cf0, ARGC =1) при./sudo.c:1342 #21 0x000056373aee448f в основном (argc=, argv=, envp=) в./sudo.c:261
В строках 181-182 файла auth / pam.c я обнаружил, что pam_authenticate вызывается с флагом PAM_SILENT, чтобы предотвратить любой вывод.
/ * PAM_SILENT не позволяет службе аутентификации генерировать выходные данные. */ *pam_status = pam_authenticate(pamh, PAM_SILENT);