7.2 RHCSA 备考:用户与组管理

预计阅读时间:25 分钟

📖 目录

用户和组管理是 RHCSA 的必考模块,涵盖创建、修改、删除用户/组,批量操作,密码策略与特权提权。掌握这些操作是系统管理的基础,考试中通常会有一道独立的用户管理题。

学习目标

  • 熟练使用 useradd/usermod/userdel 管理用户账户,理解各参数的含义与使用场景
  • 掌握密码策略配置(chage),能够按要求设置密码过期、警告和强制修改策略
  • 理解 sudo 提权机制,能够通过 /etc/sudoers 和 /etc/sudoers.d/ 配置精细化的权限控制
  • 掌握批量创建用户的方法,能够从文件导入用户并自动配置 home 目录

前置知识

考试要点

知识点重要程度考试频率说明
创建/修改/删除用户★★★必考useradd -m -s, usermod -aG, userdel -r
创建/修改/删除组★★☆groupadd -g, groupmod -n, groupdel
密码策略(chage)★★★必考-M 最长天数, -m 最短天数, -W 警告天数, -d 强制修改
批量创建用户★★☆newusers 从文件批量导入
sudo 配置★★★visudo, /etc/sudoers.d/, NOPASSWD
/etc/skel 模板★★☆新用户 home 目录自动复制的模板文件

1. 用户管理

用户管理是 Linux 系统管理的基础。每个用户都有一个 UID(用户标识号)、一个主组(GID)、一个 home 目录和一个登录 shell。理解这些属性对于考试至关重要。

Linux 系统将用户信息存储在两个关键文件中:/etc/passwd(用户信息)和 /etc/shadow(密码哈希)。分离存储的设计原因是:/etc/passwd 需要被所有程序读取(如 ls 显示属主名),但密码哈希不能暴露给普通用户,因此单独放在只有 root 可读的 /etc/shadow 中。考试中需要能够查看和理解这些文件的内容。/etc/passwd 中每行代表一个用户,字段用冒号分隔;/etc/shadow 存储加密后的密码和过期策略信息,只有 root 可读。

RHEL 8/9 中,系统用户 UID 范围是 1-999,普通用户 UID 从 1000 开始。创建用户时如果不指定 UID,系统会自动分配下一个可用的 UID。

# 查看用户信息
getent passwd alice
# 输出格式:用户名:密码占位:UID:GID:注释:home:shell
# alice:x:1000:1000:Alice Wang:/home/alice:/bin/bash

# 查看密码信息(需要 root 权限)
sudo getent shadow alice
# 输出格式:用户名:密码哈希:上次修改:最小:最大:警告:不活跃:过期:保留

# 创建用户(自动创建 home 目录和组)
sudo useradd -m -s /bin/bash alice
# 预期输出:无输出表示成功

# 指定 UID 创建
sudo useradd -u 2010 -m -s /bin/bash bob

# 创建用户并加入附加组
sudo useradd -m -G wheel,developers charlie

# 创建系统用户(无 home,无登录 shell)
sudo useradd -r -s /sbin/nologin svc_nginx

# 设置密码
sudo passwd alice

# 修改用户属性
sudo usermod -c "Alice Wang" alice        # 注释(GECOS 字段)
sudo usermod -l alice_new alice            # 改名
sudo usermod -d /home/newhome -m alice    # 移动 home 目录
sudo usermod -aG docker alice             # 加入附加组(-a 追加,不覆盖)
sudo usermod -s /sbin/nologin alice       # 禁止登录

# 锁定/解锁用户
sudo usermod -L alice   # 锁定(在密码前加 !)
sudo usermod -U alice   # 解锁

# 验证用户创建结果
getent passwd alice
# 预期输出:alice:x:1001:1001:Alice Wang:/home/alice:/bin/bash

# 删除用户
sudo userdel alice                 # 保留 home
sudo userdel -r alice              # 同时删除 home

2. 组管理

组是权限管理的基本单位。每个用户有一个主组(创建用户时自动创建)和零个或多个附加组。通过组可以批量管理用户的权限。组信息存储在 /etc/group 和 /etc/gshadow 文件中。

/etc/group 中每行代表一个组,格式为"组名:密码:GID:成员列表"。成员列表用逗号分隔,不包含主组成员(主组成员在 /etc/passwd 的 GID 字段中定义)。

考试中常见的组管理场景包括:创建项目组、将用户加入多个组、修改组名以匹配新的组织结构。理解主组和附加组的区别是关键:主组用于创建文件时的默认组归属,附加组用于访问控制。

# 创建组
sudo groupadd developers
sudo groupadd -g 3000 ops

