7.3 RHCSA 备考:文件权限与 ACL

预计阅读时间:24 分钟

📖 目录

RHCSA 考试要求熟练掌握传统权限管理(ugo/rwx)和 ACL(访问控制列表),以及特殊权限位(SUID/SGID/Sticky Bit)。这些知识点是 Linux 安全模型的核心,考试中通常结合共享目录场景出题。

学习目标

  • 熟练使用 chmod/chown/chgrp 管理文件和目录的基本权限,理解符号模式与数字模式的对应关系
  • 掌握 SUID、SGID、Sticky Bit 三种特殊权限位的作用、设置方法及安全影响
  • 能够使用 ACL(getfacl/setfacl)实现精细化的访问控制,理解 mask 的工作原理
  • 理解 umask 机制,能够根据需求配置合理的默认权限掩码

前置知识

考试要点

知识点重要程度考试频率说明
chmod / chown / chgrp★★★必考符号模式与数字模式,递归修改
SUID★★★chmod u+s / 4755,find 查找 SUID 文件
SGID★★★目录 SGID 使新建文件继承组所有权
Sticky Bit★★☆chmod o+t / 1777,用户只能删自己的文件
ACL(getfacl/setfacl)★★★必考-m 修改, -x 删除, -d 默认 ACL, -R 递归
ACL mask★★☆mask 限制 ACL 用户和组的最大有效权限
umask★★☆默认权限掩码,文件 666-umask,目录 777-umask

1. 基本权限管理

Linux 文件权限分为三组:所有者(user)、所属组(group)、其他人(other)。每组有三种权限:读(r=4)、写(w=2)、执行(x=1)。掌握权限的符号模式和数字模式是考试的基础。

权限管理的核心命令是 chmod、chown 和 chgrp。chmod 用于修改权限,chown 用于修改所有者和所属组,chgrp 用于仅修改所属组。这三个命令是考试中使用频率最高的权限管理命令。

权限的数字模式是考试的重点,需要熟记:r=4, w=2, x=1。例如 755 表示所有者 rwx(7),组 r-x(5),其他人 r-x(5)。常见的权限组合有:755(可执行文件)、644(普通文件)、700(私有目录)、600(私有文件)。

# 符号模式
chmod u+rwx file    # 所有者加 rwx
chmod g-w file      # 组移除 w
chmod o=r file      # 其他人设为只读
chmod a+x script.sh # 所有人加执行

# 数字模式
chmod 755 script.sh  # rwxr-xr-x
chmod 644 file.txt   # rw-r--r--
chmod 600 id_rsa     # rw-------
chmod 700 private/   # rwx------

# 修改所有权
chown alice:developers file
chown alice: file         # 不改组
chown :developers file    # 只改组
chown -R alice: /home/alice  # 递归

# 仅改组
chgrp developers file

# 验证权限修改结果
ls -l script.sh
# 预期输出:-rwxr-xr-x 1 user group 1234 Jul 15 10:00 script.sh

ls -ld private/
# 预期输出:drwx------ 2 user group 4096 Jul 15 10:00 private/

2. 特殊权限位

SUID(Set User ID)

当可执行文件设置了 SUID,普通用户运行它以文件所有者的权限执行。考试需要能识别和设置 SUID。典型例子是 /usr/bin/passwd,普通用户通过 SUID 以 root 权限修改密码。SUID 是一个安全敏感的权限,滥用可能导致系统被攻破。

SUID 只对可执行文件有效,对目录设置 SUID 没有意义。在 ls -l 输出中,SUID 显示为所有者执行位上的 s(小写表示有执行权限,大写 S 表示没有执行权限)。

# 设置 SUID(文件所有者获得执行时的特权)
chmod u+s program       # 符号模式
chmod 4755 program      # 数字模式(4 开头)

# 查找所有 SUID 文件
find / -perm -4000 -type f 2>/dev/null

# 典型 SUID 文件
ls -l /usr/bin/passwd   # rwsr-xr-x(s 在 x 位置)

SGID(Set Group ID)

