SUID、SGID和Sticky位是Linux中三类特殊权限:SUID使可执行文件以所有者身份运行,SGID对文件影响执行组身份、对目录使新建文件继承目录所属组,Sticky位限制公共目录中用户仅能删除自己创建的文件。

Linux中的SUID、SGID和Sticky位是三类特殊权限,用于解决普通用户在特定场景下需要临时获得更高权限或保障文件安全的问题。它们不改变文件的基本读写执行权限,而是通过额外的权限位(分别对应权限字符串中的第4位、第5位和第6位)来控制程序执行时的身份或目录内文件的操作行为。
SUID:让普通用户以文件所有者身份运行程序
SUID(Set User ID)只对可执行文件有效。当一个程序设置了SUID位,任何用户执行它时,进程的有效用户ID(EUID)会临时变成该文件所有者的UID,而不是执行者的UID。这是实现“有限提权”的关键机制。
- 典型应用:/usr/bin/passwd 命令。普通用户需要修改自己的密码,而密码哈希实际存于只有root可写的 /etc/shadow 中。passwd 设置了SUID(权限显示为 -r-sr-xr-x),执行时以root身份运行,从而能安全更新 shadow 文件。
-
设置方法:使用
chmod u+s filename或chmod 4xxx filename(如chmod 4755 /usr/local/bin/mytool)。 - 注意事项:SUID仅对本地执行的二进制文件生效,对shell脚本无效(出于安全考虑,大多数内核忽略脚本的SUID位);过度使用SUID可能带来安全风险,应严格限制其使用范围。
SGID:影响执行身份或目录内新建文件的组归属
SGID(Set Group ID)有两种作用场景,取决于它设置在文件还是目录上:
- 对可执行文件:类似SUID,但改变的是进程的有效组ID(EGID)。例如某些网络服务工具需访问特定组权限的资源,可通过SGID赋予临时组权限(权限显示为 -r-xr-sr-x)。
- 对目录:更常用。当目录设置了SGID位(权限显示为 drwxr-sr-x),在此目录中创建的新文件或子目录,其所属组自动继承该目录的组,而非创建者默认组。这对协作项目非常有用。
-
设置方法:
chmod g+s dirname或chmod 2775 dirname;若同时需SUID+SGID,用chmod 6755。
Sticky位:保护公共目录中他人文件不被误删
Sticky位(粘滞位)只对目录有意义。启用后,即使用户对目录有写权限,也仅能删除自己创建的文件,无法删除同目录下其他用户创建的文件——这是防止公共目录(如 /tmp)中文件被随意覆盖或删除的核心机制。
- 典型应用:/tmp 目录通常权限为 drwxrwxrwt(末位t即Sticky位)。所有用户都能在其中建文件,但只能删自己的。
-
设置方法:
chmod +t dirname或chmod 1777 dirname(如共享上传目录)。 - 注意:Sticky位不影响文件读写,只约束删除和重命名操作;它与文件所有者、所在组无关,判断依据是文件的真正创建者(即文件的owner)是否等于当前操作用户。
这三个特殊权限不是常规权限的替代品,而是精准解决特定权限模型短板的设计。合理使用能兼顾功能与安全,滥用则可能打开提权漏洞。实践中应遵循最小权限原则,定期审计带有SUID/SGID的文件(如 find / -perm -4000 -o -perm -2000 2>/dev/null),并避免在不可信程序上设置这些位。










