為什麼我不能在 sudo pam 堆棧中使用 pam_echo.so?
我有一台 CentOS 7 機器,我想在 sudo 期間身份驗證失敗時顯示一條消息。我試圖通過在 /etc/pam.d/sudo 中添加 pam_echo 行來做到這一點。
為了進行測試,我創建了一個文件 /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 的行為以便輸出通過嗎?
我執行 sudo 並使用 GDB 進行回溯。我跟踪了麵包屑,發現阻止 PAM 輸出被硬編碼到 sudo 中。
回溯:
#13 0x00007f9879eba7e0 in pam_authenticate (pamh=0x56373c553960, flags=flags@entry=32768) at pam_auth.c:34 #14 0x00007f987a3510de in sudo_pam_verify (pw=, prompt=0x56373c553d00 "[sudo] 史蒂夫的密碼:", auth=, callback=0x7ffea8406880) 在 auth/pam.c:182 #15 0x00007f987a35052c in verify_user (pw=0x56373c54ce98, prompt=prompt@entry=0x56373c553d00 "[sudo] 史蒂夫的密碼:",validated=validated@entry=2, callback=callback@entry=0x7ffea8406880) at auth/sudo_auth.c: 294 #16 0x00007f987a3520e5 in check_user (auth_pw=0x56373c54ce98, mode=, valid=2) at ./check.c:149 #17 0x00007f987a3520e5 in check_user (validated=validated@entry=2, mode=) at ./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) at ./ .c:423 #19 0x00007f987a35eca4 在 sudoers_policy_check (argc=1, argv=0x7ffea8406cf0, env_add=0x56373c5414f0, command_infop=0x7ffea8406a80, argv_out=0x7ffea8406a88, user_env_out=0x7ffea8406) at8007./c:a #20 0x000056373aee448f in main (plugin=0x56373b102480 , user_env_out=0x7ffea8406a90, argv_out=0x7ffea8406a88, command_info=0x7ffea8406a80, env_add=0x56373c5414f0, argv=0x7ffea8406cf0, argc=1) at ./sudo.c:1342 #21 0x000056373aee448f 在 main (argc=, argv=, envp=) at ./sudo.c:261
在 auth/pam.c 的第 181-182 行,我發現使用 PAM_SILENT 標誌呼叫 pam_authenticate 以防止任何輸出。
/* PAM_SILENT 阻止身份驗證服務生成輸出。*/ *pam_status = pam_authenticate(pamh, PAM_SILENT);