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的输出,也是安全基线检查的重点。

RHEL 用户与组管理:账户数据库与工具链 用户账户类型 root UID=0 系统用户 UID 1–999 普通用户 UID ≥1000 组账户 主组(/etc/passwd 第4字段) 附加组(/etc/group 成员列表) UPG:同名私有组 管理工具 useradd / adduser usermod / groupmod userdel / passwd / chage /etc/passwd(全局可读) alice:x:1001:1001:Alice:/home/alice:/bin/bash ①用户名 ②密码占位 ③UID ④GID ⑤GECOS ⑥家目录 ⑦登录Shell ⚠ 第2字段为空 = 无密码可登录 /etc/shadow(仅root可读) alice:$6$xxx:19800:0:90:7:14:: ①用户名 ②哈希 ③最后修改日 ④最小天数 ⑤最大天数 ⑥警告天数 ⑦宽限天数 ⑧失效日 ⑨保留 登录认证数据流 用户输入 用户名+密码 PAM 认证 pam_unix.so 读取 shadow 校验哈希 检查账户 有效期/Shell

四、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 aliceuid=1001,gid=1001,附加组含wheel、developers、docker
passwd字段getent passwd alice7字段完整,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重置。掌握这些字段与命令之间的对应关系,就能在账户创建、权限调整和离职清理中做到可验证、可回溯。