2. RHEL用户与组管理机制
在RHEL中,用户与组管理并不是“改几个文件”这么简单,而是一套由内核UID/GID、用户态工具、认证数据库和PAM共同协作的机制。理解这套机制,才能在创建账户、调整权限、排查登录失败时做到心中有数。本节从账户类型入手,逐层拆解/etc/passwd与/etc/shadow的字段含义,再通过useradd、usermod、userdel的实战操作,把“是什么”落到“怎么做”。
一、用户账户的三种类型
RHEL把用户账户按用途分为三类,它们的UID范围和生命周期管理策略不同:
- 超级用户(root):UID固定为0。它不受普通权限检查约束,是系统管理的最终入口。生产环境中应限制直接登录,改用
sudo提权。 - 系统用户:UID通常从1到999(RHEL 7/8/9默认
UID_MIN为1000,系统用户上限为999)。它们供守护进程(如sshd、nginx、chrony)使用,一般不设可登录Shell,也不设密码过期策略。 - 普通用户:UID从1000开始向上分配,供真实人员登录使用,拥有独立家目录、可设置密码策略、可加入附加组。
UID的分配规则由/etc/login.defs控制,关键参数包括UID_MIN、UID_MAX、GID_MIN、GID_MAX、SYS_UID_MIN、SYS_UID_MAX。使用useradd创建普通用户时,系统会从UID_MIN开始寻找第一个未占用的UID;使用useradd -r创建系统用户时,则从SYS_UID_MIN到SYS_UID_MAX范围内分配。
二、组账户与私有组机制
组是权限的集合载体。RHEL默认启用用户私有组(UPG,User Private Group)机制:创建用户alice时,若未指定-g,系统会同时创建一个同名组alice,并把alice作为该组的唯一成员。这样用户新建文件的属组就是自己的私有组,避免多个用户共享同一主组时互相越权。
组分为两类:主组(primary group)记录在/etc/passwd第4字段,决定用户新建文件的默认属组;附加组(supplementary group)记录在/etc/group的成员列表中,用于额外授权,例如把用户加入wheel组以获得sudo权限。一个用户只能有一个主组,但可以有多个附加组。
三、/etc/passwd与/etc/shadow结构
/etc/passwd是全局可读的用户账户数据库,每行7个字段,以冒号分隔:
alice:x:1001:1001:Alice Wang:/home/alice:/bin/bash
字段: 1 2 3 4 5 6 7
1 用户名 2 密码占位符(x) 3 UID 4 GID
5 GECOS注释 6 家目录 7 登录Shell
第2字段的x表示密码哈希已迁移到/etc/shadow,这是现代RHEL的默认做法。若该字段为空,表示无密码即可登录,属于严重安全隐患。
/etc/shadow仅root可读,每行9个字段,是认证策略的核心:
alice:$6$xxxx...:19800:0:90:7:14::
字段: 1 2 3 4 5 6 7 8 9
1 用户名 2 密码哈希 3 最后修改日(自1970-01-01起的天数)
4 最小使用天数 5 最大使用天数 6 过期前警告天数
7 宽限天数 8 账户失效日 9 保留字段
例如第3字段19800对应2024-03-15左右;第5字段90表示密码90天后必须更换;第6字段7表示到期前7天开始警告;第7字段14表示密码过期后仍有14天宽限期可登录并强制改密。这些字段直接决定chage -l alice的输出,也是安全基线检查的重点。
四、useradd / usermod / userdel 实战
下面以创建用户alice为例,走一遍完整流程。假设当前系统UID_MIN=1000,且1000已被占用。
1. 创建用户并指定附加组
# 创建 alice,主组自动为 alice,附加组 wheel 和 developers
useradd -m -s /bin/bash -G wheel,developers -c "Alice Wang" alice
# 查看结果
id alice
# uid=1001(alice) gid=1001(alice) groups=1001(alice),10(wheel),1002(developers)
grep alice /etc/passwd
# alice:x:1001:1001:Alice Wang:/home/alice:/bin/bash
参数说明:-m强制创建家目录并复制/etc/skel模板;-s指定登录Shell;-G指定附加组(多个用逗号分隔);-c写入GECOS注释。若省略-m,RHEL默认由CREATE_HOME yes决定是否创建家目录,建议显式写出。
2. 设置密码与有效期策略
# 设置初始密码
echo "Init@2024" | passwd --stdin alice
# 设置密码策略:最小1天、最大90天、警告7天、宽限14天
chage -m 1 -M 90 -W 7 -I 14 alice
# 查看策略
chage -l alice
# 最近一次密码修改时间:Mar 15, 2024
# 密码过期时间:Jun 13, 2024
# 密码失效时间:Jun 27, 2024
# 账户过期时间:never
3. 修改用户属性
# 追加附加组(-a 必须与 -G 连用,否则会覆盖原有附加组)
usermod -aG docker alice
# 修改登录Shell
usermod -s /bin/zsh alice
# 锁定账户(在shadow密码哈希前加 !)
usermod -L alice
# 解锁
usermod -U alice
usermod -G docker alice会把alice的附加组替换为只有docker,导致原有的wheel、developers全部丢失。追加附加组必须使用-aG。
4. 删除用户
# 仅删除账户,保留家目录和邮件
userdel alice
# 删除账户并同时删除家目录、邮件池
userdel -r alice
# 删除前先确认该用户是否仍有运行进程
ps -u alice
# 若有进程,先终止或改用 userdel -f(强制)
删除用户后,应检查/etc/group中是否残留该用户作为附加组成员的记录,以及/home、/var/spool/mail下是否还有遗留文件。对于已离职人员的账户,安全基线通常要求先锁定(usermod -L)并设置账户失效日(usermod -e 2024-12-31 alice),确认无业务依赖后再执行删除。
五、结果验证与判断依据
完成上述操作后,可用以下命令交叉验证:
| 检查项 | 命令 | 预期结果 |
|---|---|---|
| UID/GID/组 | id alice | uid=1001,gid=1001,附加组含wheel、developers、docker |
| passwd字段 | getent passwd alice | 7字段完整,Shell为/bin/zsh |
| shadow策略 | chage -l alice | 最大90天、警告7天、宽限14天 |
| 家目录 | ls -ld /home/alice | 属主alice,权限700或750 |
| 组文件 | getent group wheel | 成员列表包含alice |
如果id alice显示的附加组与预期不符,优先检查usermod是否漏写-a;如果chage -l显示“密码必须修改”,说明密码已过期,需用passwd alice重置。掌握这些字段与命令之间的对应关系,就能在账户创建、权限调整和离职清理中做到可验证、可回溯。