Linux 系统中的文件权限管理是系统安全的重要基石。除了常见的读(r)、写(w)、执行(x)权限外,还存在三位特殊的权限位:​​SUID​​、​​SGID​​ 和 ​​Sticky Bit​​(粘滞位)。它们提供了更精细的访问控制能力,对于系统管理和协作环境至关重要。

1 特殊权限概述

在 Linux 中,使用 ls -l 命令查看文件详细信息时,权限字段通常由 10 个字符组成:

•​​第 1 位​​:文件类型(- 表示普通文件,d 表示目录,l 表示链接等)

•​​第 2-4 位​​:文件所有者(User)的权限

•​​第 5-7 位​​:文件所属组(Group)的权限

•​​第 8-10 位​​:其他用户(Others)的权限

特殊权限会占用执行位(x)的位置,并通过 s 或 t 字符显示:

•​​SUID​​:出现在所有者执行位,显示为 s 或 S(例如 rwsr-xr-x)

•​​SGID​​:出现在组执行位,显示为 s 或 S(例如 rwxr-sr-x)

•​​Sticky Bit​​:出现在其他用户执行位,显示为 t 或 T(例如 rwxrwxrwt)

​​小写字母(s, t)​​ 表示该位置​​既有特殊权限,又有执行权限​​。

​​大写字母(S, T)​​ 表示​​仅有特殊权限,但没有执行权限​​。

​​特殊权限的数字表示法​​(作为四位八进制权限表示的首位):

•SUID 对应数字 ​​4​​

•SGID 对应数字 ​​2​​

•Sticky Bit 对应数字 ​​1​​

2 SUID (Set User ID)

作用与原理

SUID 是针对​​可执行文件​​的特殊权限。当用户执行一个设置了 SUID 的程序时,该进程将​​临时获得文件所有者的权限​​,而不是执行者自身的权限。执行结束后,权限自动恢复。

典型应用

最常见的例子是 passwd 命令。普通用户需要修改 /etc/shadow 文件(该文件默认仅 root 可写),正是因为 /usr/bin/passwd 程序上设置了 SUID 权限:

$ ls -l /usr/bin/passwd

-rwsr-xr-x 1 root root 59976 Nov 24 2022 /usr/bin/passwd

普通用户执行 passwd 时,会临时以 root 身份运行,从而能够修改 /etc/shadow 文件。

设置与取消

​​设置 SUID​​:

chmod u+s filename # 符号方式设置SUID

chmod 4755 filename # 数字方式设置:4表示SUID,755为基础权限

​​取消 SUID​​:

chmod u-s filename # 符号方式取消SUID

chmod 755 filename # 数字方式取消:将首位特殊权限数字置0

注意事项

1.​​仅对可执行文件有效​​:SUID 设置在非可执行文件上通常没有意义(权限位会显示为大写 S)。

2.​​对 Shell 脚本无效​​:出于安全考虑,大多数 Linux 系统会忽略 Shell 脚本上的 SUID 位。

3.​​安全风险​​:SUID 机制赋予临时的高权限,如果设置在不安全的程序上,可能被利用进行权限提升。应严格审计系统中的 SUID 文件(使用 find / -perm -4000 2>/dev/null),并避免为 Shell 解释器(如 /bin/bash)设置 SUID。

3 SGID (Set Group ID)

作用与原理

SGID 对文件和目录的作用不同:

•​​对可执行文件​​:用户执行时,进程会​​临时获得文件所属组的权限​​。

•​​对目录​​:在该目录下​​新建的文件或子目录,其所属组会自动继承该目录的所属组​​,而不是创建者的主组。

典型应用

SGID 常用于​​团队协作的共享目录​​。例如,创建一个所属组为 devteam 的共享目录:

sudo mkdir /data/project

sudo chown :devteam /data/project # 设置目录所属组

sudo chmod g+s /data/project # 设置SGID

ls -ld /data/project # 查看权限

# 输出示例:drwxr-sr-x 2 root devteam 4096 /data/project

此后,任何用户(只要有权限)在 /data/project 目录下创建的文件,其所属组都会自动设置为 devteam,便于团队成员共享和访问。

设置与取消

​​设置 SGID​​:

chmod g+s directory_name # 符号方式设置SGID

chmod 2775 directory_name # 数字方式设置:2表示SGID,775为基础权限

​​取消 SGID​​:

chmod g-s directory_name # 符号方式取消SGID

chmod 0755 directory_name # 数字方式取消:将首位特殊权限数字置0

注意事项

1.​​目录权限配合​​:SGID 目录需确保其所属组具有适当的权限(如写权限 g+w),否则组内其他成员可能无法操作新创建的文件。

2.​​递归设置​​:SGID 权限仅影响​​新创建​​的文件或子目录。对于目录中已存在的文件,需要手动使用 chgrp 命令修改所属组。

4 Sticky Bit (粘滞位)

作用与原理

Sticky Bit 是为​​目录​​设置的特殊权限。它用于保护多用户共享目录中的文件:​​只有文件的所有者、目录的所有者或 root 用户才能删除或重命名该目录下的文件​​。其他用户即使对目录有写权限,也不能删除或重命名他人的文件。

典型应用

最典型的例子是系统的临时目录 /tmp:

$ ls -ld /tmp

drwxrwxrwt 12 root root 4096 Jul 2 11:57 /tmp

所有用户都可在 /tmp 中创建文件,但因 Sticky Bit 的存在,用户无法删除其他用户创建的文件。

设置与取消

​​设置 Sticky Bit​​:

chmod +t directory_name # 符号方式设置粘滞位

chmod 1777 directory_name # 数字方式设置:1表示粘滞位,777为基础权限

​​取消 Sticky Bit​​:

chmod -t directory_name # 符号方式取消粘滞位

chmod 0777 directory_name # 数字方式取消:将首位特殊权限数字置0

注意事项

•​​仅对目录有效​​:Sticky Bit 设置在文件上通常没有意义,大多数 Linux 系统会忽略。

•​​权限协调​​:即使目录设置了 o+w(其他用户可写),Sticky Bit 仍然会限制删除权限,确保安全性。

5 特殊权限的组合使用

特殊权限可以组合设置。例如,为一个团队共享目录同时设置 SGID(确保文件继承组权限)和 Sticky Bit(保护文件不被随意删除):

chmod 3775 /data/team_shared # 3 = 2 (SGID) + 1 (Sticky Bit), 775为基础权限

6 安全最佳实践

特殊权限功能强大,但滥用可能带来安全风险。以下是一些最佳实践:

1.​​最小权限原则​​:仅在真正需要时才设置特殊权限,避免不必要的使用。

2.​​定期审计​​:使用 find 命令定期检查系统中的特殊权限文件:

find / -perm -4000 2>/dev/null # 查找所有SUID文件

find / -perm -2000 2>/dev/null # 查找所有SGID文件和目录

find / -perm -1000 2>/dev/null # 查找所有设置了Sticky Bit的目录

3.​​谨慎设置 SUID​​:避免为 bash、sh 等 Shell 解释器设置 SUID,防止权限提升攻击。

4.​​结合其他机制​​:对于更复杂的权限需求,可结合文件访问控制列表(ACL)或扩展属性(如 chattr +i 设置不可修改位)来实现更精细的权限控制。

总结

SUID、SGID 和 Sticky Bit 是 Linux 权限管理中强大且实用的补充机制。理解并合理运用它们,可以有效地解决普通用户需要临时高权限执行特定命令、团队协作目录权限继承以及共享目录防误删等常见问题。牢记​​最小权限原则​​并​​定期审计​​,是确保系统安全的关键。