bio*_*cht 8 linux security users pam su
我无法确定为什么su不像 PAM 配置所暗示的那样表现。简而言之,使用su成为另一个用户应该根据 PAM 配置加载辅助组,但pam_group不添加/etc/security/group.conf组,我们最终只得到我们的 LDAP 组。当以用户身份通过 SSH 登录时,您拥有来自两个来源的组。
我们的设置与默认的 CentOS 6.5 相差不远,我们使用 SSSD 通过 Kerberos / LDAP 提供登录,但/etc/pam.d据我所知,尚未对任何内容进行直接更改,这些更改是由以下人员进行的:
authconfig --updateall --enablesssd --enablesssdauth --enablemkhomedir
Run Code Online (Sandbox Code Playgroud)
当然有单独的/etc/pam.d/suand /etc/pam.d/sshd,但它们都包含相同的文件 wherepam_group.so被调用(分别包括system-auth和password-auth,但这两个包含的文件是相同的)。
的相关部分/etc/pam.d/su:
#%PAM-1.0
auth sufficient pam_rootok.so
auth include system-auth
Run Code Online (Sandbox Code Playgroud)
的相关部分/etc/pam.d/sshd:
#%PAM-1.0
auth required pam_sepermit.so
auth include password-auth
Run Code Online (Sandbox Code Playgroud)
在包含的文件中:
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth required pam_env.so
auth optional pam_group.so
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 500 quiet
auth sufficient pam_sss.so use_first_pass
auth required pam_deny.so
...
Run Code Online (Sandbox Code Playgroud)
通过 SSH 登录时,pam_group.so 行通过添加组/etc/security/group.conf,向登录的任何人添加 'apache' 组(以及其他):
*;*;*;Al0000-2400;apache,devs,rvm
Run Code Online (Sandbox Code Playgroud)
当su - username以 root(或sudo su - ...其他任何人)身份运行并成为另一个用户时,这个 pam_group 似乎不会添加这些额外的组。事实上,以 root 身份登录为您提供这些组(因为 pam_group 完成了它的工作),运行会su - username导致您丢失这些组,因为su从无到有,只添加从 PAM 获得的组(本质上是 LDAP 组,因为 pam_group 是不工作)
在这里你可以看到,最初以 root 身份登录,我有 apache (48)、devs (501) 和 rvm (504),但是运行只是su -以 root 身份登录我丢失了除 root (0) 之外的所有内容。此外,以用户“bob”的身份使用su - bob您可以看到我有很多来自 LDAP 的组(加上来自 /etc/group 的一个有效的硬编码组),但没有来自/etc/security/group.conf.
[root@dev-web pam.d]# id -G
0 48 501 504
[root@dev-web pam.d]# su -
[root@dev-web ~]# id -G
0
[root@dev-web ~]# logout
[root@dev-web pam.d]# su - bob
[bob@dev-web ~]$ id -G
1005001 10 1001000 1001001 1001002 1001003 1001004 1001005 1001008 1001009 1001010 1001011 1001012 1001017 1001018 1001025 1001027 1001028 1001033 1001034
Run Code Online (Sandbox Code Playgroud)
最后,以 bob 身份登录的 SSH 是什么样的 - 我再次拥有 apache (48)、devs (501) 和 rvm (504)。
[bob@dev-web ~]$ id -G
1005001 10 48 501 504 1001000 1001001 1001002 1001003 1001004 1001005 1001008 1001009 1001010 1001011 1001012 1001017 1001018 1001025 1001027 1001028 1001033 1001034
Run Code Online (Sandbox Code Playgroud)
人们可能认为su - username使用 SSH 登录和使用 SSH 登录的区别在于,在 SSH 情况下,使用的各种模块都有一个密码try_first_pass,等等,但由于我们经常使用 Kerberos 登录,因此这些模块没有密码。
如果有助于诊断这种差异,我将提供任何进一步的信息(在合理范围内)。提前致谢!
编辑:
我已经打开 PAM 调试并且pam_group似乎没有触发su- 即使我禁用了pam_rootok所以我必须登录(以确保它实际上尝试通过其余的 pam 堆栈)。无论它在堆栈中的哪个位置,其他项目都会触发(一旦pam_rootok被禁用,因为它的“足够”状态似乎会使堆栈短路)。
我也只sudo想到测试,它似乎有几乎相同的问题。Root 可以sudo对自己并保留组,但sudo对另一个用户只能获得 LDAP 组。/etc/pam.d/sudo只包含/etc/pam.d/system-auth与堆栈su使用相同的堆栈,因此这不足为奇。sudo如果目标用户与当前用户相同,我认为它足够聪明,实际上不会删除权限/切换用户,因此 root 保留组。
我假设你的问题是 su-pam 文件和pam_rootok模块。
#%PAM-1.0
auth sufficient pam_rootok.so
auth include system-auth
Run Code Online (Sandbox Code Playgroud)
该sufficient子句缩短了身份验证过程。因此 system-auth 永远不会被包含在内,这意味着 pam_group 模块永远不会为此会话激活。
然后,叹息我读了你的编辑。不管怎样,这绝对是解决这个问题的一个开始。也许打开 pam_group 的调试来查看它是否返回记录的错误值之一 ( man pam_group)。
关于 sudo,通过 PAM 对用户进行身份验证后,所有帐户信息都将被丢弃/禁用,这实际上是有意义的。它有自己的将用户添加到组的机制。尝试添加preserve_groups相关 sudo 条目的选项。
所有这些让我想知道:为什么 pam 使组模块仅与auth相关。事实上,它应该是account的一部分。