Linux 特殊权限详解(SUID / SGID / Sticky Bit)
在 Linux 的权限体系中,基础rwx只能解决“谁能读写执行”,但无法覆盖一些更复杂的场景,例如:
需要“临时以文件所有者身份执行”
需要“目录内文件自动继承组”
需要“共享目录禁止互删”
于是引入了三种特殊权限位:
SUID / SGID / Sticky Bit
一、SUID(Set User ID)
1. 核心定义(一句话)
执行文件时,以文件所有者身份运行进程
2. 权限表现
-rwsr-xr-x root root /usr/bin/passwd重点:
s出现在 user 权限位表示 SUID 生效
3. 行为机制(非常重要)
当普通用户执行程序:
| 项目 | 值 |
|---|---|
| Real UID | userA |
| Effective UID | root |
| 文件所有者 | root |
👉 关键点:
进程权限由 EUID 决定,而不是实际用户
4. 典型用途
系统级工具:
/usr/bin/passwd(修改/etc/shadow)mountping(早期版本)
5. 安全本质(重点)
SUID 本质是:
权限提升通道
风险来源:
shell 调用
PATH 劫持
环境变量污染
可写配置文件
生产结论:
SUID = 高风险设计(必须极度克制)
6. 设置方式
chmod u+s file chmod 4755 file二、SGID(Set Group ID)
SGID 分两种语义:文件 & 目录(重点是目录)
2.1 SGID(作用于文件)
行为:
执行文件时,进程 GID = 文件所属组
实际使用较少,主要用于特定共享工具。
2.2 SGID(作用于目录 ⭐生产重点)
1. 核心定义
在该目录下创建的文件,自动继承目录的 group
2. 示例
chmod g+s /data/shared表现:
drwxrwsr-xs出现在 group 位
3. 行为机制
假设:
目录 group = www
用户 userA 创建文件
结果:
文件 group = www(自动继承)4. 典型场景
Web 目录(www-data / nginx)
团队共享目录
CI/CD 构建目录
5. 关键价值
SGID 解决的是:
“多人协作时 group 不一致问题”
否则需要手动 chgrp,非常容易出错。
三、Sticky Bit(粘滞位)
1. 核心定义
目录中用户只能删除自己创建的文件
2. 典型目录
/tmp权限:
drwxrwxrwtt表示 sticky bit
3. 行为规则(非常关键)
在 sticky 目录中:
| 用户 | 能否删除他人文件 |
|---|---|
| 文件所有者 | ✔ |
| root | ✔ |
| 其他用户 | ✘ |
4. 为什么必须存在?
如果没有 sticky bit:
/tmp= 777任意用户可以删所有人文件
系统直接不可用
5. 设置方式
chmod +t dir chmod 1777 dir四、三者对比(核心理解表)
| 特性 | 作用对象 | 行为 | 本质 |
|---|---|---|---|
| SUID | 文件 | 以 owner 身份执行 | 临时提权 |
| SGID | 文件/目录 | 继承 group / 执行组权限 | 协作控制 |
| Sticky Bit | 目录 | 限制删除权限 | 防互删 |
五、权限位在 Linux 中的编码
| 权限 | 八进制 |
|---|---|
| SUID | 4000 |
| SGID | 2000 |
| Sticky | 1000 |
示例组合
chmod 2755 dir # SGID chmod 4755 file # SUID chmod 1777 tmp # Sticky六、真实生产理解模型(非常重要)
可以用一句话理解三者:
SUID:权限“借用”
我执行程序,但借用文件主人的身份
SGID:权限“继承”
我在这个目录创建的东西自动归某个组
Sticky Bit:权限“保护”
这个地方可以共享,但不能互相破坏
七、常见误区(生产踩坑点)
❌ 误区1:SUID = 安全功能
实际上:
SUID 是安全风险入口
❌ 误区2:SGID 只用于执行
实际上:
80% 场景是目录继承
❌ 误区3:Sticky Bit 没用
实际上:
是 /tmp 安全模型核心
总结
Linux 三大特殊权限本质是三种控制模型:
SUID →身份切换(提权)
SGID →组继承(协作)
Sticky →删除约束(保护)