tas*_*ket 5 fedora pam debian 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
Run Code Online (Sandbox Code Playgroud)
...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
Run Code Online (Sandbox Code Playgroud)
结果是sudo将被授权,但su不会是:
$ su
su: Permission denied
Run Code Online (Sandbox Code Playgroud)
(在 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'
Run Code Online (Sandbox Code Playgroud)
为了比较,这里是发生了什么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'
Run Code Online (Sandbox Code Playgroud)
更新
正如@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
Run Code Online (Sandbox Code Playgroud)
这是利用 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
Run Code Online (Sandbox Code Playgroud)
这个“跳过一个”只允许成功,否则拒绝。
@hildred 建议在 pam_exec 行(做出决定的地方)之前用 pam_permit 行“填充”堆栈的表现力较差,但也确实有效,它使我走上了寻找明确解决方案的道路。
我立即看到两个问题(除了在通用而不是仅一项服务上尝试实验性 pam 配置之外)是 su 始终以 root 身份进行身份验证,而 sudo 通常以用户身份进行身份验证,并且 su 有一个足够的身份验证行,您可以使用公共文件中的括号符号。括号符号并不总是设置您的成功状态。可以通过在 exec 之前添加 auth require allowed 行或删除括号表示法来解决此问题,因为您的用例不需要它,或者在 root ok 行上使用括号表示法,以便未通过足够的测试不会设置负面成功。
| 归档时间: |
|
| 查看次数: |
2042 次 |
| 最近记录: |