Debian

為什麼 pam_exec.so 與 sudo 一起工作,而不是與 su 一起工作?

  • July 31, 2017

我正在嘗試根據特殊程序的成功執行允許從正常使用者 shell 進行 root 訪問,目標是同時擁有susudo響應新的 PAM 配置。特殊程序是授權的唯一標準。

我在 /etc/pam.d/common-auth 中在 Debian 9 上嘗試的配置是:

auth  [success=done default=die]  pam_exec.so seteuid /usr/bin/whoami

…wherewhoami是一個程序,它作為特殊程序的佔位符返回成功​​狀態。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 行上使用括號表示法,以便通過足夠的測試不會設置負面成功.

引用自:https://unix.stackexchange.com/questions/352292