对目录设置 SGID 后,在该目录下创建的文件自动继承目录的组所有权。这是创建共享工作目录的关键技术,确保团队成员创建的文件都属于同一组。

# 设置 SGID
chmod g+s /shared/project   # 符号模式
chmod 2770 /shared/project  # 数字模式(2 开头)

# 验证:该目录下新建文件自动属于 project 组
touch /shared/project/test.txt
ls -l /shared/project/test.txt   # 组 = project

SUID / SGID / Sticky Bit 对比

特殊权限作用对象数字符号典型场景安全风险
SUID可执行文件4u+spasswd(以 root 身份改密码)高:可能被利用提权
SGID文件:继承组
目录:新文件继承目录组
2g+s共享工作目录(/shared/project)中:组权限可能超出预期
Sticky Bit目录1o+t/tmp(用户只能删自己的文件)低:仅限制删除操作

记忆口诀:SUID=以属主跑、SGID=跟组走、Sticky=各管各。

Sticky Bit

设置 Sticky Bit 的目录中,用户只能删除自己的文件(典型应用:/tmp)。这防止用户互相删除文件,是多用户环境下的重要安全机制。

# 设置 Sticky Bit
chmod o+t /shared      # 符号模式
chmod 1777 /shared     # 数字模式(1 开头)

# 验证
ls -ld /tmp            # drwxrwxrwt(t 在最后)
ls -ld /shared         # drwxrwxrwt

3. ACL 访问控制列表

当基本的三组权限不够用时(如要单独给某个用户不同于组内其他人的权限),用 ACL。ACL 提供了更灵活的权限控制机制,可以为任意用户或组设置独立的权限。

ACL 需要文件系统支持。RHEL 8/9 的 xfs 和 ext4 默认支持 ACL。如果 mount 输出中没有 acl 选项,可以用 "mount -o remount,acl /" 来启用。考试中通常不需要手动启用 ACL,但了解这个前提条件有助于排查问题。

setfacl 命令的常用参数:-m 修改 ACL,-x 删除 ACL 条目,-b 删除所有 ACL,-d 设置默认 ACL,-R 递归操作。getfacl 命令用于查看 ACL 信息,输出中会显示 user::rwx、group::r-x、mask::rwx、other::r-- 等字段。

# 查看 ACL
getfacl file.txt
# 预期输出:# file: file.txt
#            # owner: root
#            # group: root
#            user::rwx
#            group::r-x
#            other::r--

# 为用户单独设置权限
setfacl -m u:alice:rwx file.txt

# 为组单独设置权限
setfacl -m g:developers:rx file.txt

# 验证 ACL 设置
getfacl file.txt
# 预期输出:user::rwx
#            user:alice:rwx
#            group::r-x
#            group:developers:r-x
#            mask::rwx
#            other::r--

# 移除特定 ACL 条目
setfacl -x u:alice file.txt

# 移除所有 ACL(恢复基本权限)
setfacl -b file.txt

# 递归设置目录 ACL
setfacl -Rm u:alice:rwx /shared/project

# 设置默认 ACL(新建文件自动继承)
setfacl -dm u:alice:rwx /shared/project
setfacl -dm g:developers:rx /shared/project

ACL mask 的影响

mask 限制了 ACL 用户和组的最大有效权限。修改 mask 不会修改实际 ACL 条目,但会限制它的效果。理解 mask 是 ACL 使用的关键,考试中经常涉及 mask 相关的权限验证。

# 查看 mask
getfacl file.txt
# 输出中有 mask::r-x

# 修改 mask
setfacl -m m::rwx file.txt

# mask 会自动调整——当你增加 ACL 条目时,
# mask 会更新为所有 ACL 条目权限的并集

4. umask

umask 决定了新建文件和目录的默认权限。它是权限的"补码",理解 umask 对于配置系统默认权限至关重要。umask 不直接设置权限,而是从最大权限中"减去"指定的权限位。

umask 通常设置在 /etc/profile 或用户的 ~/.bashrc 中。系统默认 umask 为 022,表示新建文件权限为 644,新建目录权限为 755。如果需要更严格的默认权限,可以设置 umask 为 027(文件 640,目录 750)。

