
我有一台 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 中。
回溯:
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 verify_user 中的#15 0x00007f987a35052c (pw=0x56373c54ce98,prompt=prompt@entry=0x56373c553d00“史蒂夫的[sudo]密碼:”,validated=idated,vvvall uth/sudo_auth .c : 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_addea8406cf0,pwflag=pwflag@entry=0,env_addff=env_addr. ea840, 69f0) 在./sudoers .c:423 #19 sudoers_policy_check中的0x00007f987a35eca4(argc = 1,argv = 0x7ffea8406cf0,env_add = 0x56373c5414f0,command_infop = 0x7ffea_ff x7ffea84, 06a90) 在 ./policy.c:758 主目錄中的#20 0x000056373aee448f(外掛程式=0x56373b102480,user_env_out=0x7ffea8406a90,argv_out=0x7ffea8406a88,command_info=6070fffea,ffffffffffffffff,ffffffffffff,fffffff7 ea8406cf0,argc=1) 在 ./sudo.c:1342 #21 0x000056373aee448f in 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);