# 修改组
sudo groupmod -n devteam developers  # 改名
sudo groupmod -g 3001 ops            # 改 GID

# 删除组
sudo groupdel devteam

# 查看组成员
groups alice
id alice
getent group developers
getent passwd alice

# 查看当前用户所属的所有组
groups
id

3. 密码策略

密码策略是系统安全的重要组成部分。RHCSA 考试中经常要求配置密码过期时间、最短使用天数和警告天数。chage 命令是配置密码策略的主要工具。

# 查看用户密码信息
sudo passwd -S alice

# 设置密码过期时间
sudo chage -l alice                         # 查看当前策略
sudo chage -M 90 alice                      # 密码最长使用 90 天
sudo chage -m 7 alice                       # 最短 7 天才能改
sudo chage -W 14 alice                      # 提前 14 天警告
sudo chage -E 2026-12-31 alice              # 账号过期日期
sudo chage -d 0 alice                       # 强制下次登录改密码
sudo chage -I 30 alice                      # 密码过期后 30 天锁定账号

# /etc/login.defs 中的全局默认值
# PASS_MAX_DAYS 90
# PASS_MIN_DAYS 7
# PASS_WARN_AGE 14
# 注意:/etc/login.defs 只影响新用户,已有用户需用 chage 修改

# 密码策略的实际应用示例
# 场景:创建用户并立即要求修改密码
sudo useradd -m -s /bin/bash newuser
sudo passwd newuser
sudo chage -d 0 newuser  # 强制下次登录修改密码

4. 批量创建用户

批量创建用户是 RHCSA 考试的常见考点。newusers 命令可以从文件中批量导入用户,大幅提高效率。理解文件格式和命令参数是成功的关键。

# 准备用户列表文件 users.txt
# 格式:用户名:密码:UID:GID:注释:home:shell
echo "user1:password123:2001:2001:User One:/home/user1:/bin/bash" > users.txt
echo "user2:password456:2002:2002:User Two:/home/user2:/bin/bash" >> users.txt

# 批量创建
sudo newusers users.txt

# 批量设密码(从另一个文件)
sudo pwunconv  # 先解包 shadow
# 编辑 /etc/passwd 中的密码字段
sudo pwconv   # 重新加密到 shadow

# 验证
id user1
id user2
ls -la /home/

5. sudo 提权配置

sudo 是 Linux 系统中最常用的提权机制。通过配置 /etc/sudoers 文件,可以精细化控制用户的命令执行权限。考试中通常会要求配置 sudoers 规则。sudoers 文件的语法必须严格遵循格式,否则会导致 sudo 完全不可用。

sudoers 文件的语法格式为:用户 主机=(运行用户) 命令。例如"alice ALL=(ALL) ALL"表示 alice 可以在任何主机上以任何用户身份执行任何命令。/etc/sudoers.d/ 目录下的文件会被自动读取,是管理 sudo 权限的推荐方式。

# 使用 visudo 编辑 /etc/sudoers(不要直接编辑)

# 常用 sudoers 规则:
# 用户完全提权
alice ALL=(ALL) ALL

# 组提权
%wheel ALL=(ALL) ALL

# 无需密码
alice ALL=(ALL) NOPASSWD: ALL

# 仅允许特定命令
alice ALL=(ALL) /usr/bin/systemctl, /usr/bin/journalctl

# 在 /etc/sudoers.d/ 下创建独立文件(推荐)
echo "alice ALL=(ALL) ALL" | sudo tee /etc/sudoers.d/alice
sudo chmod 440 /etc/sudoers.d/alice

# 验证 sudo 权限
sudo -l -U alice

6. /etc/skel 模板目录

/etc/skel/ 中的文件会自动复制到新用户的 home 目录。自定义初始化环境:

# 添加 .bashrc 别名
echo "alias ll='ls -lah'" | sudo tee -a /etc/skel/.bashrc

# 添加欢迎文件
echo "Welcome to the system" | sudo tee /etc/skel/WELCOME

# 验证:创建新用户后检查其 home 目录
sudo useradd -m -s /bin/bash testuser
ls -la /home/testuser/

7. 完整配置案例:批量创建 20 个用户并分组赋权

真实运维场景:入职 20 名开发人员(dev01–dev20),要求全部加入 devteam 组、统一创建 home 目录、每人生成独立随机密码并强制首次登录修改,其中 dev01–dev05 额外加入 wheel 管理组。用脚本化流程一步到位。

步骤 1:准备组与密码文件

sudo groupadd devteam

# 用 openssl 生成 20 个随机密码(每用户独立,避免明文相同)
for i in $(seq -w 1 20); do
  echo "dev$i:$(openssl rand -base64 12)" >> /root/user-pass.txt
