我的 RHEL 7.6 服务器上有一个普通用户,当 SELinux 关闭时,su 命令可以正常工作。但是当 SElinux 开启时,su 命令不再起作用。在 PAM 源中,我发现
#ifndef HELPER_COMPILE
if (geteuid() || SELINUX_ENABLED)
return PAM_UNIX_RUN_HELPER;
#endif
如果 SELinux 已打开,则使用特殊命令unix_chkpwd
来检查密码。这个命令有一段代码:
user = getuidname(getuid());
/* if the caller specifies the username, verify that user
matches it */
if (strcmp(user, argv[1])) {
user = argv[1];
/* no match -> permanently change to the real user and proceed */
if (setuid(getuid()) != 0)
return PAM_AUTH_ERR;
在我的例子中,user 是普通用户名,argv[1] 是 root,在这种情况下,setuid 是针对普通用户的 uid 执行的。你知道为什么会这样吗?有什么方法可以让 su 在 SELinux 开启时工作吗?
答案1
从我的 RHEL 7.9 系统:
semanage login -l | more
Login Name SELinux User MLS/MCS Range Service
__default__ unconfined_u s0-s0:c0.c1023 *
root unconfined_u s0-s0:c0.c1023 *
system_u system_u s0-s0:c0.c1023 *
这是 RHEL 的默认设置,如果修改了它,那么我就会遇到su
在 selinux 强制执行时无法工作的情况,即使用户在wheel
组中也是如此。我相信这归结为了解如何使用 selinux 添加那些应该允许 su 正确的 selinux 标签或上下文的wheel组用户。
可能是这样的visudo
:
%wheel ALL=(ALL) TYPE=sysadm_t ROLE=sysadm_r ALL
这是来自 v3r4 stig,这是我经历过的如果 SELinux 开启,则非 root 用户会出现 su 问题在尝试应用该语义安全指令后。执行 asetenforce 0
并且su
会按预期工作。如果您不知道 STIG 的含义或从未执行过semange
命令,那么这可能不是您的原因。
我现在认为,在 RHEL 7 中,如果任何非 root 用户愿意,su
那么他们需要加入该wheel
组。我不知道在什么/etc/?
文件中设置了可以撤消该操作并允许任何用户的位置。su
但传统的简单方面只有wheel组用户才能su,一般默认是独立于selinux的。