为什么 pam_exec.so 与 sudo 一起使用,而不是与 su 一起使用?

为什么 pam_exec.so 与 sudo 一起使用,而不是与 su 一起使用?

我试图根据特殊程序的成功执行来允许从常规用户 shell 进行 root 访问,目标是同时拥有这两者susudo响应新的 PAM 配置。特别计划是授权的唯一标准。

我在 Debian 9 上尝试的 /etc/pam.d/common-auth 的配置是:

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

...其中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 上得到相同的结果: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'


更新

我找到了一个反映 Debian 处理这个问题的方式的解决方案,尽管有各种命令在不同的上下文中进行身份验证,但正如 @hildred 指出的那样,该解决方案仍然能够确定成功或失败。首先,我将显示 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_permit 行“启动”堆栈pam_exec 行(做出决定的地方)表达能力较差,但也有效,它让我走上了寻找清晰解决方案的道路。

答案1

我立即看到两个问题(除了在通用而不是仅一项服务上尝试实验性 pam 配置之外)是 su 始终以 root 身份进行身份验证,而 sudo 通常以用户身份进行身份验证,并且 su 有一个足够的身份验证行,您可以使用公共文件中的括号符号。括号符号并不总是设置您的成功状态。可以通过在 exec 之前添加 auth require allowed 行或删除括号表示法来解决此问题,因为您的用例不需要它,或者在 root ok 行上使用括号表示法,以便未通过足够的测试不会设置负面成功。

相关内容