done
head -3 /root/user-pass.txt
# dev01:dG9wU2VjcmV0IQ==
# dev02:cGFzc3dvcmQhMjM=
# dev03:QWNjZXNzR3JhbnQ=

步骤 2:批量创建用户并加入组

for i in $(seq -w 1 20); do
  sudo useradd -m -s /bin/bash -G devteam "dev$i"
done

# 批量设置密码(chpasswd 从标准输入读取 用户名:密码)
sudo chpasswd < /root/user-pass.txt

# 强制首次登录修改密码
for i in $(seq -w 1 20); do
  sudo chage -d 0 "dev$i"
done

步骤 3:dev01–dev05 加入管理组并赋权

for i in $(seq -w 1 5); do
  sudo usermod -aG wheel "dev$i"
done

# 授予 devteam 组系统管理命令(写入 /etc/sudoers.d/)
echo "%devteam ALL=(ALL) /usr/bin/systemctl, /usr/bin/dnf" | sudo tee /etc/sudoers.d/devteam
sudo chmod 440 /etc/sudoers.d/devteam
sudo visudo -c

步骤 4:验证

getent group devteam
# devteam:x:1005:dev01,dev02,...,dev20
id dev01
# uid=2001(dev01) gid=2001(dev01) groups=2001(dev01),1005(devteam),10(wheel)
id dev06
# uid=2006(dev06) gid=2006(dev06) groups=2006(dev06),1005(devteam)
ls -d /home/dev* | wc -l
# 20
sudo -l -U dev01 | tail -2
# User dev01 may run the following commands:
# (ALL) /usr/bin/systemctl, /usr/bin/dnf

8. 故障案例:sudoers 语法错误导致 sudo 全废

现象

# 直接编辑 /etc/sudoers(没用 visudo)保存后,所有用户执行 sudo 都报错:
sudo -l
# >>> /etc/sudoers: syntax error near line 3 <<<
# sudo: parse error in /etc/sudoers near line 3
# sudo: no valid sudoers sources found, quitting
# sudo: unable to initialize policy plugin

恢复流程(pkexec 兜底 + visudo 修复)

# 1. 应急思路:sudo 不可用 ≠ root 不可达,按可达性依次尝试:
#    方案 A:已知 root 密码 → su - root 后 visudo 修复
#    方案 B:本地控制台/图形会话且当前用户可提权 → pkexec visudo
#    (pkexec 走 polkit 授权,完全不经过 sudoers,是 sudo 全废时的兜底通道)

# 方案 B 完整流程:
pkexec visudo
# 弹出鉴权对话框,输入当前用户密码后进入 visudo 编辑界面
# 修复第 3 行语法错误(如删掉多余的逗号、补齐缺失的括号),保存退出

# 2. 修复后用 visudo -c 验证语法
sudo visudo -c
# /etc/sudoers: parsed OK
# /etc/sudoers.d/devteam: parsed OK

# 3. 验证 sudo 恢复正常
sudo -l -U alice
防患于未然:编辑 sudoers 的唯一正确姿势是 visudo——它保存前强制做语法检查,语法错误根本无法保存。若必须远程批量修改,先 cp /etc/sudoers /etc/sudoers.bak 备份,改完立即 visudo -c 校验。

故障案例:newusers 批量导入格式错误

现象

# newusers users.txt 报错但用户部分创建:
sudo newusers users.txt
# newusers: line 3: ... invalid password
# 结果:前两个用户创建成功,第三个失败,数据不一致

原因与修复

# newusers 严格要求 7 个字段、冒号分隔、无多余空格
# 常见错误:① 字段数不对(少写注释或 shell)② 密码含冒号未转义 ③ 文件有 BOM 头

# 排查:用 cat -A 检查隐藏字符
cat -A users.txt
# 确保每行结尾是 $(无多余空格或 ^M)

# 修复:规范格式后重新导入(先清理已创建的半成品用户)
sudo userdel -r user3 2>/dev/null   # 清理部分创建的用户
sudo newusers users.txt              # 重新导入

故障案例:userdel 删除用户时 home 目录残留

现象

# userdel alice 后 home 目录仍在:
sudo userdel alice
ls -la /home/alice
# drwx------  10 alice alice 4096 ... /home/alice

原因与修复

# userdel 不带 -r 只删用户账号,不删 home 目录和邮件池
# 这是设计行为(防止误删数据),但考试中通常要求同时删除