注意:umask 只影响新建文件和目录的权限,不会影响已存在的文件。修改 umask 后,需要重新登录或 source 配置文件才能生效。

# 查看当前 umask
umask
# 输出 022 表示:
# 文件默认:666 - 022 = 644(rw-r--r--)
# 目录默认:777 - 022 = 755(rwxr-xr-x)

# 设置 umask(仅当前 shell)
umask 027
# 文件默认:666 - 027 = 640(rw-r-----)
# 目录默认:777 - 027 = 750(rwxr-x---)

# 永久设置(写入 ~/.bashrc 或 /etc/profile)
echo "umask 027" >> ~/.bashrc

5. 完整配置案例:共享目录项目

综合场景:为 project 组搭建 /srv/teamdocs 共享目录。要求:组内成员可读写;组长 alice 单独拥有完全控制权;bob 只能浏览不能修改;任何人(含组内成员)不能删除别人的文件;新建文件自动继承组权限。以下是完整配置序列与逐步验证。

步骤 1:准备用户与组

sudo groupadd project
sudo useradd -m -s /bin/bash alice && sudo passwd alice
sudo useradd -m -s /bin/bash bob && sudo passwd bob
sudo usermod -aG project alice bob
sudo mkdir -p /srv/teamdocs
sudo chown :project /srv/teamdocs

步骤 2:SGID + 组读写 + Sticky Bit

sudo chmod 3770 /srv/teamdocs   # SGID(2) + Sticky(1) + 770
ls -ld /srv/teamdocs
# drwxrws--T 2 root project 6 ...  /srv/teamdocs
# 解释:s 是 SGID(新文件继承组),T 是 Sticky(其他人无执行位所以大写)

步骤 3:ACL —— alice 完全控制、bob 只读

sudo setfacl -m u:alice:rwx /srv/teamdocs
sudo setfacl -m u:bob:r-x /srv/teamdocs
getfacl /srv/teamdocs
# user::rwx
# user:alice:rwx
# user:bob:r-x
# group::rwx
# mask::rwx
# other::---

步骤 4:默认 ACL —— 新文件自动继承

sudo setfacl -dm g:project:rwx /srv/teamdocs
sudo setfacl -dm u:alice:rwx /srv/teamdocs
sudo setfacl -dm m::rwx /srv/teamdocs

步骤 5:逐项验证

# alice 可写
sudo -u alice touch /srv/teamdocs/report.txt
# bob 被拒绝写(ACL 只有 r-x)
sudo -u bob touch /srv/teamdocs/test.txt
# touch: cannot touch 'test.txt': Permission denied

# 新文件继承了默认 ACL 与组
getfacl /srv/teamdocs/report.txt
# user::rw-
# user:alice:rwx
# group::rwx
# mask::rwx
# other::---

# Sticky 生效:bob 不能删 alice 的文件
sudo -u bob rm /srv/teamdocs/report.txt
# rm: cannot remove 'report.txt': Operation not permitted

6. 故障案例:chmod 后 ACL mask 变化导致用户被拒绝

现象

# 原本 alice 对 /srv/teamdocs/script.sh 有 rwx,一切正常。
# 管理员执行了一次收紧权限的 chmod 后,alice 突然无法访问:
chmod 750 /srv/teamdocs/script.sh
sudo -u alice cat /srv/teamdocs/script.sh
# cat: script.sh: Permission denied

原因:chmod 会同步改写 ACL mask

对带 ACL 的文件执行 chmod 时,组权限位写什么值,ACL mask 就被同步成什么值。mask 是所有 ACL 用户/组条目的"权限天花板":chmod 750 把组位写成 r-x,mask 同步为 r-x,alice 条目的 rwx 被裁剪成 r-x,写与执行全部失效。

getfacl /srv/teamdocs/script.sh
# user::rwx
# user:alice:rwx   # 条目仍在,但被 mask 裁剪
# group::r-x
# mask::r-x        # 问题根源:上限只有 r-x
# other::---

修复:调整 mask 恢复 alice 权限

