为什么我不能在 sudo pam 堆栈中使用 pam_echo.so?

为什么我不能在 sudo pam 堆栈中使用 pam_echo.so?

我有一台 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

我使用 pamtester 测试了 sudo pam 堆栈,输入错误的密码后得到了预期的结果。

$ 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 sudo_pam_verify 中的 0x00007f987a3510de(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 (validated=validated@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=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

在 auth/pam.c 的第 181-182 行,我发现使用 PAM_SILENT 标志调用 pam_authenticate 以防止任何输出。

    /* PAM_SILENT 阻止身份验证服务生成输出。 */
    *pam_status = pam_authenticate(pamh,PAM_SILENT);

相关内容