# 正确做法:用 -r 参数
sudo userdel -r alice
# userdel: alice mail spool (/var/mail/alice) not found   ← 邮件池不存在没关系
ls /home/alice 2>&1
# ls: cannot access '/home/alice': No such file or directory  ← home 已删除

# 注意:如果用户有正在运行的进程,userdel 会报 "user alice is currently used by process ..."
# 需要先 kill 进程或用 userdel -rf 强制删除(谨慎使用)

useradd / usermod / userdel 参数对比

操作useraddusermoduserdel
创建/修改/删除创建新用户修改已有用户删除用户
指定 UID-u 2010-u 2010(需谨慎,已拥有文件的 UID 会变)
指定主组-g groupname-g groupname
附加组-G wheel,dev(创建时设置)-aG wheel(追加,-a 必不可少)
home 目录-d /path -m(指定+创建)-d /path -m(移动)-r(同时删除 home)
登录 shell-s /bin/bash-s /sbin/nologin
系统用户-r(UID 1-999)
锁定/解锁-L(锁定)/-U(解锁)

常见错误

常见错误原因解决方法
useradd 报 cannot create home directory磁盘空间不足或权限问题检查 /home 所在分区空间,确认目录权限
usermod -aG 不生效忘记加 -a 参数,覆盖了原有附加组务必使用 -aG(append),不要只用 -G
chage -d 0 后用户无法登录密码策略设置过于严格确认密码策略组合合理,先 -d 0 再 -M 90
visudo 语法错误导致 sudo 不可用/etc/sudoers 文件格式错误用 visudo -c 检查语法,修复后重试
newusers 批量创建失败users.txt 格式不正确确保每行格式为 user:password:uid:gid:comment:home:shell

排查用户管理问题时,建议按以下顺序检查:首先用 id 命令确认用户是否存在以及 UID/GID 信息是否正确,然后用 getent 查看系统数据库中的用户条目,最后检查相关配置文件(/etc/passwd、/etc/shadow、/etc/group)的内容。

实操练习

练习 1:创建用户并配置密码策略

# 任务:创建用户 devops,设置密码 90 天过期,提前 14 天警告
sudo useradd -m -s /bin/bash devops
sudo passwd devops
sudo chage -M 90 -m 7 -W 14 devops
sudo chage -l devops

练习 2:批量创建用户

# 任务:从文件批量创建 5 个用户
cat > /tmp/users.txt << EOF
student1:Passw0rd1:3001:3001:Student One:/home/student1:/bin/bash
student2:Passw0rd2:3002:3002:Student Two:/home/student2:/bin/bash
student3:Passw0rd3:3003:3003:Student Three:/home/student3:/bin/bash
student4:Passw0rd4:3004:3004:Student Four:/home/student4:/bin/bash
student5:Passw0rd5:3005:3005:Student Five:/home/student5:/bin/bash
EOF
sudo newusers /tmp/users.txt
id student1 && id student3

练习 3:sudo 精细化配置

# 任务:让 devops 用户只能执行 systemctl 命令,无需密码
echo "devops ALL=(ALL) NOPASSWD: /usr/bin/systemctl" | sudo tee /etc/sudoers.d/devops
sudo chmod 440 /etc/sudoers.d/devops
sudo visudo -c
sudo -l -U devops

练习 4:用户属性综合操作

# 任务:创建用户并完成一系列属性配置
sudo useradd -m -s /bin/bash -c "Test User" testuser
sudo passwd testuser
sudo usermod -aG wheel testuser
sudo chage -M 60 -m 7 -W 7 testuser
id testuser
getent passwd testuser
sudo chage -l testuser

模拟题

题目 1

创建一个用户 user_exam,UID 为 1500,附加组为 wheel 和 developers,home 目录为 /home/user_exam,登录 shell 为 /bin/bash。设置密码 90 天过期,提前 7 天警告。

参考答案sudo useradd -u 1500 -m -s /bin/bash -G wheel,developers user_examsudo passwd user_examsudo chage -M 90 -W 7 user_exam。验证:id user_exam 确认 UID=1500、groups 含 wheel 和 developers;sudo chage -l user_exam 确认 Maximum number of days=90、Warning number of days=7。

题目 2

编写一个用户列表文件,批量创建 3 个用户(user1、user2、user3),每个用户的密码为 password123,UID 从 4001 开始递增。

参考答案:创建 users.txt 内容为 user1:password123:4001:4001:User One:/home/user1:/bin/bash(每行一个用户,7 个字段冒号分隔)→ sudo newusers users.txt 批量导入 → id user1 && id user3 确认 UID 分别为 4001 和 4003 → sudo passwd -S user1 确认密码已设置。注意:newusers 文件格式必须严格为 user:password:uid:gid:comment:home:shell。

