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

Ste*_*e F 5 linux centos sudo pam centos7

我有一台 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
Run Code Online (Sandbox Code Playgroud)

由于某种原因,当我无法进行身份验证时,我看不到 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
Run Code Online (Sandbox Code Playgroud)

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

$ pamtester sudo steve authenticate
Password:
bar
Run Code Online (Sandbox Code Playgroud)

同样,输入正确的密码时我没有得到任何输出。

$ pamtester sudo steve authenticate
Password: 
pamtester: successfully authenticated
Run Code Online (Sandbox Code Playgroud)

似乎 sudo 在某种程度上覆盖或干扰了 pam 输出。为什么 sudo 需要这样做?我可以更改 sudo 的行为以便输出通过吗?

Ste*_*e F 4

我运行 sudo 并使用 GDB 进行回溯。我跟踪面包屑,发现防止 PAM 输出被硬编码到 sudo 中。

回溯:

pam_authenticate 中的 #13 0x00007f9879eba7e0 (pamh=0x56373c553960,flags=flags@entry=32768),位于 pam_auth.c:34
#14 sudo_pam_verify 中的 0x00007f987a3510de (pw=,提示=0x56373c553d00“史蒂夫的[sudo]密码:”,auth=,回调=0x7ffea8406880)
    在 auth/pam.c:182
#15 0x00007F987A35052C在Verify_user中(PW = 0x56373C54CE98,strimpt = stress = stress@entry = 0x56373C5553D00“ [sudo for Steve:for Steve:for Steve:for Steve:for Steve:for Steve:“ 294
#16 check_user 中的 0x00007f987a3520e5 (auth_pw=0x56373c54ce98, mode=, validated=2) at ./check.c:149
#17 check_user 中的 0x00007f987a3520e5 (validated=validated@entry=2, mode=) at ./check.c:212
#18 sudoers_policy_main 中的 0x00007f987a36506d (argc=argc@entry=1、argv=argv@entry=0x7ffea8406cf0、pwflag=pwflag@entry=0、env_add=env_add@entry=0x56373c5414f0、closure=closure@entry=0x7ffea8406 9f0) 在 ./sudoers .c:423
#19 sudoers_policy_check中的0x00007f987a35eca4(argc = 1,argv = 0x7ffea8406cf0,env_add = 0x56373c5414f0,command_infop = 0x7ffea8406a80,argv_out = 0x7ffea8406a88,user_env_out = 0x7ffea840 6a90) 在 ./policy.c:758
主目录中的#20 0x000056373aee448f(插件=0x56373b102480,user_env_out=0x7ffea8406a90,argv_out=0x7ffea8406a88,command_info=0x7ffea8406a80,env_add=0x56373c5414f0,argv=0x 7ffea8406cf0,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);