# 方案 1:显式抬升 mask(各条目的权限值不变)
sudo setfacl -m m::rwx /srv/teamdocs/script.sh
sudo -u alice cat /srv/teamdocs/script.sh   # 恢复正常

# 方案 2:重新设置 alice 条目,mask 自动取所有条目权限的并集
sudo setfacl -m u:alice:rwx /srv/teamdocs/script.sh
getfacl /srv/teamdocs/script.sh
# user::rwx
# user:alice:rwx
# group::r-x
# mask::rwx        # 自动恢复为 rwx
# other::---
经验法则:对带 ACL 的文件慎用 chmod 改组权限位。需要收紧时用 setfacl -m g::r-x 改"组条目"而不是 chmod,mask 保持原样,避免误伤其他 ACL 用户。

故障案例:SGID 目录下新建文件组不正确

现象

# /shared/project 设置了 SGID(chmod 2770),但 alice 创建的文件组仍是 alice 的主组
touch /shared/project/test.txt
ls -l /shared/project/test.txt
# -rw-rw---- 1 alice alice ... test.txt   ← 应该是 project 组

原因与修复

# 原因:alice 的主组名恰好也叫 project(与目录属组同名但 GID 不同)
# SGID 继承的是目录的 GID,不是组名;如果目录属组 GID 与 alice 主组 GID 不同,
# ls 可能显示组名相同但实际 GID 不同

# 确认
stat -c '%G %g' /shared/project
# project 1005                          ← 目录属组 GID=1005
id alice
# gid=1005(alice) groups=1005(alice)   ← alice 主组 GID 也是 1005,恰好同号

# 如果 GID 确实不同,需要修正目录属组:
sudo chown :project /shared/project    # 确保属组是正确的 project 组
sudo chmod 2770 /shared/project        # 重新确认 SGID 位
# 之后新建文件的组才会正确继承

故障案例:默认 ACL 未生效——新建文件无继承权限

现象

# 设置了默认 ACL,但新建文件没有继承预期权限
sudo setfacl -dm u:alice:rwx /shared/project
touch /shared/project/newfile.txt
getfacl /shared/project/newfile.txt
# user::rw-
# group::rwx
# mask::rwx
# other::---
# 没有 u:alice:rwx 条目!

原因与修复

# 原因:默认 ACL(-d)只对"之后新建"的文件生效,但当前 shell 的 umask 可能干扰
# 另一个常见原因:父目录的 ACL 条目被 setfacl -b 清除后未重新设置

# 修复:重新设置默认 ACL,然后新建文件验证
sudo setfacl -dm u:alice:rwx /shared/project
sudo setfacl -dm g:project:rwx /shared/project
touch /shared/project/newfile2.txt
getfacl /shared/project/newfile2.txt
# user::rw-
# user:alice:rwx      ← 默认 ACL 已继承
# group::rwx
# mask::rwx
# other::---

7. 权限检查顺序详解

文件被访问时,内核按严格顺序逐级判定,命中即停、不再向下看。这个顺序也是排查一切权限问题的思维框架。

检查流程(DAC 层)

  1. 是 root 吗?——root 绕过所有 DAC 检查(SELinux 除外),直接放行
  2. 是文件属主吗?——匹配 user 权限位(owner),命中即生效,不再检查组
  3. ACL 有当前用户的命名条目吗?——u:用户名 条目命中即生效(受 mask 限制),不再检查组
  4. 是属组成员吗?——匹配 group 权限位或 g:组名 ACL 条目(受 mask 限制)
  5. 以上都不匹配?——使用 other 权限位

判定示例

场景ownerACL(alice)groupotheralice 实际权限
alice 是属主rwxr-x---rwx(命中 owner,停止)
alice 非属主、有命名 ACLrwxr--rwx---r--(命中 ACL 条目)
alice 非属主、无 ACL、在组内rwxr-x---r-x(命中组)
三者都不匹配rwxr-xr--r--(落到 other)
关键坑:属主命中后,ACL 里的命名用户条目不会叠加!属主 alice 的权限 = owner 权限位,即使 ACL 里给了更大权限也会被忽略;反之 owner 位更小,ACL 也救不了属主。同理,mask 只约束命名用户/组条目,不影响 owner 与 other。

