跳转至

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 实践任务

  1. 确认 ops 用户已存在并加入 wheel 组:

    id ops
    
  2. 通过 visudo -f /etc/sudoers.d/ops-teamops 配置 sudo 权限并验证:

    sudo -l -U ops
    su - ops
    sudo whoami
    
  3. 创建组 developers,将 ops 加入:

    groupadd developers
    usermod -aG developers ops
    id ops
    
  4. 创建目录和文件,设置规范权限:

    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
    
  5. root 账户添加对该文件的只读 ACL,并验证:

    setfacl -m u:root:r /opt/project/app.conf
    getfacl /opt/project/app.conf
    

4.9 自测问题

Q1:usermod -G wheel opsusermod -aG wheel ops 有什么区别?

不带 -a-G替换用户的所有附加组,仅保留 wheel;带 -a-aG追加,保留原有附加组同时添加 wheel。生产环境必须使用 -aG

Q2:为什么推荐在 /etc/sudoers.d/ 创建独立文件,而不是直接修改 /etc/sudoers

独立文件便于版本控制和自动化管理(如 Ansible);各角色规则相互独立不干扰;系统升级时 /etc/sudoers 主文件可能被覆盖,而 sudoers.d/ 中的自定义文件不受影响。

Q3:目录权限为 755,但其中某文件权限为 700ops 用户能否读取该文件?

不能。755 目录允许 ops 进入(x)和列出内容(r),但文件的 700 权限只有文件所有者可访问。目录权限和文件权限各自独立,两者都必须满足。


4.10 章节总结

本章介绍了 RHEL 9 用户与权限管理的完整体系:用户账户生命周期、组管理、密码策略、sudo 授权(推荐 sudoers.d 方式)及文件权限(含 ACL)。这些是最小权限原则的实施基础,也是第 5 章 SSH 密钥认证中目标用户配置的直接前提。