题目 3

配置 sudoers,允许 wheel 组的用户无需密码执行所有命令,并验证配置是否生效。

参考答案sudo visudo 编辑,确保有 %wheel ALL=(ALL) NOPASSWD: ALL 行(RHEL 默认已注释,去掉注释即可)→ sudo visudo -c 确认 parsed OK → 将测试用户加入 wheel 组:sudo usermod -aG wheel testusersudo -l -U testuser 验证输出包含 "(ALL) NOPASSWD: ALL"。

题目 4

创建用户 ops_exam,UID 1800,主组 ops(GID 2800,需先创建),附加组 wheel,home 目录 /home/ops_exam,登录 shell /bin/bash,并设置密码 60 天过期、最短 5 天、提前 7 天警告。

参考答案sudo groupadd -g 2800 opssudo useradd -u 1800 -g 2800 -G wheel -m -s /bin/bash ops_examsudo passwd ops_examsudo chage -M 60 -m 5 -W 7 ops_exam。验证:id ops_exam 应显示 gid=2800(ops) 和 groups 中包含 wheel;sudo chage -l ops_exam 核对三组数字。

题目 5

用户 alice 的密码需要立即失效(下次登录必须改),同时账号在 2026-12-31 过期。写出命令。

参考答案sudo chage -d 0 alice 使密码立即过期;sudo chage -E 2026-12-31 alice 设置账号过期。验证:sudo chage -l alice 中 "Password must be changed" 与 "Account expires" 两行。注意两个参数独立生效,不要漏掉任何一个。

题目 6

创建系统用户 webapp(无 home、无登录 shell、UID 在系统范围),并说明其 GID 特性。

参考答案sudo useradd -r -s /sbin/nologin webapp。-r 表示系统用户,UID 落在 1-999(RHEL 8/9 系统用户 UID 范围),-s /sbin/nologin 禁止登录。注意 -r 默认不创建 home 目录(RHEL 9 若显式加 -m 也可创建)。默认会以用户名创建同名主组,可用 id webapp 验证。

题目 7

批量创建 10 个用户(u01–u10),每个用户的密码为 Passw0rd!,并要求所有用户必须属于 grp_data 组。用脚本完成并验证。

参考答案sudo groupadd grp_data;循环创建:for i in $(seq -w 1 10); do sudo useradd -m -s /bin/bash -G grp_data u$i; echo "u$i:Passw0rd!" | sudo chpasswd; done(或先生成 users.txt 用 newusers 一次性导入)。验证:getent group grp_data 应列出 u01–u10;随机抽查 id u05。注意密码含特殊字符 ! 时用单引号包裹。

题目 8

/etc/sudoers.d/ 下新建文件后 sudo -l 不生效,可能的原因有哪些?如何排查?

参考答案:常见原因:① 文件名以 ~ 或 . 结尾会被 sudoers 忽略(如 devops~ 或 devops.txt);② 文件权限不是 440/400(sudoers 文件只允许 root 可写,权限过宽直接拒绝加载);③ 文件没有 % 前缀导致组规则被当成用户规则。排查:ls -la /etc/sudoers.d/ 检查文件名与权限;sudo visudo -c 确认 "parsed OK" 且包含该文件;sudo -l -U 目标用户 核对输出。

题目 9

用户 bob 需要能重启网络服务但不需要完整 root。写出 /etc/sudoers.d/bob 的配置,使 bob 无需密码即可执行 systemctl restart network。

参考答案echo "bob ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart network" | sudo tee /etc/sudoers.d/bob,然后 sudo chmod 440 /etc/sudoers.d/bob。注意:sudoers 的命令匹配是全路径前缀匹配,写 /usr/bin/systemctl 会放行所有 systemctl 子命令;只放行特定动作时必须把完整参数写全。验证:sudo -l -U bob 显示该条 NOPASSWD 规则。

题目 10

删除用户 carol 及其 home 目录、邮件池,同时需要确认其主组 carol 不再被任何用户使用后一并删除。写出命令。

参考答案sudo userdel -r carol(-r 同时删除 home 与邮件池);检查组是否被占用:getent group carolgrep carol /etc/passwd /etc/group;确认无成员后 sudo groupdel carol。若组内还有其他用户,groupdel 会报 "cannot remove the primary group of user",此时不要强删。

题目 11

需要批量创建 15 个用户(sales01–sales15),要求:① UID 从 3101 开始递增;② 主组为 salesgrp(GID 3100,需先创建);③ 所有用户密码为 Sales@2026;④ 强制首次登录修改密码。用脚本实现并验证。