常见错误

常见错误原因解决方法
chmod -R 777 导致安全问题递归修改权限过于宽泛精确控制,目录和文件分别设置,避免 777
setfacl -m 后文件权限显示 + 号ACL 生效后的正常显示用 getfacl 查看完整权限信息
ACL mask 导致权限不足mask 自动调整为并集,可能限制了期望的权限检查 mask 值,必要时用 setfacl -m m::rwx 调整
SGID 目录下新建文件组不正确目录未设置 SGID 或设置了 ACL确认目录有 SGID 位(ls -ld 显示 s),检查 ACL
umask 设置后不生效修改了错误的配置文件或未重新加载source ~/.bashrc 或重新登录

排查权限问题时,建议按以下步骤:首先用 ls -la 查看基本权限,然后用 getfacl 查看 ACL 信息,最后检查 umask 设置。如果涉及特殊权限位,用 ls -ld 查看目录本身的权限(而非目录内容的权限)。

实操练习

练习 1:设置共享目录权限

# 任务:创建 /shared/team 目录,team 组用户可读写执行,其他人无权限
sudo mkdir -p /shared/team
sudo groupadd team
sudo chown :team /shared/team
sudo chmod 2770 /shared/team
ls -ld /shared/team   # drwxrws---

练习 2:配置 ACL 精细化控制

# 任务:在 /shared/team 中,alice 有完全控制权,bob 只读
sudo setfacl -m u:alice:rwx /shared/team
sudo setfacl -m u:bob:r /shared/team

# 验证
getfacl /shared/team

# 验证效果
sudo -u alice touch /shared/team/alice_file
sudo -u bob touch /shared/team/bob_file
ls -la /shared/team/

练习 3:设置默认 ACL 并验证继承

# 任务:/shared/team 下新建文件自动继承 alice 的 rwx 权限
sudo setfacl -dm u:alice:rwx /shared/team
sudo setfacl -dm g:team:rwx /shared/team

# 新建文件验证
touch /shared/team/newfile.txt
getfacl /shared/team/newfile.txt

练习 4:查找系统中的 SUID 文件

# 任务:查找所有 SUID 文件并识别异常
find / -perm -4000 -type f 2>/dev/null | head -20
ls -l /usr/bin/passwd
ls -l /usr/bin/sudo

练习 5:umask 配置验证

# 任务:设置 umask 为 027,验证默认权限
umask 027
touch /tmp/testfile
mkdir /tmp/testdir
ls -la /tmp/testfile   # 应为 -rw-r-----
ls -ld /tmp/testdir    # 应为 drwxr-x---

模拟题

题目 1

创建目录 /data/shared,设置 SGID 和 Sticky Bit,使 team 组的用户可以在此目录中创建文件,但只能删除自己的文件。同时为 alice 用户设置默认 ACL,使其拥有 rwx 权限。

参考答案sudo groupadd teamsudo mkdir -p /data/sharedsudo chown :team /data/sharedsudo chmod 3770 /data/shared(SGID+Sticky+组读写执行)→ sudo setfacl -dm u:alice:rwx /data/shared(默认 ACL)。验证:ls -ld /data/shared 显示 drwxrws--T;在目录中新建文件后 getfacl 确认 alice 条目已继承。

题目 2

查找系统中所有 SUID 文件,并说明 /usr/bin/passwd 的 SUID 权限为什么是必要的。

参考答案find / -perm -4000 -type f 2>/dev/null 列出所有 SUID 文件。passwd 的 SUID 必要性:/etc/shadow 只有 root 可写,普通用户无法直接修改密码。SUID 让 passwd 程序以属主(root)权限运行,从而能写入 shadow 文件。passwd 内部有逻辑限制——只修改调用者自己的密码条目,不会导致任意提权。去掉 SUID 后普通用户执行 passwd 会报 "Permission denied"。

题目 3

设置系统的 umask 为 027,验证新建文件和目录的默认权限,并在 /etc/skel 中配置新用户的默认环境。

