大家好!在处理Linux时,我们经常会遇到一些仅凭rwx(读取/写入/执行)无法解释的奇特权限。
“为什么我能修改自己的密码,但/etc/shadow文件只有root才能查看?”
“为什么在共享文件夹中,我创建的文件却能被其他人删除?”
所有这些疑问的答案都藏在特殊权限(Special Permissions)中。今天,我们将非常详细地剖析系统工程师和安全管理员必须掌握的SetUID、SetGID、Sticky Bit。☕ 泡杯咖啡,慢慢跟我来吧!

1. 🎭 SetUID: “假面舞会的开始”
SetUID(Set User ID)是Linux权限体系中最强大也可能最危险的功能。
💡 核心概念
通常,当您执行一个程序时,该进程会以“执行者”的权限运行。但是,设置了SetUID的文件会以“文件所有者(Owner)”的权限运行。这就像戴上国王的面具,暂时拥有国王的权力一样。
🔍 典型案例: passwd
我们来看看用于修改密码的passwd命令:
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 68208 ... /usr/bin/passwd
- 所有者: root
- 权限: rws(这里的s就是SetUID!)
密码信息存储在/etc/shadow文件中,该文件只有root才能修改。
- 普通用户(user1)执行passwd。
- 由于SetUID的设置,进程在执行期间暂时获得root权限。
- 利用该权限安全地修改/etc/shadow并退出。
- 进程结束后,权限恢复到原始状态。
⚙️ 设置方法
- 字符模式: chmod u+s 文件名
- 数字模式: chmod 4755 文件名(最前面的4表示SetUID)
2. 🤝 SetGID: “协作的智能规则”
SetGID(Set Group ID)在应用于文件和目录时完全不同。在实际工作中,它主要用于在目录上设置,以构建协作环境。
📂 目录上的SetGID(协作的核心)
假设多个开发人员共享一个项目文件夹。
- 问题: 如果开发人员A创建了一个文件,其所属组将变为dev-a,开发人员B可能无法修改该文件。这会带来每次都需要修改权限的麻烦。
- 解决方案: 对项目目录设置SetGID。
- 在此目录中创建的所有文件/文件夹将自动继承父目录的组所有权(Group Ownership)。
- 无论谁创建文件,组都将统一,从而促进顺畅的共享。
📄 文件上的SetGID
与SetUID类似。执行时,它会以文件所属组的权限运行。(与SetUID相比,不常用。)
⚙️ 设置方法
- 字符模式: chmod g+s 目录名
- 数字模式: chmod 2775 目录名(最前面的2表示SetGID)
- 验证: 组执行权限位置会显示s,例如drwxr-sr-x。
3. 🛡️ Sticky Bit: “我的东西只有我能扔”
顾名思义,这是一种“粘性”权限。它主要用于防止共享目录中的混乱。
💡 核心概念
在Linux中,如果目录具有“写入(w)”权限,则可以删除其中的文件。问题是,其他人创建的文件也可以被删除。
在设置了Sticky Bit的目录中,“只有文件所有者(和root)才能删除或重命名该文件。”
🔍 典型案例: /tmp
Linux的临时存储目录/tmp必须允许任何人访问并创建文件。
$ ls -ld /tmp
drwxrwxrwt 19 root root 4096 ... /tmp
- 权限: rwxrwxrwt(末尾的t就是Sticky Bit。)
- 所有用户都可以写入文件(w),但设置了t,可以防止其他用户意外(或故意)删除您创建的临时文件。
⚙️ 设置方法
- 字符模式: chmod o+t 目录名
- 数字模式: chmod 1777 目录名(最前面的1表示Sticky Bit)
4. 🧮 进阶: 数字模式和大写标记的秘密
要完全理解特殊权限,这两个细节不容错过。
1) 4位数字模式计算方法
您在使用chmod时是否见过4位数字而不是3位?
- 4000: SetUID
- 2000: SetGID
- 1000: Sticky Bit
例如,chmod 4755是4000(SetUID)+ 755(rwxr-xr-x)的组合。
2) 大写“S”和“T”的含义
有时,在ls -l的输出中,您可能会看到大写S或T而不是小写s或t。这不是拼写错误!
- 小写(s, t): 在执行权限(x)存在的情况下授予特殊权限。(正常运行)
- 大写(S, T): 在执行权限(x)不存在的情况下授予特殊权限。
- 示例: 如果对rw-rw-r–文件设置SetUID,它将变为rwSrw-r–。
- 含义: 这就像一个警告标志,表示“特殊权限已设置,但由于没有执行权限,它实际上不会起作用。”
5. 🚨 给安全管理员的建议
SetUID可能是系统安全最大的漏洞。
- 风险: 如果有人偷偷地给bash shell或vim编辑器等程序设置了SetUID(root所有)怎么办?
- 普通用户一旦打开vim,就会获得root权限,从而可以修改系统上的所有文件。这被称为权限提升(Privilege Escalation)攻击。
- 安全检查提示: 定期搜索系统上所有设置了SetUID的文件,检查是否存在意外的文件。
# 在整个系统中查找设置了SetUID的文件
find / -user root -perm -4000 -print 2>/dev/null
📝 总结表
| 类别 | 作用 | 标记位置 | 字符 | 数字值 |
|---|---|---|---|---|
| SetUID | 执行时获取所有者权限 | User | s | 4000 |
| SetGID | 执行时获取组权限 / 目录组继承 | Group | s | 2000 |
| Sticky Bit | 防止在共享文件夹中删除他人文件 | Other | t | 1000 |
希望今天的内容对您理解Linux权限体系有很大帮助。通过有效利用这三种特殊权限,您可以同时提高系统安全性和协作效率!
下一篇文章我们将探讨Linux ACL(访问控制列表)。感谢您的阅读。🙇♂️
发表回复