参考答案:创建组:sudo groupadd -g 3100 salesgrp;生成用户文件:for i in $(seq -w 1 15); do echo "sales$i:Sales@2026:$((3100+i)):3000:Sales User $i:/home/sales$i:/bin/bash"; done > /tmp/sales.txt;批量导入:sudo newusers /tmp/sales.txt;批量设密码:sudo chpasswd < /tmp/sales.txt(或用 sudo pwconv 后验证);强制首次修改:for i in $(seq -w 1 15); do sudo chage -d 0 "sales$i"; done。验证:id sales01 && id sales15 确认 UID/GID;getent group salesgrp 确认成员列表。

题目 12

配置 sudoers 允许 devteam 组的成员执行 /usr/bin/systemctl restart 和 /usr/bin/dnf install 命令,但不允许执行其他命令。写出 /etc/sudoers.d/devteam 的配置内容,并验证语法。

参考答案echo "%devteam ALL=(ALL) /usr/bin/systemctl restart *, /usr/bin/dnf install *" | sudo tee /etc/sudoers.d/devteamsudo chmod 440 /etc/sudoers.d/devteamsudo visudo -c 验证语法(输出 "parsed OK" 表示正确)。注意:sudoers 命令匹配是全路径前缀匹配,/usr/bin/systemctl restart * 只匹配 restart 子命令,不会放行其他子命令。验证:sudo -l -U devteam_user 显示允许的命令列表。

题目 13

用户 user_a 的 UID 为 2001,需要将其 UID 修改为 2501,同时确保其拥有的文件所有者正确更新。写出命令并解释可能的风险。

参考答案sudo usermod -u 2501 user_a 修改 UID。风险:① 如果 user_a 有正在运行的进程,进程可能仍持有旧 UID 的文件句柄;② 某些 NFS 挂载点可能需要手动 chown;③ 该用户主组的 GID 也会自动更新(如果组名与用户名相同)。验证:id user_a 确认 UID=2501;ls -ln /home/user_a 确认文件所有者数字已更新;getent passwd user_a 确认 /etc/passwd 已更新。

题目 14

创建一个用户 user_sec,要求:① 不能通过 SSH 登录(shell 设为 /sbin/nologin);② 密码 30 天后过期;③ 密码过期后锁定 7 天;④ 账号在 2026-12-31 过期。写出完整命令。

参考答案sudo useradd -m -s /sbin/nologin user_secsudo passwd user_secsudo chage -M 30 -I 7 -E 2026-12-31 user_sec。验证:sudo chage -l user_sec 确认:Maximum number of days=30、Number of days of inactivity=7、Account expires=Dec 31 2026。注意:-I 参数设置密码过期后的宽限期,超过此天数账号自动锁定。

题目 15

系统中有 5 个用户(u01–u05)需要临时禁用登录,但保留其 home 目录和数据。30 天后自动恢复。写出实现方案。

参考答案:锁定用户:for u in u01 u02 u03 u04 u05; do sudo usermod -L $u; done(-L 在密码前加 !,禁止密码登录);设置账号过期:for u in u01 u02 u03 u04 u05; do sudo chage -E $(date -d "+30 days" +%Y-%m-%d) $u; done;恢复时 for u in u01 u02 u03 u04 u05; do sudo usermod -U $u; sudo chage -E 99999 $u; done。验证:sudo passwd -S u01 确认 "L"(锁定)状态;sudo chage -l u01 确认过期日期。

完整配置案例 1:批量创建用户并配置完整密码策略

任务背景:公司新入职 10 名运维工程师(ops01–ops10),需要:① 创建用户并加入 ops 组(GID 4000);② 每人生成独立随机密码;③ 配置密码策略:90 天过期、提前 14 天警告、最短 7 天、密码过期后 10 天宽限;④ ops01–ops03 额外加入 wheel 组并授予 sudo 权限;⑤ 所有用户强制首次登录修改密码。

步骤 1:准备组与密码文件

# 创建 ops 组
sudo groupadd -g 4000 ops

# 生成 10 个随机密码
for i in $(seq -w 1 10); do
  echo "ops$i:$(openssl rand -base64 12)" > /root/ops-pass.txt
done
cat /root/ops-pass.txt
# ops01:QmFuV29yazEyMzQ=
# ops02:dGhpc0lzQVzUZXN0
# ...

步骤 2:批量创建用户并设置密码

# 批量创建用户
for i in $(seq -w 1 10); do
  sudo useradd -m -s /bin/bash -g 4000 "ops$i"
done

# 批量设置密码
sudo chpasswd < /root/ops-pass.txt

