Linux(CentOS)系统管理入门笔记(第九期)——文件权限进阶:SUIDSGIDSticky、ACL 与 chattr

Linux(CentOS)系统管理入门笔记(第九期)------文件权限进阶:SUID/SGID/Sticky、ACL 与 chattr

Linux系统管理入门系列更多文章欢迎访问:Linux入门------系统管理1

我的主页:AOwhisky,这里有更多运维系统性知识整理和其他有趣内容,欢迎与我一起探讨学习~

引言:突破基础权限模型的"三把钥匙"

上一期我们学习了 Linux 权限体系的基石------rwxchmodchownumask。这套模型足够应对 80% 的场景,但仍有几个"力不从心"的时刻:

  • 问题一 :普通用户执行 passwd 命令时,需要修改 /etc/shadow,但 shadow 文件明明只有 root 可写------这是怎么做到的?
  • 问题二:多个用户属于同一个项目组,他们需要在共享目录中协作。A 创建的文件,B 为什么无法编辑?如何让同组用户自动获得文件的写权限?
  • 问题三/tmp 目录是"公共垃圾场",任何人都能创建文件,但为什么你无法删除别人创建的文件?
  • 问题四:如何给不同的用户(而不是按"所有者/组/其他人"三类)分别授予不同的权限?
  • 问题五:有没有一种方法,让 root 自己也无法误删某个重要文件?

这些问题,基础权限模型(rwx + chmod)回答不了。Linux 提供了三把"进阶钥匙"来解决它们:

  1. SUID/SGID/Sticky:给可执行文件和目录"注入"特殊属性,改变运行时的身份或行为
  2. ACL(访问控制列表):打破"只能设三组权限"的限制,为任意用户/组单独授权
  3. chattr(扩展属性):让文件"免疫"于删除和修改,即使是 root 也无法绕过

本期将逐一拆解这三把钥匙,配合大量实战演示。读完这一期,你将拥有 Linux 权限管理的"大师级"能力。
--- Compiled and Authored by Whisky --- July 19 th, 2026

目录

  1. SUID:执行时"变身"文件所有者
  2. SGID:目录中的"组继承"魔法
  3. Sticky Bit:公共目录的"防盗锁"
  4. 特殊权限数字表示法与查找
  5. ACL:打破三组权限的限制
  6. chattr:文件"金钟罩"
  7. 总结与速查手册

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 的安全风险与最佳实践

方面 说明
用途 允许普通用户执行需要特权的特定操作(如 passwdping
风险 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,如 47551777
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+sg+so+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 思考与拓展

  1. 为什么 passwd 命令需要 SUID 权限?
    passwd 需要修改 /etc/shadow,该文件仅 root 可写。SUID 让普通用户执行 passwd 时临时获得 root 身份,完成密码修改。
  2. SGID 设置在目录上比设置在文件上更常见,为什么?
    → 目录 SGID 实现了"组继承",让团队协作目录中的新文件自动归共享组,避免手动 chgrp。而文件 SGID 在普通场景中较少使用。
  3. /tmp 目录为什么需要 Sticky Bit?
    /tmp 是全局可写目录,任何用户都能创建文件。Sticky Bit 确保只有文件所有者能删除自己的文件,防止 A 用户误删 B 用户的临时文件。
  4. ACL 和基础权限哪个优先级更高?
    → ACL 是基础权限的"超集"。getfacl 中的 user::group::other:: 对应基础权限,额外条目为 ACL 扩展。访问时,ACL 规则优先于基础权限。
  5. chattr +ichmod 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

相关推荐
栀栀栀栀栀栀18 小时前
刷刷刷 2026/7/16
笔记
小秋求学记.19 小时前
Linux_Ubuntu的相关问题
linux·运维·ubuntu
熊猫钓鱼>_>19 小时前
ArkTS 方舟编程语言 · 原创快速入门教程
运维·架构·ts·harmonyos·arkts·鸿蒙·js
β添砖java20 小时前
黑马Linux笔记
linux·运维·笔记
一只小菜鸡..20 小时前
Stanford CS144 学习笔记 (七):跨越虚实的边界——物理层、链路层与无线网络
网络·笔记·学习
寒晓星20 小时前
【网络编程】UDP编程
linux·网络·网络协议·udp
在水一缸20 小时前
当 AI 拥有了“核按钮”:深入解析 MCP 服务器与命令执行护栏
运维·服务器·人工智能·命令执行·智能体·ai安全·mcp
大大的大大20 小时前
拼多多电商运营-马扁标题2
笔记·产品运营
雪的季节20 小时前
【无标题】
linux·服务器·python
爱莉希雅&&&21 小时前
Prometheus高可用(alertmanager+node_exporter+grafana)
运维·服务器·grafana·prometheus