参考答案umask 027(当前 shell 生效)→ touch /tmp/testfile && mkdir /tmp/testdirls -la /tmp/testfile 显示 -rw-r-----(666-027=640)→ ls -ld /tmp/testdir 显示 drwxr-x---(777-027=750)→ 永久生效:echo "umask 027" | sudo tee -a /etc/profile。/etc/skel 中的文件会自动复制到新用户 home 目录,可在其中添加 .bashrc 别名或欢迎文件。

题目 4

创建 /data/share,属组 ops(需先创建组),组内成员可读写执行,其他人无任何权限;目录内新建文件自动属于 ops 组。写出命令并验证。

参考答案sudo groupadd opssudo mkdir /data/sharesudo chown :ops /data/sharesudo chmod 2770 /data/share(SGID 保证新建文件继承组)。验证:ls -ld /data/share 显示 drwxrws---;touch /data/share/test.txtls -l 查看组字段为 ops(而不是创建者的主组)。

题目 5

文件 /srv/app/config.ini 需要:属主 root 可读写,ops 组可读,其他人不可见;另外单独给用户 auditor 只读权限。写出完整命令并解释 mask 的作用。

参考答案sudo chown root:ops /srv/app/config.inisudo chmod 640 /srv/app/config.inisudo setfacl -m u:auditor:r-- /srv/app/config.ini。此时 mask 自动变为 r--(auditor 条目权限的并集),getfacl 可确认。mask 是所有命名用户/组条目的权限上限:后续若 chmod g+w,mask 变为 rw-,auditor 也会被自动抬升到 rw-(若该条目不超 mask 上限)。

题目 6

为什么 /usr/bin/passwd 需要 SUID 权限?如果去掉会发生什么?

参考答案:passwd 需要写 /etc/shadow,而该文件只有 root 可写。SUID 让普通用户执行 passwd 时以属主(root)身份运行,从而能修改自己的密码条目。去掉 SUID(chmod u-s /usr/bin/passwd)后,普通用户执行 passwd 报 "Permission denied" 或无法写入 shadow,系统上所有人都改不了密码。注意 passwd 程序内部有校验逻辑,只会按调用者身份修改对应条目,SUID 本身不意味着任意提权。

题目 7

目录 /tmp/pub 权限为 1777,但用户 user1 无法删除 user2 创建的文件 report.txt。请解释原因,并说明 1777 中每一位的含义。

参考答案:这正是 Sticky Bit 的预期行为:1777 的 1 是 Sticky,目录内每个用户只能删除自己拥有(或自己拥有该目录)的文件,root 除外。user1 对 report.txt 既非属主、也非目录属主,删除被拒绝(rm: Operation not permitted)。数字含义:1=Sticky、7=owner rwx、7=group rwx、7=other rwx。/tmp 就是该权限的典型代表。

题目 8

目录 /docs 设置默认 ACL 后,新文件的组权限不正确。请说明:默认 ACL 与 SGID 同时存在时,新文件的属组由谁决定?

参考答案:新文件的属组由目录的 SGID 位决定(继承目录属组),默认 ACL 决定的是权限(如 g:ops:rwx 条目),两者不冲突、各管一件事。若目录没有 SGID,新文件属组为创建者的主组,但默认 ACL 的组条目依然生效。配置共享目录时两者通常同时使用:SGID 管"组归属",默认 ACL 管"权限继承"。

题目 9

用一条命令递归地给 /project 下所有目录加 SGID 位(保留原有权限),并解释为什么递归 chmod 2270 是错误做法。

参考答案:正确做法:find /project -type d -exec chmod g+s {} \; 只加 SGID 位、不动其他权限。错误做法 chmod -R 2770 /project 会把所有文件(含普通文件)权限统一覆盖为 2770,破坏文件原有权限(如可执行脚本变成 660)。特殊权限位的"只加不覆盖"写法:chmod g+s / u+s / o+t 只翻转对应位。

题目 10