# 批量设置密码策略
for i in $(seq -w 1 10); do
  sudo chage -M 90 -m 7 -W 14 -I 10 "ops$i"
done

# 强制首次登录修改密码
for i in $(seq -w 1 10); do
  sudo chage -d 0 "ops$i"
done

步骤 3:ops01–ops03 加入管理组并赋权

for i in 01 02 03; do
  sudo usermod -aG wheel "ops$i"
done

# 配置 sudoers
echo "%ops ALL=(ALL) /usr/bin/systemctl, /usr/bin/journalctl, /usr/bin/dnf" | sudo tee /etc/sudoers.d/ops
sudo chmod 440 /etc/sudoers.d/ops
sudo visudo -c

步骤 4:验证

# 验证用户创建
id ops01
# uid=4001(ops01) gid=4000(ops) groups=4000(ops),10(wheel)
id ops05
# uid=4005(ops05) gid=4000(ops) groups=4000(ops)

# 验证密码策略
sudo chage -l ops01
# Last password change                    : Jun 01, 2026
# Password expires                        : Aug 30, 2026
# Password inactive                       : Sep 09, 2026
# Account expires                         : never
# Minimum number of days between password change : 7
# Maximum number of days between password change : 90
# Number of days of warning before password expires : 14

# 验证 sudo 权限
sudo -l -U ops01 | tail -2
# User ops01 may run the following commands:
# (ALL) /usr/bin/systemctl, /usr/bin/journalctl, /usr/bin/dnf

# 验证 home 目录
ls -d /home/ops* | wc -l
# 10
密码安全提示:/root/ops-pass.txt 包含明文密码,验证完成后务必删除:sudo rm /root/ops-pass.txt。生产环境中应使用 Ansible 或 expect 脚本实现密码分发,避免明文密码落盘。

完整配置案例 2:sudoers 精细化权限配置

任务背景:为三个开发团队配置 sudo 权限:devteam 组可以重启 Web 服务,qateam 组可以查看系统日志,lead_dev 用户拥有完整 root 权限(需密码)。

步骤 1:创建 sudoers.d 配置文件

# devteam:只能重启 httpd 和 nginx
echo "%devteam ALL=(root) /usr/bin/systemctl restart httpd, /usr/bin/systemctl restart nginx" | sudo tee /etc/sudoers.d/devteam
sudo chmod 440 /etc/sudoers.d/devteam

# qateam:只能查看日志(只读,无需密码)
echo "%qateam ALL=(root) NOPASSWD: /usr/bin/journalctl, /usr/bin/cat /var/log/*" | sudo tee /etc/sudoers.d/qateam
sudo chmod 440 /etc/sudoers.d/qateam

# lead_dev:完整权限(需密码)
echo "lead_dev ALL=(ALL) ALL" | sudo tee /etc/sudoers.d/lead_dev
sudo chmod 440 /etc/sudoers.d/lead_dev

步骤 2:语法检查与验证

# 验证语法
sudo visudo -c
# /etc/sudoers: parsed OK
# /etc/sudoers.d/devteam: parsed OK
# /etc/sudoers.d/qateam: parsed OK
# /etc/sudoers.d/lead_dev: parsed OK

# 验证各用户权限
sudo -l -U devteam_user
# User devteam_user may run the following commands:
# (root) /usr/bin/systemctl restart httpd, /usr/bin/systemctl restart nginx

sudo -l -U qateam_user
# User qateam_user may run the following commands:
# (root) NOPASSWD: /usr/bin/journalctl, /usr/bin/cat /var/log/*

sudo -l -U lead_dev
# User lead_dev may run the following commands:
# (ALL) ALL

步骤 3:测试权限边界

# 测试 devteam 能否重启 httpd(应该成功)
sudo -u devteam_user sudo systemctl restart httpd

# 测试 devteam 能否重启 nginx(应该成功)
sudo -u devteam_user sudo systemctl restart nginx

# 测试 devteam 能否执行其他命令(应该失败)
sudo -u devteam_user sudo dnf update
# [sudo] password for devteam_user:
# Sorry, user devteam_user is not allowed to execute '/usr/bin/dnf update' as root.
最小权限原则:sudoers 配置遵循最小权限原则——只授予用户完成工作所需的最小命令集。用 NOPASSWD 可以避免频繁输入密码,但只应在信任的用户和特定命令上使用。

最佳实践

  • 修改用户前先用 id 和 getent 确认当前状态,避免误操作
  • usermod -aG 中的 -a 参数至关重要,遗漏会覆盖用户的所有附加组
  • 始终使用 visudo 编辑 sudoers,直接编辑可能导致语法错误使 sudo 完全不可用
  • 批量创建用户后务必逐个验证(id、getent passwd),确保导入成功
  • 密码策略配置后用 chage -l 验证,确认所有参数已正确应用

