今天在某机器上新建了一个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
组中的成员身份。