7.2 RHCSA 备考:用户与组管理
预计阅读时间:25 分钟
📖 目录
用户和组管理是 RHCSA 的必考模块,涵盖创建、修改、删除用户/组,批量操作,密码策略与特权提权。掌握这些操作是系统管理的基础,考试中通常会有一道独立的用户管理题。
学习目标
- 熟练使用 useradd/usermod/userdel 管理用户账户,理解各参数的含义与使用场景
- 掌握密码策略配置(chage),能够按要求设置密码过期、警告和强制修改策略
- 理解 sudo 提权机制,能够通过 /etc/sudoers 和 /etc/sudoers.d/ 配置精细化的权限控制
- 掌握批量创建用户的方法,能够从文件导入用户并自动配置 home 目录
前置知识
- 1.7:用户与权限管理 用户与权限管理——用户/组/权限基础概念
- 1.8:软件包管理 软件包管理——RHEL 环境准备
- 2.1:Shell 脚本入门 Shell 脚本入门——批量创建用户脚本基础
- 2.3:系统信息与性能查看 网络基础——SSH 登录与远程操作
考试要点
| 知识点 | 重要程度 | 考试频率 | 说明 |
|---|---|---|---|
| 创建/修改/删除用户 | ★★★ | 必考 | 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
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 参数对比
| 操作 | useradd | usermod | userdel |
|---|---|---|---|
| 创建/修改/删除 | 创建新用户 | 修改已有用户 | 删除用户 |
| 指定 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_exam;sudo passwd user_exam;sudo 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 testuser → sudo -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 ops → sudo useradd -u 1800 -g 2800 -G wheel -m -s /bin/bash ops_exam → sudo passwd ops_exam → sudo 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 carol 与 grep 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/devteam;sudo chmod 440 /etc/sudoers.d/devteam;sudo 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_sec;sudo passwd user_sec;sudo 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
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.
最佳实践
- 修改用户前先用 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。
延伸阅读
- 1.7:用户与权限管理 用户与权限管理
- 5.1:Linux 安全加固 Linux 安全加固——sudo 配置
补充知识点
用户信息查询命令汇总
# 查看当前登录用户
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 | 密码占位 | x | x 表示密码在 /etc/shadow;空表示无密码可登录 |
| 3 | UID | 1000 | 普通用户 1000+,系统用户 1-999,0 为 root |
| 4 | GID | 1000 | 主组编号,对应 /etc/group |
| 5 | GECOS 注释 | Alice Wang | 全名/部门等说明信息,可为空 |
| 6 | home 目录 | /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 权限 → 验证。按照这个流程操作可以避免遗漏关键步骤。
↑ 回到顶部