Por que não posso usar pam_echo.so na pilha sudo pam?

Por que não posso usar pam_echo.so na pilha sudo pam?

Eu tenho uma máquina CentOS 7 onde gostaria de exibir uma mensagem quando a autenticação falhar durante o sudo. Tentei fazer isso adicionando uma pam_echolinha no arquivo /etc/pam.d/sudo.

Para teste, criei um arquivo, /etc/security/fooque contém a string 'bar'.

Esta é minha pilha 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

Por alguma razão, não vejo esta saída de pam_echo quando não consigo autenticar.

$ 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

Testei a pilha sudo pam com pamtester e obtive o resultado esperado após inserir a senha errada.

$ pamtester sudo steve authenticate
Password:
bar

Da mesma forma, não obtive saída ao inserir a senha correta.

$ pamtester sudo steve authenticate
Password: 
pamtester: successfully authenticated

Parece que o sudo está de alguma forma substituindo ou interferindo na saída do pam. Por que o sudo precisaria fazer isso? Posso alterar o comportamento do sudo para que a saída seja transmitida?

Responder1

Executei o sudo e usei o GDB para fazer um back-trace. Segui as migalhas de pão e descobri que a prevenção da saída do PAM está codificada no sudo.

O retorno:

#13 0x00007f9879eba7e0 em pam_authenticate (pamh=0x56373c553960, flags=flags@entry=32768) em pam_auth.c:34
#14 0x00007f987a3510de em sudo_pam_verify (pw=, prompt=0x56373c553d00 "[sudo] senha para steve: ", auth=, callback=0x7ffea8406880)
    em auth/pam.c:182
#15 0x00007f987a35052c em verify_user (pw=0x56373c54ce98, prompt=prompt@entry=0x56373c553d00 "[sudo] senha para steve: ", validado=validado@entry=2, callback=callback@entry=0x7ffea8406880) em auth/sudo_au isso.c: 294
#16 0x00007f987a3520e5 em check_user (auth_pw=0x56373c54ce98, mode=, validado=2) em ./check.c:149
#17 0x00007f987a3520e5 em check_user (validado=validado@entrada=2, modo=) em ./check.c:212
#18 0x00007f987a36506d em sudoers_policy_main (argc=argc@entry=1, argv=argv@entry=0x7ffea8406cf0, pwflag=pwflag@entry=0, env_add=env_add@entry=0x56373c5414f0, encerramento=closure@entry=0x7 ffea84069f0) em ./sudoers .c:423
#19 0x00007f987a35eca4 em sudoers_policy_check (argc = 1, argv = 0x7ffea8406cf0, env_add = 0x56373c5414f0, command_infop = 0x7ffea8406a80, argv_out = 0x7ffea8406a88, user_env_out = 0x7ffea 8406a90) em ./policy.c:758
#20 0x000056373aee448f em principal (plugin=0x56373b102480 , user_env_out=0x7ffea8406a90, argv_out=0x7ffea8406a88, command_info=0x7ffea8406a80, env_add=0x56373c5414f0, =0x7ffea8406cf0, argc=1) em ./sudo.c:1342
#21 0x000056373aee448f em principal (argc=, argv=, envp=) em ./sudo.c:261

Nas linhas 181-182 de auth/pam.c, descobri que pam_authenticate é chamado com o sinalizador PAM_SILENT para evitar qualquer saída.

    /* PAM_SILENT impede que o serviço de autenticação gere saída. */
    *pam_status = pam_authenticate(pamh, PAM_SILENT);

informação relacionada