為什麼 pam_exec.so 與 sudo 一起工作,而不是與 su 一起工作?
我正在嘗試根據特殊程序的成功執行允許從正常使用者 shell 進行 root 訪問,目標是同時擁有
su
並sudo
響應新的 PAM 配置。特殊程序是授權的唯一標準。我在 /etc/pam.d/common-auth 中在 Debian 9 上嘗試的配置是:
auth [success=done default=die] pam_exec.so seteuid /usr/bin/whoami
…where
whoami
是一個程序,它作為特殊程序的佔位符返回成功狀態。common-auth 文件的其餘部分已被註釋掉。/etc/pam.d/su 文件有:
auth sufficient pam_rootok.so session required pam_env.so readenv=1 session required pam_env.so readenv=1 envfile=/etc/default/locale session optional pam_mail.so nopen session required pam_limits.so @include common-auth @include common-account @include common-session
結果是
sudo
將被授權,但su
不會:$ su su: Permission denied
(在 Fedora 25 上使用 system-auth 文件的結果相同:sudo 有效,而 su 無效。)
看起來好像
su
只是拒絕與 pam_exec 一起工作。在這一點上,我很茫然,可以使用一些線索來解決這個問題……查看 /var/log/messages,在
su
嘗試時會記錄下來:Mar 18 08:46:39 localhost kernel: [ 61.622184] audit: type=1100 audit(1489841199.166:114): pid=1107 uid=1000 auid=1000 ses=1 msg='op=PAM:authentication acct="root" exe="/bin/su" hostname=? addr=? terminal=/dev/pts/0 res=success' Mar 18 08:46:39 localhost kernel: [ 61.622480] audit: type=1101 audit(1489841199.166:115): pid=1107 uid=1000 auid=1000 ses=1 msg='op=PAM:accounting acct="root" exe="/bin/su" hostname=? addr=? terminal=/dev/pts/0 res=success' Mar 18 08:46:39 localhost kernel: [ 61.623224] audit: type=1103 audit(1489841199.167:116): pid=1107 uid=1000 auid=1000 ses=1 msg='op=PAM:setcred acct="root" exe="/bin/su" hostname=? addr=? terminal=/dev/pts/0 res=failed'
為了比較,以下是發生的情況
sudo
:Mar 18 08:47:00 localhost kernel: [ 82.750720] audit: type=1123 audit(1489841220.294:117): pid=1110 uid=1000 auid=1000 ses=1 msg='cwd="/home/user" cmd=67726570202D69206175646974202F7661722F6C6F672F6D65737361676573 terminal=pts/0 res=success' Mar 18 08:47:00 localhost kernel: [ 82.751369] audit: type=1110 audit(1489841220.295:118): pid=1110 uid=0 auid=1000 ses=1 msg='op=PAM:setcred acct="root" exe="/usr/bin/sudo" hostname=? addr=? terminal=/dev/pts/0 res=failed' Mar 18 08:47:00 localhost kernel: [ 82.751814] audit: type=1105 audit(1489841220.295:119): pid=1110 uid=0 auid=1000 ses=1 msg='op=PAM:session_open acct="root" exe="/usr/bin/sudo" hostname=? addr=? terminal=/dev/pts/0 res=success'
更新
正如@hildred 指出的那樣,我找到了一個反映 Debian 處理此問題的方式的解決方案,儘管有各種命令在不同的上下文中進行身份驗證,但它仍然可以確定成功或失敗。首先,我將展示 Debian 的預設 common-auth 中的相關行:
auth [success=1 default=ignore] pam_unix.so nullok_secure auth requisite pam_deny.so auth required pam_permit.so
這是使用 Qubes 身份驗證提示符的替換:
auth [success=1 default=ignore] pam_exec.so seteuid /usr/lib/qubes/qrexec-client-vm dom0 qubes.VMAuth /bin/grep -q ^1$ auth requisite pam_deny.so auth required pam_permit.so
這個“跳過一個”只允許成功,否則拒絕。
@hildred 的建議是在 pam_exec 行(做出決定的地方)之前用 pam_permit行“準備”堆棧的表現力較差,但也確實有效,它讓我走上了尋找明確解決方案的道路。
我立即看到了兩個問題(除了在 common 而不是一個服務上嘗試實驗性 pam 配置)是 su 始終以 root 身份進行身份驗證,而 sudo 通常以使用者身份進行身份驗證,並且 su 具有足夠的身份驗證行並且您使用公共文件中的括號表示法。括號表示法並不總是設置您的成功狀態。這可以通過在 exec 之前添加 auth requires permit 行或刪除括號表示法來解決,因為您的案例不需要它,或者也可以在根 ok 行上使用括號表示法,以便通過足夠的測試不會設置負面成功.