用户 tom 对文件 /data/secret.txt 的访问被拒绝。已知 tom 既非属主也不在属组内,getfacl 显示有 u:tom:r-- 条目。最可能的原因是什么?如何修复?

参考答案:最可能是 ACL mask 被裁减(如 mask::---),命名用户条目 r-- 被 mask 截断为无权限。验证:getfacl 输出中 mask 值小于条目值。修复:sudo setfacl -m m::r-- /data/secret.txt 抬升 mask(或重新设置条目让其自动更新)。另外也需确认 tom 对文件所在目录有 x(执行)权限,目录无 x 时文件权限再好也无法进入。

最佳实践

  • 创建共享目录的标准模式:SGID(2770)+ ACL + Sticky Bit,考试中遇到共享目录场景直接套用
  • setfacl -m 修改现有 ACL,setfacl -x 删除单条,不要混淆 -m 和 -x
  • 递归操作记得加 -R,同时注意递归设置会覆盖已有权限
  • ACL 条目中 mask 是自动管理的,不要手动改除非你理解后果
  • 查看文件完整权限信息用 getfacl,它显示基本权限 + ACL,比 ls -l 更全面
  • 考试中遇到权限问题,按顺序检查:基本权限 → ACL → mask → SELinux
  • 权限数字模式要熟记:r=4, w=2, x=1,这是快速答题的基础
  • 特殊权限位的数字表示:SUID=4, SGID=2, Sticky=1,放在权限数字前面,例如 4755 表示 SUID + rwxr-xr-x

验证 checklist

ls -ld /shared/project    # 检查 SGID + Sticky Bit
getfacl /shared/project   # 完整 ACL 信息
umask                     # 默认权限掩码
find / -perm -4000        # 检查 SUID 文件(安全审计)

考试交卷前,务必验证所有权限设置是否正确。使用 ls -l 检查文件权限,getfacl 检查 ACL 信息,ls -ld 检查目录本身的特殊权限位。如果设置了 SGID,验证新建文件是否继承了正确的组;如果设置了 Sticky Bit,验证用户只能删除自己的文件。

学习检查点

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

检查项自测问题验证方法
概念理解能用自己的话解释 Linux 权限模型和 ACL 的作用尝试向他人讲解
命令操作能不查文档完成 chmod、chown、setfacl 命令操作在终端实际执行
原理掌握能说出特殊权限位(SUID/SGID/Sticky)和 umask 原理画出流程图
故障排查能独立排查文件权限导致的服务无法启动问题模拟故障并修复
最佳实践能说明为什么需要谨慎使用 chmod 777对比不同方案

本章总结

权限题是送分题也是最容易丢分题,务必牢记权限检查顺序:属主→属组→其他人。特殊权限位要配合场景记忆:SUID 以属主身份运行、SGID 继承组、Sticky Bit 防删除;ACL 用 getfacl/setfacl 验证,同时理解 umask 对新建文件默认权限的影响。

延伸阅读

补充知识点

权限数字模式速查表

数字权限符号典型用途
777rwxrwxrwx所有人完全控制不推荐使用
755rwxr-xr-x所有者完全,其他人只读执行可执行文件、脚本
700rwx------仅所有者完全控制私有目录
644rw-r--r--所有者读写,其他人只读普通文件
600rw-------仅所有者读写私有文件、密钥
2770rwxrws---SGID 目录共享工作目录
1777rwxrwxrwtSticky Bit 目录/tmp 等公共目录

这个速查表是考试中的重要参考,建议熟记常见权限数字组合。特别是 2770(SGID 目录)和 1777(Sticky Bit 目录)的组合,这是考试中创建共享目录的标准配置。掌握这些数字与权限的对应关系可以大大提高答题速度。

ACL 与基本权限的关系

当文件设置了 ACL 后,ls -l 输出中的组权限位会显示为 ACL mask 的值,而不是实际的组权限。这是最常见的混淆点。要查看真实的权限信息,必须使用 getfacl 命令。

理解 ACL 与基本权限的关系对于排查权限问题至关重要。当 ls -l 显示 + 号时,表示文件有 ACL 权限。此时组权限位显示的是 mask 的值,而不是实际的组权限。mask 是所有 ACL 用户和组权限的并集,它限制了 ACL 条目的最大有效权限。

