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

  • mount

  • ping(早期版本)


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-x

s 出现在 group 位


3. 行为机制

假设:

  • 目录 group = www

  • 用户 userA 创建文件

结果:

复制代码
文件 group = www(自动继承)

4. 典型场景

  • Web 目录(www-data / nginx)

  • 团队共享目录

  • CI/CD 构建目录


5. 关键价值

SGID 解决的是:

"多人协作时 group 不一致问题"

否则需要手动 chgrp,非常容易出错。


三、Sticky Bit(粘滞位)


1. 核心定义

目录中用户只能删除自己创建的文件


2. 典型目录

复制代码
/tmp

权限:

复制代码
drwxrwxrwt

t 表示 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 → 删除约束(保护)