系统管理入门笔记(第九期)——文件权限进阶:SUIDSGIDSticky、ACL 与 chattr)
LinuxCentOS系统管理入门笔记第九期——文件权限进阶SUID/SGID/Sticky、ACL 与 chattrLinux系统管理入门系列更多文章欢迎访问Linux入门——系统管理1我的主页AOwhisky这里有更多运维系统性知识整理和其他有趣内容欢迎与我一起探讨学习~引言突破基础权限模型的“三把钥匙”上一期我们学习了 Linux 权限体系的基石——rwx、chmod、chown和umask。这套模型足够应对 80% 的场景但仍有几个“力不从心”的时刻问题一普通用户执行passwd命令时需要修改/etc/shadow但 shadow 文件明明只有 root 可写——这是怎么做到的问题二多个用户属于同一个项目组他们需要在共享目录中协作。A 创建的文件B 为什么无法编辑如何让同组用户自动获得文件的写权限问题三/tmp目录是“公共垃圾场”任何人都能创建文件但为什么你无法删除别人创建的文件问题四如何给不同的用户而不是按“所有者/组/其他人”三类分别授予不同的权限问题五有没有一种方法让 root 自己也无法误删某个重要文件这些问题基础权限模型rwxchmod回答不了。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 的作用SUIDSet User ID是一个特殊权限位。当具有 SUID 权限的可执行文件被运行时进程的有效用户 IDEUID不再是执行者本人而是文件的所有者。最经典的例子是/usr/bin/passwd# 查看 passwd 命令的权限[whiskycentos7 ~]$ls-l/usr/bin/passwd -rwsr-xr-x.1root root27856Apr12020/usr/bin/passwd# ↑# s 表示 SUID 已设置所有者权限中的 x 被替换为 s工作原理步骤说明1whisky用户执行passwd命令2因为passwd有 SUID 位所有者root进程的 EUID 变为root3进程以 root 身份修改/etc/shadow仅 root 可写4修改完成进程退出EUID 恢复为whisky白话理解SUID 就像一张“临时工作证”。普通员工whisky拿到了一张印着“总经理”root的工牌去执行原本只有总经理才能做的操作改 shadow操作完成后工牌自动收回。1.2 SUID 的安全风险与最佳实践方面说明用途允许普通用户执行需要特权的特定操作如passwd、ping风险SUID 程序若存在漏洞攻击者可利用它提权到 root最佳实践最小化 SUID 程序数量定期审计find / -perm -40001.3 设置与移除 SUID# 设置 SUID符号模式[rootcentos7 ~]# chmod us /usr/bin/vim[rootcentos7 ~]# ls -l /usr/bin/vim-rwsr-xr-x.1root root233721610月142020/usr/bin/vim# 设置 SUID数字模式—— 在权限前加 4[rootcentos7 ~]# chmod 4755 /usr/bin/vim# 移除 SUID[rootcentos7 ~]# chmod u-s /usr/bin/vim[rootcentos7 ~]# ls -l /usr/bin/vim-rwxr-xr-x.1root root233721610月142020/usr/bin/vim⚠️生产环境警告永远不要给编辑器vim、nano 等设置 SUID。否则任何用户都能用 vim 以 root 身份修改任意文件如/etc/passwd、/etc/shadow等同于给所有用户 root 权限。1.4 SUID 对目录无效SUID 只对可执行文件有效对目录设置 SUID 没有任何作用。2. SGID目录中的“组继承”魔法2.1 SGID 对文件的作用与 SUID 类似SGIDSet Group ID让进程执行时获得文件所属组的权限# 具有 SGID 的可执行文件不常见ls-l/usr/bin/write -rwxr-sr-x.1roottty19624Apr12020/usr/bin/write# ↑# s 表示 SGID组权限中的 x 被替换为 s2.2 SGID 对目录的作用核心应用当 SGID 设置在目录上时该目录中新创建的文件/子目录会自动继承目录的所属组。场景项目团队devops的成员需要在一个共享目录中协作任何成员创建的文件同组其他成员都应该能读写。# 准备用户和组[rootcentos7 lab]# groupadd devops[rootcentos7 lab]# useradd -G devops dev1[rootcentos7 lab]# useradd -G devops dev2# 准备共享目录[rootcentos7 lab]# mkdir /share[rootcentos7 lab]# chgrp devops /share[rootcentos7 lab]# chmod grwx /share[rootcentos7 lab]# chmod gs /share # 设置 SGID[rootcentos7 lab]# ls -ld /sharedrwxrws---.2root devops40967月1910:00 /share# ↑# s 表示 SGID 已设置# 设置 umask 确保组有写权限[rootcentos7 lab]# echo umask 002 /etc/bashrc# dev1 创建文件[dev1centos7 share]$touchdev1-file[dev1centos7 share]$ls-ldev1-file -rw-rw-r--.1dev1 devops07月1910:02 dev1-file# ↑ ↑# 所有者是 dev1所属组自动变为 devops# dev2 可以修改 dev1 的文件[dev2centos7 share]$echohellodev1-file[dev2centos7 share]$catdev1-file helloSGID vs 普通目录对比场景目录无 SGID目录有 SGID文件所属组创建者的主要组自动继承父目录的组团队协作需手动chgrp自动生效2.3 设置与移除 SGID# 设置 SGID符号模式[rootcentos7 ~]# chmod gs /share# 设置 SGID数字模式—— 在权限前加 2[rootcentos7 ~]# chmod 2770 /share# 移除 SGID[rootcentos7 ~]# chmod g-s /share3. Sticky Bit公共目录的“防盗锁”3.1 Sticky Bit 的作用Sticky Bit粘滞位设置在目录上时只有文件的所有者、目录的所有者或 root 才能删除/重命名该目录中的文件即使其他人对该目录有写权限。最典型的例子是/tmp目录[whiskycentos7 ~]$ls-ld/tmp drwxrwxrwt.20root root40967月1910:05 /tmp# ↑# t 表示 Sticky Bit其他人权限中的 x 被替换为 t场景演示# 创建带 Sticky Bit 的公共目录[rootcentos7 lab]# mkdir /public[rootcentos7 lab]# chmod 1777 /public # 777 Sticky[rootcentos7 lab]# ls -ld /publicdrwxrwxrwt.2root root40967月1910:10 /public# whisky 创建文件[whiskycentos7 public]$echowhiskys filewhisky-file[whiskycentos7 public]$chmod666whisky-file# 开放所有权限# laowang 试图删除 whisky 的文件失败[laowangcentos7 public]$rmwhisky-file rm: cannot removewhisky-file:Operation not permitted3.2 为什么需要 Sticky Bit场景无 Sticky有 Sticky/tmp目录任何用户可删除别人的临时文件只能删除自己的文件共享上传目录用户可覆盖/删除他人上传的文件用户只能管理自己的文件团队协作目录权限混乱文件可能被误删文件受到保护3.3 设置与移除 Sticky Bit# 设置 Sticky Bit符号模式[rootcentos7 ~]# chmod ot /public# 设置 Sticky Bit数字模式—— 在权限前加 1[rootcentos7 ~]# chmod 1777 /public# 移除 Sticky Bit[rootcentos7 ~]# chmod o-t /public4. 特殊权限数字表示法与查找4.1 三位特殊权限的数值特殊权限在数字模式中占据权限数字的最前面一位特殊权限数值含义SUID4执行时获得所有者权限SGID2执行时获得组权限 / 目录继承组Sticky1目录中仅所有者可删除文件组合示例权限写法特殊位所有者组其他人含义47554755SUID rwxr-xr-x27502750SGID rwxr-x—17771777Sticky rwxrwxrwx6755426755SUIDSGID rwxr-xr-x4.2 查看特殊权限# 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 查找特殊权限文件# 查找系统中所有具有 SUID 的文件[rootcentos7 ~]# find / -perm -4000 2/dev/null# 查找系统中所有具有 SGID 的文件[rootcentos7 ~]# find / -perm -2000 2/dev/null# 查找系统中所有具有 Sticky Bit 的目录[rootcentos7 ~]# find / -perm -1000 -type d 2/dev/null# 使用符号模式查找[rootcentos7 ~]# find / -perm -us 2/dev/null[rootcentos7 ~]# find / -perm -gs 2/dev/null[rootcentos7 ~]# find / -perm -ot -type d 2/dev/null4.4 特殊权限速查表特殊权限符号模式数字模式作用对象效果SUIDus4xxx文件执行时 EUID 文件所有者SGIDgs2xxx文件/目录文件EUID 文件组目录新文件继承目录组Stickyot1xxx目录仅所有者可删除目录中的文件5. ACL打破三组权限的限制5.1 为什么需要 ACL基础权限模型只能为所有者 / 组 / 其他人三类设置权限。但实际需求更复杂场景需求基础权限能否满足文件只给whisky读写设置所有者 whisky✅ 可以文件给whisky读写laowang只读whisky 是所有者laowang 是其他人❌ 无法区分目录给devops组读写但admin组只读只能设一个组❌ 只能一个组临时给某人只读权限需修改文件所有者或组❌ 操作复杂ACLAccess Control List访问控制列表解决了这个问题——可以为任意多个用户/组单独设置权限。5.2 查看 ACL# 创建测试文件[rootcentos7 lab]# touch testfile[rootcentos7 lab]# ls -l testfile-rw-r--r--.1root root07月1910:20 testfile# ↑# . 表示该文件有 ACL 扩展属性# 查看 ACL[rootcentos7 lab]# getfacl testfile# file: testfile# owner: root# group: rootuser::rw-# 所有者权限group::r--# 组权限other::r--# 其他人权限5.3 设置 ACL针对用户设置# 设置 whisky 用户对 testfile 有读写权限[rootcentos7 lab]# setfacl -m u:whisky:rw testfile[rootcentos7 lab]# getfacl testfile# file: testfile# owner: root# group: rootuser::rw- user:whisky:rw-# ← 新增group::r-- mask::rw-# ← 自动生成的 maskother::r--# 验证whisky 可读可写[whiskycentos7 lab]$echohellotestfile[whiskycentos7 lab]$cattestfile hello针对组设置# 设置 wheel 组对 testfile 有读写权限[rootcentos7 lab]# setfacl -m g:wheel:rw testfile[rootcentos7 lab]# getfacl testfile# file: testfile# owner: root# group: rootuser::rw- user:whisky:rw- group::r-- group:wheel:rw-# ← 新增mask::rw- other::r--删除 ACL 条目# 删除特定用户的 ACL[rootcentos7 lab]# setfacl -x u:whisky testfile# 删除特定组的 ACL[rootcentos7 lab]# setfacl -x g:wheel testfile# 删除所有 ACL恢复为基础权限[rootcentos7 lab]# setfacl -b testfile5.4 目录的默认 ACL默认 ACL 使得目录中新创建的文件自动继承 ACL 规则。# 为目录设置默认 ACL所有新文件继承[rootcentos7 lab]# mkdir /shared[rootcentos7 lab]# setfacl -m d:u:whisky:rw /shared# 查看目录的默认 ACL[rootcentos7 lab]# getfacl /shared# file: shared# owner: root# group: rootuser::rwx group::r-x other::r-x default:user::rwx default:user:whisky:rw-# ← 默认 ACLdefault:group::r-x default:mask::rwx default:other::r-x# 创建新文件自动继承 ACL[rootcentos7 lab]# touch /shared/newfile[rootcentos7 lab]# getfacl /shared/newfile# file: newfile# owner: root# group: rootuser::rw- user:whisky:rw-# ← 自动继承group::r-x#effective:r--mask::rw- other::r--5.5 maskACL 的“最大权限”mask是 ACL 中一个特殊的权限位它限制了所有 ACL 条目用户和组能拥有的最大权限。[rootcentos7 lab]# getfacl testfileuser:whisky:rw- group:wheel:rw- mask::rw-# mask 为 rw-# 限制 mask 为只读[rootcentos7 lab]# setfacl -m m:r testfile[rootcentos7 lab]# getfacl testfileuser: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清除所有 ACLsetfacl -b file6. chattr文件“金钟罩”6.1 为什么需要 chattrACL 和基础权限可以控制“谁”能访问文件但无法阻止文件所有者包括 root误删或误改文件。chattrChange Attribute设置的扩展属性让文件获得“免疫力”。6.2 两个最常用的属性属性含义作用aappend only只能追加内容不能覆盖、删除或重命名iimmutable不可变更任何修改、删除、重命名都被禁止6.3 append onlya属性适合日志文件——只允许追加不允许覆盖或删除。[rootcentos7 lab]# touch operator.log[rootcentos7 lab]# chattr a operator.log# 尝试覆盖失败[rootcentos7 lab]# echo new content operator.log-bash: operator.log: 不允许的操作# 尝试追加成功[rootcentos7 lab]# echo append line 1 operator.log[rootcentos7 lab]# echo append line 2 operator.log[rootcentos7 lab]# cat operator.logappend line1append line2# 尝试删除失败[rootcentos7 lab]# rm -f operator.logrm: 无法删除operator.log:不允许的操作# 移除 a 属性[rootcentos7 lab]# chattr -a operator.log[rootcentos7 lab]# rm -f operator.log # 现在可以删除6.4 immutablei属性适合关键配置文件如/etc/passwd、/etc/sudoers——完全锁定防止任何意外修改。[rootcentos7 lab]# cp /etc/passwd .[rootcentos7 lab]# chattr i passwd# 任何修改都被禁止[rootcentos7 lab]# echo test passwd-bash: passwd: 不允许的操作[rootcentos7 lab]# rm -f passwdrm: 无法删除passwd:不允许的操作[rootcentos7 lab]# mv passwd passwd.bakmv: 无法移动passwd至passwd.bak:不允许的操作# 移除 i 属性唯一恢复方式[rootcentos7 lab]# chattr -i passwd[rootcentos7 lab]# echo test passwd # 现在可以修改6.5 chattr vs chmod 对比维度chattrchmod作用对象文件扩展属性文件访问权限是否可被 root 绕过❌root 也无法绕过✅ root 可以绕过常见用途防误删、防篡改控制谁可以访问查看方式lsattrls -l6.6 查看扩展属性lsattr[rootcentos7 lab]# lsattr passwd----i-----------passwd# i 属性已设置[rootcentos7 lab]# lsattr operator.log-----a---------- operator.log# a 属性已设置7. 总结与速查手册7.1 核心知识点一览主题关键点SUIDus执行时 EUID 文件所有者只对文件有效SGIDgs文件执行时 EGID 文件组目录新文件继承目录组Sticky Bitot目录中仅所有者可删除文件特殊权限数字SUID4SGID2Sticky1如4755、1777ACLsetfacl/getfacl为任意用户/组单独设权限chattri不可变a仅追加root 也无法绕过7.2 命令速查表命令常用形式作用chmodchmod us file设置 SUIDchmodchmod gs dir设置 SGIDchmodchmod ot dir设置 Sticky Bitsetfaclsetfacl -m u:whisky:rw file设置 ACLgetfaclgetfacl file查看 ACLchattrchattr i file锁定文件lsattrlsattr file查看扩展属性7.3 特殊权限数字速查组合数值权限字符串示例SUID4-rwsr-xr-x4755SGID2-rwxr-sr-x2755Sticky1drwxrwxrwt1777SUIDSGID6-rwsr-sr-x67557.4 常见错误排查问题原因解决方案chmod: invalid mode特殊权限语法错误使用us、gs、ot目录中文件仍属于创建者组目录未设置 SGIDchmod gs dir无法删除/tmp中的文件Sticky Bit 保护确认文件所有者是谁setfacl命令不存在未安装 ACL 工具包yum install -y aclchattr: 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 程序团队共享目录设置 SGIDchmod gs umask 002确保文件自动继承组公共临时目录设置 Sticky Bitchmod 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