# 示例:设置 ACL 后查看权限
setfacl -m u:alice:rwx file.txt
ls -l file.txt
# 输出:-rw-rw-r--+ 1 root root 0 ... file.txt
# 注意 + 号表示有 ACL

# 查看真实权限
getfacl file.txt
# user::rw-
# user:alice:rwx
# group::rw-          # 实际组权限
# mask::rwx           # ACL mask
# other::r--

特殊权限位安全注意事项

SUID 和 SGID 是强大的功能,但也可能被滥用。系统管理员应定期检查系统中的 SUID/SGID 文件,确保没有不必要的特权程序。考试中可能要求查找并识别异常的 SUID 文件。

# 查找所有 SUID 文件
find / -perm -4000 -type f 2>/dev/null

# 查找所有 SGID 文件
find / -perm -2000 -type f 2>/dev/null

# 查找所有带 Sticky Bit 的目录
find / -perm -1000 -type d 2>/dev/null

chmod 递归操作注意事项

使用 chmod -R 递归修改权限时要格外小心,特别是对根目录或 /etc 等系统目录。错误的递归权限修改可能导致系统无法正常启动或服务无法运行。建议在执行递归操作前先用 find 命令预览要修改的文件。

# 预览要修改的文件(不实际修改)
find /shared/project -type f -perm 644

# 安全的递归权限修改
find /shared/project -type d -exec chmod 2770 {} \;
find /shared/project -type f -exec chmod 660 {} \;

文件权限与进程权限的区别

文件权限(ugo/rwx)控制的是用户对文件的访问,而进程权限决定了进程能执行哪些操作。SUID/SGID 正是连接文件权限和进程权限的桥梁:当用户执行设置了 SUID 的文件时,进程会以文件所有者的权限运行。

理解文件权限和进程权限的区别对于系统安全至关重要。例如,即使文件有 777 权限,如果父目录没有执行权限,用户仍然无法访问该文件。权限检查是逐级进行的:首先检查目录权限,然后检查文件权限。对于目录来说,执行权限(x)意味着可以进入该目录并访问其中的文件。

权限与 SELinux 的关系

RHEL 8/9 默认启用 SELinux,它在传统权限(DAC)之上提供了强制访问控制(MAC)。即使文件权限设置正确,SELinux 策略也可能阻止访问。考试中如果遇到权限问题但基本权限和 ACL 都正确,可能需要检查 SELinux 状态。

# 查看 SELinux 状态
getenforce
sestatus

# 临时关闭 SELinux(不推荐)
sudo setenforce 0

# 查看文件的 SELinux 上下文
ls -Z /shared/project

考试中涉及权限的题目通常会结合多种技术,例如:创建共享目录并设置 SGID、配置 ACL、设置 Sticky Bit。这种综合题要求考生能够灵活运用各种权限管理工具,理解它们之间的相互作用。掌握这些技术的组合应用是通过考试的关键。

考试时间管理建议

RHCSA 考试时间紧张,权限管理题目通常需要在 10-15 分钟内完成。建议先理清需求再动手操作,避免反复修改。创建共享目录的标准流程是:创建目录 → 设置组 → 设置 SGID → 设置 ACL → 设置 Sticky Bit → 验证。按照这个流程操作可以避免遗漏关键步骤。

权限管理常见组合场景

考试中经常出现以下组合场景:1)创建开发团队共享目录(SGID + ACL);2)配置敏感文件访问控制(chmod 600 + ACL);3)设置用户私人目录(chmod 700 + Sticky Bit)。掌握这些常见场景的标准配置可以快速应对考试题目。建议在备考时多做练习,熟悉各种权限组合的实际效果。

最后,权限管理是系统安全的基础,RHCSA 考试不仅考察命令的使用,更考察对权限模型的理解。建议考生在备考时多思考"为什么"而不仅仅是"怎么做",这样能够更灵活地应对各种考试场景。祝各位考生考试顺利!

↑ 回到顶部