今天在某机器上新建了一个test账号,然后使用su root时,居然提示我没有权限,具体如下所示:
bash
[test@localhost ~]$ su root
Password:
su: Permission denied
[test@localhost ~]$
我确定密码是对的,试了好几次,都不行。于是,开始翻看系统的各种日志,包括messages、audit、secure,都没发现什么有用的线索。
查找原因
因为使用以前建的admin账号,su root却可以成功。基于以往的经验,我推测肯定是哪里做了配置,导致新建的test账号没有权限。首先,就想到了sshd_config,详细看了下各项参数,发现没有问题。于是,又转战PAM,它在/etc/pam.d下有很多配置:

经常搞安全加固的同学应该比较熟悉这些配置,比如:sshd,passwd,login,password-auth,system-auth等。保险起见,可以将这些配置与其他未加固的机器对比,看看是否有值得怀疑的地方。接着查看这个目录下的其他文件,嘿,看我发现了什么:su?还有su.backup?

好家伙,有backup,说明这个su文件被改过,对比下2个文件 :

su 多了两行:

网上搜下这两行配置的解释:
1. auth sufficient pam_rootok.so
- 作用 :它允许
root用户不需要进一步验证。pam_rootok.so模块会检查当前用户是否是root,如果是,则跳过其他验证步骤。这通常用于一些系统管理命令(如su切换用户),如果执行用户是root,则无需再输入密码。
2. auth required pam_wheel.so group=wheel
- 作用 :表示只有属于
wheel组的用户才被允许进行某些操作,比如使用su切换到其他用户账户。pam_wheel.so模块要求用户必须在指定的wheel组内才能执行此操作。auth required表示该验证模块是必须的,如果验证失败,则整个验证过程失败。group=wheel指定只有wheel组的用户能通过该模块的验证。
总结
pam_rootok.so允许root用户无需密码即可通过验证。pam_wheel.so要求使用su命令时,只有wheel组的用户可以进行身份切换。
看来,导致问题发生的原因找到了,就是下面这个配置引起的:
auth required pam_wheel.so group=wheel
按照上面的解释,说明test用户不在wheel组里面。那么,wheel组有什么用呢?
wheel 组的用途
wheel 组通常用于限制某些高级管理操作,比如使用 su 切换用户。在某些系统上,只有 wheel 组中的用户才能使用 su 切换到 root 用户。
要查看系统中哪些用户属于 wheel 组,可以通过以下几种方式来检查:
1. 使用 grep 命令
可以通过查看 /etc/group 文件,找到 wheel 组及其成员:
bash
[root@localhost pam.d]# grep '^wheel' /etc/group
wheel:x:10:admin
[root@localhost pam.d]#
这表示 wheel 组(组ID为 10)包含 admin 用户。
2. 使用 getent 命令
getent 命令也可以用来查找 wheel 组的成员:
bash
[root@localhost pam.d]# getent group wheel
wheel:x:10:admin
[root@localhost pam.d]#
结果同上面是一样的。
在 /etc/group 文件中,我们还会看到这种形式:
wheel:x:10:root,user1,user2
上面的结果表示 wheel 组的组名为 wheel,组ID为 10,该组包含的成员有 root、user1 和 user2。
字段解释:
-
wheel : 组名,即表示这个组的名字是
wheel。 -
x : 表示密码字段。在大多数现代系统中,组密码功能通常未启用,因此该字段一般设置为
x。密码信息通常存储在/etc/gshadow文件中,而不是/etc/group。 -
10 : 组的 GID (Group ID),每个组都有一个唯一的组标识符。对于
wheel组,GID 通常是10,但这可能会根据系统有所不同。 -
root,user1,user2 : 这是
wheel组中的用户列表。列出的这些用户属于wheel组,意味着他们拥有该组的权限。例如,在某些系统中,只有wheel组的成员可以使用su切换到root用户。这段中包含的用户有root、user1和user2。
我们还会看到,有的组后面没跟用户列表,还是拿wheel组来举例吧:
wheel:x:10:
上面的结果意味着目前没有普通用户被添加到 wheel 组,只有 root 用户默认属于该组。
字段解释:
- wheel : 组名是
wheel。 - x : 表示密码字段。在现代系统中通常未启用组密码,因此这个字段显示为
x。 - 10 : 这是
wheel组的 GID(组标识符)。 - 用户列表为空 : 表示当前没有普通用户被分配到
wheel组,只有root用户(系统默认)属于这个组。
好了,到此为止,我们基本上弄清楚了,为什么会出现test用户无法su root的问题。如何解决这个问题呢?
两种解决方法
将那行配置注释掉,但这么操作,将使系统的安全性降低,不推荐。
将test用户增加到wheel组中。
接下来,就介绍下第二种方法。
如何添加用户到 wheel 组
可以使用以下命令:
bash
sudo usermod -aG wheel username
其中,username 是要添加到 wheel 组的用户名,比如我们创建的test账号。
添加成功后,用户将拥有 wheel 组的权限,比如可能能够使用 su 切换到 root。
参数解释:
在 usermod 命令中,-aG 是两个选项的组合,具体解释如下:
-a 选项
-a 是 append(追加)的意思,表示将用户添加到新的组时不会从其他组中删除。换句话说,它会将用户追加到新的组,同时保持用户在其他组中的现有成员身份。如果不加 -a,用户会从当前所有组中移除,只保留新指定的组。
-G 选项
-G 是 groups 的意思,用于指定要将用户添加到的组列表。你可以通过此选项指定多个组,用户将被加入这些组中。
-aG 的组合
当 -a 和 -G 组合使用时,表示将用户追加到指定的组而不会影响其现有的组成员身份。例如:
所以,上面这条命令的作用是将 username 用户添加到 wheel 组,同时保留该用户在其他组中的成员资格。如果你仅使用 -G 而没有 -a,则会覆盖用户的所有组信息,只保留用户在 wheel 组中的成员身份。