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