验证 checklist

id alice                  # UID/GID/组
getent passwd alice       # 用户数据库条目
getent group developers   # 组数据库条目
sudo -l -U alice          # sudo 权限
sudo chage -l alice       # 密码策略
ls -la /home/alice        # home 目录及 /etc/skel 文件

学习检查点

学完本章后,请检验自己是否掌握以下内容:

检查项自测问题验证方法
概念理解能用自己的话解释 /etc/passwd、/etc/shadow、/etc/group 文件结构尝试向他人讲解
命令操作能不查文档完成用户创建、密码设置和组管理操作在终端实际执行
原理掌握能说出用户认证流程和密码哈希存储原理画出流程图
故障排查能独立排查用户无法登录或权限不足的问题模拟故障并修复
最佳实践能说明为什么需要为系统用户设置密码锁定和过期策略对比不同方案

本章总结

用户与组管理是 RHCSA 高频考点,核心是掌握 useradd/usermod/userdel 三个命令,以及 /etc/passwd、/etc/group、/etc/sudoers 三个关键文件。批量场景优先写脚本或用 newusers 导入,密码策略统一用 chage 配置,不要直接修改 /etc/shadow。

延伸阅读

补充知识点

用户信息查询命令汇总

# 查看当前登录用户
whoami
who
w

# 查看用户信息
id alice
getent passwd alice
finger alice  # 如果安装了 finger 工具

# 查看密码状态
sudo passwd -S alice
sudo chage -l alice

home 目录权限管理

新创建用户的 home 目录默认权限为 700(只有所有者可以访问)。如果需要调整默认权限,可以在 /etc/login.defs 中修改 HOME_MODE 参数,或在 /etc/skel 中配置相应的权限设置。

# 查看 home 目录权限
ls -la /home/

# 修改 home 目录权限
chmod 750 /home/alice

# 确保 home 目录的所有权正确
chown alice:alice /home/alice

PAM 与密码复杂度

除了 chage 配置的密码策略外,PAM(Pluggable Authentication Modules)模块可以配置密码复杂度要求。考试中可能涉及 /etc/security/pwquality.conf 文件的配置。

# /etc/security/pwquality.conf 常用配置
# minlen = 12        密码最小长度
# dcredit = -1       至少包含 1 个数字
# ucredit = -1       至少包含 1 个大写字母
# lcredit = -1       至少包含 1 个小写字母
# ocredit = -1       至少包含 1 个特殊字符

用户账户文件详解

/etc/passwd 文件是用户账户的核心配置文件,每行包含七个字段,用冒号分隔。理解这些字段对于排查用户管理问题至关重要。考试中经常需要查看和理解这些文件的内容。密码字段在 /etc/passwd 中显示为 x,实际的加密密码存储在 /etc/shadow 中。

字段名称示例值说明
1用户名alice登录名,系统内唯一
2密码占位xx 表示密码在 /etc/shadow;空表示无密码可登录
3UID1000普通用户 1000+,系统用户 1-999,0 为 root
4GID1000主组编号,对应 /etc/group
5GECOS 注释Alice Wang全名/部门等说明信息,可为空
6home 目录/home/alice登录后的初始工作目录
7登录 shell/bin/bash/sbin/nologin 表示禁止交互登录
# /etc/passwd 字段说明
# 用户名:密码占位:UID:GID:注释:home目录:登录shell
# alice:x:1000:1000:Alice Wang:/home/alice:/bin/bash

# /etc/shadow 字段说明
# 用户名:加密密码:上次修改密码的天数:密码最小使用天数:密码最大使用天数:警告天数:密码过期后宽限天数:账号过期日期:保留字段
# alice:$6$xxx:19000:7:90:14:30:::19723

考试中常见的用户管理操作包括:创建用户并指定 UID、将用户加入附加组、配置密码策略、设置 sudo 权限。这些操作通常会结合在一起出题,例如"创建用户并配置密码过期策略,然后将其加入 wheel 组"。掌握这些操作的组合应用是通过考试的关键。建议在备考时多做练习,熟悉各种命令的参数和用法。

考试时间管理建议

RHCSA 考试时间紧张,用户管理题目通常需要在 10-15 分钟内完成。建议先理清需求再动手操作,避免反复修改。创建用户的完整流程是:创建用户 → 设置密码 → 配置密码策略 → 加入附加组 → 配置 sudo 权限 → 验证。按照这个流程操作可以避免遗漏关键步骤。

↑ 回到顶部