Linux(CentOS)系统管理入门笔记(第九期)------文件权限进阶:SUID/SGID/Sticky、ACL 与 chattr
Linux系统管理入门系列更多文章欢迎访问:Linux入门------系统管理1
我的主页:AOwhisky,这里有更多运维系统性知识整理和其他有趣内容,欢迎与我一起探讨学习~
引言:突破基础权限模型的"三把钥匙"
上一期我们学习了 Linux 权限体系的基石------rwx、chmod、chown 和 umask。这套模型足够应对 80% 的场景,但仍有几个"力不从心"的时刻:
- 问题一 :普通用户执行
passwd命令时,需要修改/etc/shadow,但 shadow 文件明明只有 root 可写------这是怎么做到的? - 问题二:多个用户属于同一个项目组,他们需要在共享目录中协作。A 创建的文件,B 为什么无法编辑?如何让同组用户自动获得文件的写权限?
- 问题三 :
/tmp目录是"公共垃圾场",任何人都能创建文件,但为什么你无法删除别人创建的文件? - 问题四:如何给不同的用户(而不是按"所有者/组/其他人"三类)分别授予不同的权限?
- 问题五:有没有一种方法,让 root 自己也无法误删某个重要文件?
这些问题,基础权限模型(rwx + chmod)回答不了。Linux 提供了三把"进阶钥匙"来解决它们:
- SUID/SGID/Sticky:给可执行文件和目录"注入"特殊属性,改变运行时的身份或行为
- ACL(访问控制列表):打破"只能设三组权限"的限制,为任意用户/组单独授权
- chattr(扩展属性):让文件"免疫"于删除和修改,即使是 root 也无法绕过
本期将逐一拆解这三把钥匙,配合大量实战演示。读完这一期,你将拥有 Linux 权限管理的"大师级"能力。
--- Compiled and Authored by Whisky --- July 19 th, 2026
目录
- SUID:执行时"变身"文件所有者
- SGID:目录中的"组继承"魔法
- Sticky Bit:公共目录的"防盗锁"
- 特殊权限数字表示法与查找
- ACL:打破三组权限的限制
- chattr:文件"金钟罩"
- 总结与速查手册
1. SUID:执行时"变身"文件所有者
1.1 SUID 的作用
SUID(Set User ID) 是一个特殊权限位。当具有 SUID 权限的可执行文件被运行时,进程的有效用户 ID(EUID) 不再是执行者本人,而是文件的所有者。
最经典的例子是 /usr/bin/passwd:
bash
# 查看 passwd 命令的权限
[whisky@centos7 ~]$ ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 27856 Apr 1 2020 /usr/bin/passwd
# ↑
# s 表示 SUID 已设置(所有者权限中的 x 被替换为 s)
工作原理:
| 步骤 | 说明 |
|---|---|
| 1 | whisky 用户执行 passwd 命令 |
| 2 | 因为 passwd 有 SUID 位(所有者=root),进程的 EUID 变为 root |
| 3 | 进程以 root 身份修改 /etc/shadow(仅 root 可写) |
| 4 | 修改完成,进程退出,EUID 恢复为 whisky |
💡 白话理解:SUID 就像一张"临时工作证"。普通员工(whisky)拿到了一张印着"总经理"(root)的工牌,去执行原本只有总经理才能做的操作(改 shadow),操作完成后工牌自动收回。
1.2 SUID 的安全风险与最佳实践
| 方面 | 说明 |
|---|---|
| 用途 | 允许普通用户执行需要特权的特定操作(如 passwd、ping) |
| 风险 | SUID 程序若存在漏洞,攻击者可利用它提权到 root |
| 最佳实践 | 最小化 SUID 程序数量,定期审计(find / -perm -4000) |
1.3 设置与移除 SUID
bash
# 设置 SUID(符号模式)
[root@centos7 ~]# chmod u+s /usr/bin/vim
[root@centos7 ~]# ls -l /usr/bin/vim
-rwsr-xr-x. 1 root root 2337216 10月 14 2020 /usr/bin/vim
# 设置 SUID(数字模式)------ 在权限前加 4
[root@centos7 ~]# chmod 4755 /usr/bin/vim
# 移除 SUID
[root@centos7 ~]# chmod u-s /usr/bin/vim
[root@centos7 ~]# ls -l /usr/bin/vim
-rwxr-xr-x. 1 root root 2337216 10月 14 2020 /usr/bin/vim
⚠️ 生产环境警告 :永远不要给编辑器(vim、nano 等)设置 SUID 。否则任何用户都能用 vim 以 root 身份修改任意文件(如
/etc/passwd、/etc/shadow),等同于给所有用户 root 权限。
1.4 SUID 对目录无效
SUID 只对可执行文件有效,对目录设置 SUID 没有任何作用。
2. SGID:目录中的"组继承"魔法
2.1 SGID 对文件的作用
与 SUID 类似,SGID(Set Group ID)让进程执行时获得文件所属组的权限:
bash
# 具有 SGID 的可执行文件(不常见)
ls -l /usr/bin/write
-rwxr-sr-x. 1 root tty 19624 Apr 1 2020 /usr/bin/write
# ↑
# s 表示 SGID(组权限中的 x 被替换为 s)
2.2 SGID 对目录的作用(核心应用)
当 SGID 设置在目录上时,该目录中新创建的文件/子目录会自动继承目录的所属组。
场景 :项目团队 devops 的成员需要在一个共享目录中协作,任何成员创建的文件,同组其他成员都应该能读写。
bash
# 准备用户和组
[root@centos7 lab]# groupadd devops
[root@centos7 lab]# useradd -G devops dev1
[root@centos7 lab]# useradd -G devops dev2
# 准备共享目录
[root@centos7 lab]# mkdir /share
[root@centos7 lab]# chgrp devops /share
[root@centos7 lab]# chmod g=rwx /share
[root@centos7 lab]# chmod g+s /share # 设置 SGID
[root@centos7 lab]# ls -ld /share
drwxrws---. 2 root devops 4096 7月 19 10:00 /share
# ↑
# s 表示 SGID 已设置
# 设置 umask 确保组有写权限
[root@centos7 lab]# echo "umask 002" >> /etc/bashrc
# dev1 创建文件
[dev1@centos7 share]$ touch dev1-file
[dev1@centos7 share]$ ls -l dev1-file
-rw-rw-r--. 1 dev1 devops 0 7月 19 10:02 dev1-file
# ↑ ↑
# 所有者是 dev1,所属组自动变为 devops!
# dev2 可以修改 dev1 的文件
[dev2@centos7 share]$ echo "hello" >> dev1-file
[dev2@centos7 share]$ cat dev1-file
hello
SGID vs 普通目录对比:
| 场景 | 目录无 SGID | 目录有 SGID |
|---|---|---|
| 文件所属组 | 创建者的主要组 | 自动继承父目录的组 |
| 团队协作 | 需手动 chgrp |
自动生效 |
2.3 设置与移除 SGID
bash
# 设置 SGID(符号模式)
[root@centos7 ~]# chmod g+s /share
# 设置 SGID(数字模式)------ 在权限前加 2
[root@centos7 ~]# chmod 2770 /share
# 移除 SGID
[root@centos7 ~]# chmod g-s /share
3. Sticky Bit:公共目录的"防盗锁"
3.1 Sticky Bit 的作用
Sticky Bit(粘滞位) 设置在目录上时,只有文件的所有者、目录的所有者或 root 才能删除/重命名该目录中的文件,即使其他人对该目录有写权限。
最典型的例子是 /tmp 目录:
bash
[whisky@centos7 ~]$ ls -ld /tmp
drwxrwxrwt. 20 root root 4096 7月 19 10:05 /tmp
# ↑
# t 表示 Sticky Bit(其他人权限中的 x 被替换为 t)
场景演示:
bash
# 创建带 Sticky Bit 的公共目录
[root@centos7 lab]# mkdir /public
[root@centos7 lab]# chmod 1777 /public # 777 + Sticky
[root@centos7 lab]# ls -ld /public
drwxrwxrwt. 2 root root 4096 7月 19 10:10 /public
# whisky 创建文件
[whisky@centos7 public]$ echo "whisky's file" > whisky-file
[whisky@centos7 public]$ chmod 666 whisky-file # 开放所有权限
# laowang 试图删除 whisky 的文件(失败!)
[laowang@centos7 public]$ rm whisky-file
rm: cannot remove 'whisky-file': Operation not permitted
3.2 为什么需要 Sticky Bit?
| 场景 | 无 Sticky | 有 Sticky |
|---|---|---|
/tmp 目录 |
任何用户可删除别人的临时文件 | 只能删除自己的文件 |
| 共享上传目录 | 用户可覆盖/删除他人上传的文件 | 用户只能管理自己的文件 |
| 团队协作目录 | 权限混乱,文件可能被误删 | 文件受到保护 |
3.3 设置与移除 Sticky Bit
bash
# 设置 Sticky Bit(符号模式)
[root@centos7 ~]# chmod o+t /public
# 设置 Sticky Bit(数字模式)------ 在权限前加 1
[root@centos7 ~]# chmod 1777 /public
# 移除 Sticky Bit
[root@centos7 ~]# chmod o-t /public
4. 特殊权限数字表示法与查找
4.1 三位特殊权限的数值
特殊权限在数字模式中占据权限数字的最前面一位:
| 特殊权限 | 数值 | 含义 |
|---|---|---|
| SUID | 4 | 执行时获得所有者权限 |
| SGID | 2 | 执行时获得组权限 / 目录继承组 |
| Sticky | 1 | 目录中仅所有者可删除文件 |
组合示例:
| 权限写法 | 特殊位 | 所有者 | 组 | 其他人 | 含义 |
|---|---|---|---|---|---|
4755 |
4 | 7 | 5 | 5 | SUID + rwxr-xr-x |
2750 |
2 | 7 | 5 | 0 | SGID + rwxr-x--- |
1777 |
1 | 7 | 7 | 7 | Sticky + rwxrwxrwx |
6755 |
4+2=6 | 7 | 5 | 5 | SUID+SGID + rwxr-xr-x |
4.2 查看特殊权限
bash
# SUID:所有者权限位为 s(小写)或 S(大写,无执行权限)
-rwsr-xr-x. # SUID 已设置
-rwSr-xr-x. # SUID 已设置但所有者无执行权限
# SGID:组权限位为 s(小写)或 S(大写,无执行权限)
-rwxr-sr-x. # SGID 已设置
-rwxr-Sr-x. # SGID 已设置但组无执行权限
# Sticky:其他人权限位为 t(小写)或 T(大写,无执行权限)
drwxrwxrwt. # Sticky 已设置
drwxrwxr-T. # Sticky 已设置但其他人无执行权限
4.3 查找特殊权限文件
bash
# 查找系统中所有具有 SUID 的文件
[root@centos7 ~]# find / -perm -4000 2>/dev/null
# 查找系统中所有具有 SGID 的文件
[root@centos7 ~]# find / -perm -2000 2>/dev/null
# 查找系统中所有具有 Sticky Bit 的目录
[root@centos7 ~]# find / -perm -1000 -type d 2>/dev/null
# 使用符号模式查找
[root@centos7 ~]# find / -perm -u+s 2>/dev/null
[root@centos7 ~]# find / -perm -g+s 2>/dev/null
[root@centos7 ~]# find / -perm -o+t -type d 2>/dev/null
4.4 特殊权限速查表
| 特殊权限 | 符号模式 | 数字模式 | 作用对象 | 效果 |
|---|---|---|---|---|
| SUID | u+s |
4xxx | 文件 | 执行时 EUID = 文件所有者 |
| SGID | g+s |
2xxx | 文件/目录 | 文件:EUID = 文件组;目录:新文件继承目录组 |
| Sticky | o+t |
1xxx | 目录 | 仅所有者可删除目录中的文件 |
5. ACL:打破三组权限的限制
5.1 为什么需要 ACL?
基础权限模型只能为 所有者 / 组 / 其他人 三类设置权限。但实际需求更复杂:
| 场景 | 需求 | 基础权限能否满足? |
|---|---|---|
文件只给 whisky 读写 |
设置所有者 = whisky | ✅ 可以 |
文件给 whisky 读写,laowang 只读 |
whisky 是所有者,laowang 是其他人 | ❌ 无法区分 |
目录给 devops 组读写,但 admin 组只读 |
只能设一个组 | ❌ 只能一个组 |
| 临时给某人只读权限 | 需修改文件所有者或组 | ❌ 操作复杂 |
ACL(Access Control List,访问控制列表) 解决了这个问题------可以为任意多个用户/组单独设置权限。
5.2 查看 ACL
bash
# 创建测试文件
[root@centos7 lab]# touch testfile
[root@centos7 lab]# ls -l testfile
-rw-r--r--. 1 root root 0 7月 19 10:20 testfile
# ↑
# . 表示该文件有 ACL 扩展属性
# 查看 ACL
[root@centos7 lab]# getfacl testfile
# file: testfile
# owner: root
# group: root
user::rw- # 所有者权限
group::r-- # 组权限
other::r-- # 其他人权限
5.3 设置 ACL
针对用户设置:
bash
# 设置 whisky 用户对 testfile 有读写权限
[root@centos7 lab]# setfacl -m u:whisky:rw testfile
[root@centos7 lab]# getfacl testfile
# file: testfile
# owner: root
# group: root
user::rw-
user:whisky:rw- # ← 新增
group::r--
mask::rw- # ← 自动生成的 mask
other::r--
# 验证(whisky 可读可写)
[whisky@centos7 lab]$ echo "hello" >> testfile
[whisky@centos7 lab]$ cat testfile
hello
针对组设置:
bash
# 设置 wheel 组对 testfile 有读写权限
[root@centos7 lab]# setfacl -m g:wheel:rw testfile
[root@centos7 lab]# getfacl testfile
# file: testfile
# owner: root
# group: root
user::rw-
user:whisky:rw-
group::r--
group:wheel:rw- # ← 新增
mask::rw-
other::r--
删除 ACL 条目:
bash
# 删除特定用户的 ACL
[root@centos7 lab]# setfacl -x u:whisky testfile
# 删除特定组的 ACL
[root@centos7 lab]# setfacl -x g:wheel testfile
# 删除所有 ACL(恢复为基础权限)
[root@centos7 lab]# setfacl -b testfile
5.4 目录的默认 ACL
默认 ACL 使得目录中新创建的文件自动继承 ACL 规则。
bash
# 为目录设置默认 ACL(所有新文件继承)
[root@centos7 lab]# mkdir /shared
[root@centos7 lab]# setfacl -m d:u:whisky:rw /shared
# 查看目录的默认 ACL
[root@centos7 lab]# getfacl /shared
# file: shared
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:whisky:rw- # ← 默认 ACL
default:group::r-x
default:mask::rwx
default:other::r-x
# 创建新文件,自动继承 ACL
[root@centos7 lab]# touch /shared/newfile
[root@centos7 lab]# getfacl /shared/newfile
# file: newfile
# owner: root
# group: root
user::rw-
user:whisky:rw- # ← 自动继承
group::r-x #effective:r--
mask::rw-
other::r--
5.5 mask:ACL 的"最大权限"
mask 是 ACL 中一个特殊的权限位,它限制了所有 ACL 条目(用户和组) 能拥有的最大权限。
bash
[root@centos7 lab]# getfacl testfile
user:whisky:rw-
group:wheel:rw-
mask::rw- # mask 为 rw-
# 限制 mask 为只读
[root@centos7 lab]# setfacl -m m:r testfile
[root@centos7 lab]# getfacl testfile
user:whisky:rw- #effective:r-- ← whisky 实际只有读权限
group:wheel:rw- #effective:r-- ← wheel 实际只有读权限
mask::r-- # mask 变为 r--
5.6 ACL 使用场景
| 场景 | 命令 |
|---|---|
| 文件给 whisky 读写、laowang 只读 | setfacl -m u:whisky:rw,u:laowang:r file |
| 目录给 devops 组读写、admin 组只读 | setfacl -m g:devops:rw,g:admin:r dir |
| 目录中所有新文件自动授予 whisky 读权限 | setfacl -m d:u:whisky:r dir |
| 清除所有 ACL | setfacl -b file |
6. chattr:文件"金钟罩"
6.1 为什么需要 chattr?
ACL 和基础权限可以控制"谁"能访问文件,但无法阻止文件所有者(包括 root) 误删或误改文件。chattr(Change Attribute)设置的扩展属性让文件获得"免疫力"。
6.2 两个最常用的属性
| 属性 | 含义 | 作用 |
|---|---|---|
a |
append only | 只能追加内容,不能覆盖、删除或重命名 |
i |
immutable | 不可变更,任何修改、删除、重命名都被禁止 |
6.3 append only(a 属性)
适合日志文件------只允许追加,不允许覆盖或删除。
bash
[root@centos7 lab]# touch operator.log
[root@centos7 lab]# chattr +a operator.log
# 尝试覆盖(失败)
[root@centos7 lab]# echo "new content" > operator.log
-bash: operator.log: 不允许的操作
# 尝试追加(成功)
[root@centos7 lab]# echo "append line 1" >> operator.log
[root@centos7 lab]# echo "append line 2" >> operator.log
[root@centos7 lab]# cat operator.log
append line 1
append line 2
# 尝试删除(失败)
[root@centos7 lab]# rm -f operator.log
rm: 无法删除'operator.log': 不允许的操作
# 移除 a 属性
[root@centos7 lab]# chattr -a operator.log
[root@centos7 lab]# rm -f operator.log # 现在可以删除
6.4 immutable(i 属性)
适合关键配置文件(如 /etc/passwd、/etc/sudoers)------完全锁定,防止任何意外修改。
bash
[root@centos7 lab]# cp /etc/passwd .
[root@centos7 lab]# chattr +i passwd
# 任何修改都被禁止
[root@centos7 lab]# echo "test" >> passwd
-bash: passwd: 不允许的操作
[root@centos7 lab]# rm -f passwd
rm: 无法删除'passwd': 不允许的操作
[root@centos7 lab]# mv passwd passwd.bak
mv: 无法移动'passwd' 至'passwd.bak': 不允许的操作
# 移除 i 属性(唯一恢复方式)
[root@centos7 lab]# chattr -i passwd
[root@centos7 lab]# echo "test" >> passwd # 现在可以修改
6.5 chattr vs chmod 对比
| 维度 | chattr | chmod |
|---|---|---|
| 作用对象 | 文件扩展属性 | 文件访问权限 |
| 是否可被 root 绕过 | ❌ root 也无法绕过 | ✅ root 可以绕过 |
| 常见用途 | 防误删、防篡改 | 控制谁可以访问 |
| 查看方式 | lsattr |
ls -l |
6.6 查看扩展属性:lsattr
bash
[root@centos7 lab]# lsattr passwd
----i----------- passwd # i 属性已设置
[root@centos7 lab]# lsattr operator.log
-----a---------- operator.log # a 属性已设置
7. 总结与速查手册
7.1 核心知识点一览
| 主题 | 关键点 |
|---|---|
| SUID | u+s,执行时 EUID = 文件所有者,只对文件有效 |
| SGID | g+s,文件:执行时 EGID = 文件组;目录:新文件继承目录组 |
| Sticky Bit | o+t,目录中仅所有者可删除文件 |
| 特殊权限数字 | SUID=4,SGID=2,Sticky=1,如 4755、1777 |
| ACL | setfacl / getfacl,为任意用户/组单独设权限 |
| chattr | +i 不可变,+a 仅追加,root 也无法绕过 |
7.2 命令速查表
| 命令 | 常用形式 | 作用 |
|---|---|---|
chmod |
chmod u+s file |
设置 SUID |
chmod |
chmod g+s dir |
设置 SGID |
chmod |
chmod o+t dir |
设置 Sticky Bit |
setfacl |
setfacl -m u:whisky:rw file |
设置 ACL |
getfacl |
getfacl file |
查看 ACL |
chattr |
chattr +i file |
锁定文件 |
lsattr |
lsattr file |
查看扩展属性 |
7.3 特殊权限数字速查
| 组合 | 数值 | 权限字符串示例 |
|---|---|---|
| SUID | 4 | -rwsr-xr-x(4755) |
| SGID | 2 | -rwxr-sr-x(2755) |
| Sticky | 1 | drwxrwxrwt(1777) |
| SUID+SGID | 6 | -rwsr-sr-x(6755) |
7.4 常见错误排查
| 问题 | 原因 | 解决方案 |
|---|---|---|
chmod: invalid mode |
特殊权限语法错误 | 使用 u+s、g+s、o+t |
| 目录中文件仍属于创建者组 | 目录未设置 SGID | chmod g+s dir |
无法删除 /tmp 中的文件 |
Sticky Bit 保护 | 确认文件所有者是谁 |
setfacl 命令不存在 |
未安装 ACL 工具包 | yum install -y acl |
chattr: Permission denied |
权限不足 | 需 root 权限执行 |
对文件 chattr +i 后自己也无法修改 |
属性设计如此 | chattr -i file 恢复 |
7.5 思考与拓展
- 为什么
passwd命令需要 SUID 权限?
→passwd需要修改/etc/shadow,该文件仅 root 可写。SUID 让普通用户执行passwd时临时获得 root 身份,完成密码修改。 - SGID 设置在目录上比设置在文件上更常见,为什么?
→ 目录 SGID 实现了"组继承",让团队协作目录中的新文件自动归共享组,避免手动chgrp。而文件 SGID 在普通场景中较少使用。 /tmp目录为什么需要 Sticky Bit?
→/tmp是全局可写目录,任何用户都能创建文件。Sticky Bit 确保只有文件所有者能删除自己的文件,防止 A 用户误删 B 用户的临时文件。- ACL 和基础权限哪个优先级更高?
→ ACL 是基础权限的"超集"。getfacl中的user::、group::、other::对应基础权限,额外条目为 ACL 扩展。访问时,ACL 规则优先于基础权限。 chattr +i和chmod 000的区别是什么?
→chmod 000让所有用户(包括所有者)都无法访问文件,但 root 可以绕过。chattr +i连 root 也无法修改或删除,是更强的保护。
7.6 生产环境最佳实践
| 场景 | 建议 |
|---|---|
| SUID 审计 | 定期执行 find / -perm -4000 2>/dev/null,移除非必要的 SUID 程序 |
| 团队共享目录 | 设置 SGID(chmod g+s)+ umask 002,确保文件自动继承组 |
| 公共临时目录 | 设置 Sticky Bit(chmod 1777)保护用户文件 |
| 敏感配置文件 | 使用 chattr +i 保护 /etc/passwd、/etc/sudoers 等 |
| 日志目录 | 使用 chattr +a 保护关键日志,防止被篡改或删除 |
| ACL 管理 | 用 getfacl 导出备份,setfacl --restore 恢复,便于批量管理 |
下期预告 :权限管理告一段落,下一期我们将进入 Linux 的另一个核心领域------进程管理 。你会学到什么是进程(不是程序!),如何用 ps 查看进程,如何用 kill 发送信号控制进程,以及如何管理前台/后台作业。我们还将深入理解僵尸进程、孤儿进程这些"疑难杂症"。敬请期待第十期!
--- Compiled and Authored by Whisky --- July 19 th, 2026