Почему я не могу использовать pam_echo.so в стеке sudo pam?

Почему я не могу использовать 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, флаги=флаги@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=validated@entry=2, callback=callback@entry=0x7ffea8406880) в auth/sudo_auth.c:294
#16 0x00007f987a3520e5 в check_user (auth_pw=0x56373c54ce98, mode=, validated=2) в ./check.c:149
#17 0x00007f987a3520e5 в check_user (проверено=проверено@entry=2, режим=) в ./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=0x56373c5414f0, closure=closure@entry=0x7ffea84069f0) в ./sudoers.c:423
#19 0x00007f987a35eca4 в sudoers_policy_check (argc=1, argv=0x7ffea8406cf0, env_add=0x56373c5414f0, command_infop=0x7ffea8406a80, argv_out=0x7ffea8406a88, user_env_out=0x7ffea8406a90) в ./policy.c:758
#20 0x000056373aee448f в main (plugin=0x56373b102480, user_env_out=0x7ffea8406a90, argv_out=0x7ffea8406a88, command_info=0x7ffea8406a80, env_add=0x56373c5414f0, argv=0x7ffea8406cf0, argc=1) в ./sudo.c:1342
#21 0x000056373aee448f в main (argc=, argv=, envp=) в ./sudo.c:261

В строках 181–182 файла auth/pam.c я обнаружил, что pam_authenticate вызывается с флагом PAM_SILENT, чтобы предотвратить любой вывод.

    /* PAM_SILENT не позволяет службе аутентификации генерировать выходные данные. */
    *pam_status = pam_authenticate(pamh, PAM_SILENT);

Связанный контент