4. 用户与权限管理
本章介绍 RHEL 9 的用户账户管理、组管理、sudo 授权配置与文件权限控制。这些是系统安全的核心基础,直接决定"谁能访问什么、以何种权限操作",也是第 5 章 SSH 安全配置(密钥认证与访问控制)的前提条件。
4.1 前提条件
- RHEL 9 已完成基础配置(第 1 章),网络已配置(第 3 章)。
- 通过控制台或 SecureCRT(SSH 端口 22)以 root 身份登录。
操作前备份
修改关键账户文件前,先备份:
cp /etc/passwd /etc/passwd.bak
cp /etc/shadow /etc/shadow.bak
cp /etc/group /etc/group.bak
4.2 用户账户管理
4.2.1 创建用户
# 创建用户 ops(本教程全程使用的运维账户)
useradd -m -s /bin/bash -c "Ops Engineer" -G wheel ops
# 设置密码
passwd ops
useradd 常用参数说明:
| 参数 | 含义 |
|---|---|
-m |
创建主目录 /home/<username> |
-s /bin/bash |
指定登录 Shell |
-c "描述" |
设置账户描述(GECOS 字段) |
-G wheel |
加入附加组(wheel 组拥有 sudo 权限) |
-u <UID> |
指定 UID(不指定则自动分配,≥1000) |
-e YYYY-MM-DD |
设置账户过期日期 |
-r |
创建系统账户(UID < 1000,无主目录,用于服务进程) |
4.2.2 修改用户
# 将用户追加加入附加组(-a 必须与 -G 同用,否则会替换所有附加组)
usermod -aG developers ops
# 修改账户描述
usermod -c "Senior Ops Engineer" ops
# 锁定账户(禁止密码登录)
usermod -L ops
# 解锁账户
usermod -U ops
# 强制用户下次登录时修改密码
passwd -e ops
# 查看账户详情
id ops
chage -l ops
usermod -G 与 -aG 的区别
-G wheel 会替换用户所有附加组为仅 wheel;-aG wheel 是追加,保留原有附加组并添加新组。生产环境必须使用 -aG。
4.2.3 删除用户
# 删除用户并同时删除主目录(操作不可逆,执行前确认)
userdel -r ops
删除前确认无运行中进程:
ps aux | grep ops
4.3 组管理
# 创建组
groupadd developers
# 向组中追加用户
usermod -aG developers ops
# 或使用 gpasswd
gpasswd -a ops developers
# 从组中移除用户
gpasswd -d ops developers
# 查看组成员
getent group developers
# 删除组(组内不能有以该组为主组的用户)
groupdel developers
主组与附加组
创建用户时自动生成与用户名相同的主组。-G 参数设置的是附加组,用户可属于多个附加组。id <user> 显示用户 UID、主组 GID 及所有附加组。
4.4 密码策略配置
RHEL 9 使用 pwquality 模块强制密码复杂度,编辑配置文件设置企业级策略:
vim /etc/security/pwquality.conf
推荐生产环境配置:
minlen = 12 # 密码最短长度
minclass = 3 # 至少包含 3 类字符(大写/小写/数字/符号)
difok = 5 # 新旧密码至少有 5 个不同字符
maxrepeat = 3 # 不允许同一字符连续重复超过 3 次
usercheck = 1 # 不允许密码包含用户名
dictcheck = 1 # 检查字典词汇
同步设置密码有效期(影响新建用户的默认策略):
vim /etc/login.defs
关键字段:
PASS_MAX_DAYS 90 # 密码最长有效期(天)
PASS_MIN_DAYS 1 # 密码最短有效期(防止立即改回)
PASS_MIN_LEN 12 # 最短密码长度
PASS_WARN_AGE 7 # 过期前提前警告天数
4.5 sudo 权限配置
sudo 允许普通用户以提升权限执行特定命令,是替代 root 直接登录的企业标准做法。
编辑规范
必须使用 visudo 编辑 sudoers 文件。visudo 在保存时进行语法检查,防止配置错误导致 sudo 不可用。绝对不要直接用 vim /etc/sudoers。
4.5.1 启用 wheel 组(推荐方式)
RHEL 9 默认已有 wheel 组规则,取消注释即可:
visudo
找到以下行并取消注释(删除 #):
%wheel ALL=(ALL) ALL
将用户加入 wheel 组(安装时已完成,此处为参考):
usermod -aG wheel ops
用户重新登录后生效。
4.5.2 使用 sudoers.d 管理自定义规则(最佳实践)
将自定义规则存入独立文件,不修改主配置,便于版本管理和自动化部署:
visudo -f /etc/sudoers.d/ops-team
文件内容示例:
# ops 用户可执行所有命令(需输入密码)
ops ALL=(ALL) ALL
# developers 组可无密码重启指定服务
%developers ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart httpd, \
/usr/bin/systemctl restart nginx
# ansible 自动化账户(仅用于 CI/CD 场景)
ansible ALL=(ALL) NOPASSWD: ALL
设置正确权限:
chmod 440 /etc/sudoers.d/ops-team
4.5.3 验证 sudo 权限
# 查看指定用户的 sudo 权限列表
sudo -l -U ops
# 切换至 ops 用户测试
su - ops
sudo whoami
检查点
sudo whoami 应输出 root。
4.5.4 查看 sudo 操作日志
journalctl | grep sudo
4.6 文件权限管理
4.6.1 权限基础
ls -l /etc/ssh/sshd_config
# 示例输出:-rw------- 1 root root 3526 Jan 1 10:00 /etc/ssh/sshd_config
权限位解读(9 位):
rwx rwx rwx
│ │ └── 其他用户(others)
│ └─────── 所属组(group)
└──────────── 所有者(user/owner)
| 权限 | 符号 | 数值 | 对文件 | 对目录 |
|---|---|---|---|---|
| 读 | r | 4 | 可查看内容 | 可列出目录内容(ls) |
| 写 | w | 2 | 可修改内容 | 可创建 / 删除文件 |
| 执行 | x | 1 | 可运行 | 可进入目录(cd) |
4.6.2 修改权限(chmod)
# 数字方式
chmod 644 /var/www/html/index.html # rw-r--r--(普通文件标准)
chmod 755 /usr/local/bin/myscript # rwxr-xr-x(可执行文件标准)
chmod 700 ~/.ssh # rwx------(私有目录标准)
chmod 600 ~/.ssh/authorized_keys # rw-------(授权密钥文件标准)
# 符号方式
chmod u+x script.sh # 为所有者添加执行权限
chmod go-w /etc/app.conf # 移除组和其他用户的写权限
chmod -R 750 /opt/app/ # 递归设置目录权限
4.6.3 修改所有权(chown)
chown ops /tmp/myfile # 修改所有者
chown ops:developers /tmp/myfile # 修改所有者和所属组
chown -R ops:developers /opt/app/ # 递归修改
chgrp developers /opt/app/ # 只修改所属组
4.6.4 特殊权限位
| 权限 | 设置命令 | 作用 |
|---|---|---|
| SUID | chmod u+s /bin/exec |
执行时以文件所有者权限运行(如 /usr/bin/passwd) |
| SGID | chmod g+s /opt/shared/ |
目录内新建文件继承目录的所属组 |
| Sticky Bit | chmod +t /tmp/ |
目录内文件只能由所有者或 root 删除 |
# 查看特殊权限(s 或 t 出现在执行位)
ls -l /usr/bin/passwd # -rwsr-xr-x(SUID)
ls -ld /tmp # drwxrwxrwt(Sticky Bit)
# 安全审计:查找系统中所有 SUID 文件
find / -perm /4000 -type f 2>/dev/null
4.6.5 访问控制列表(ACL)
当标准 Unix 权限(用户/组/其他三元模型)无法满足精细授权时,使用 ACL:
# 为指定用户赋予 ACL 权限
setfacl -m u:ops:rw /opt/project/config.txt
# 为指定组赋予 ACL 权限
setfacl -m g:developers:rx /opt/project/
# 递归设置 ACL
setfacl -Rm u:ops:rwx /opt/project/
# 查看 ACL
getfacl /opt/project/config.txt
# 移除指定 ACL 条目
setfacl -x u:ops /opt/project/config.txt
# 清除所有 ACL
setfacl -b /opt/project/config.txt
ACL 适用场景
多个不同用户 / 组需要对同一目录设置不同权限;CI/CD 服务账户需要访问某配置文件但不适合加入文件所属组;满足等保合规中"最小权限原则"的精细授权。
4.7 常见问题与排查
| 问题现象 | 排查步骤 |
|---|---|
sudo: ops is not in the sudoers file |
确认用户已加入 wheel 组:id ops;重新登录后生效 |
sudo: /etc/sudoers is world writable |
修复权限:chmod 440 /etc/sudoers |
文件写入提示 Permission denied |
ls -l <file> 检查权限;getfacl <file> 检查 ACL |
| 目录可列出但无法进入 | 目录需要有执行(x)权限才能 cd 进入 |
4.8 实践任务
-
确认
ops用户已存在并加入wheel组:id ops -
通过
visudo -f /etc/sudoers.d/ops-team为ops配置 sudo 权限并验证:sudo -l -U ops su - ops sudo whoami -
创建组
developers,将ops加入:groupadd developers usermod -aG developers ops id ops -
创建目录和文件,设置规范权限:
mkdir -p /opt/project touch /opt/project/app.conf chown ops:developers /opt/project/app.conf chmod 640 /opt/project/app.conf ls -l /opt/project/app.conf -
为
root账户添加对该文件的只读 ACL,并验证:setfacl -m u:root:r /opt/project/app.conf getfacl /opt/project/app.conf
4.9 自测问题
Q1:usermod -G wheel ops 与 usermod -aG wheel ops 有什么区别?
不带 -a 的 -G 会替换用户的所有附加组,仅保留 wheel;带 -a 的 -aG 是追加,保留原有附加组同时添加 wheel。生产环境必须使用 -aG。
Q2:为什么推荐在 /etc/sudoers.d/ 创建独立文件,而不是直接修改 /etc/sudoers?
独立文件便于版本控制和自动化管理(如 Ansible);各角色规则相互独立不干扰;系统升级时 /etc/sudoers 主文件可能被覆盖,而 sudoers.d/ 中的自定义文件不受影响。
Q3:目录权限为 755,但其中某文件权限为 700,ops 用户能否读取该文件?
不能。755 目录允许 ops 进入(x)和列出内容(r),但文件的 700 权限只有文件所有者可访问。目录权限和文件权限各自独立,两者都必须满足。
4.10 章节总结
本章介绍了 RHEL 9 用户与权限管理的完整体系:用户账户生命周期、组管理、密码策略、sudo 授权(推荐 sudoers.d 方式)及文件权限(含 ACL)。这些是最小权限原则的实施基础,也是第 5 章 SSH 密钥认证中目标用户配置的直接前提。