三个特殊权限

在普通 rwx 之外,每个文件 / 目录还有 3 个特殊位:

4xxx = SUID(Set User ID)
2xxx = SGID(Set Group ID)
1xxx = Sticky Bit

数字权限是 4 位时,第一位就是这些:

chmod 4755 script        # SUID + 755
chmod 2755 folder        # SGID + 755
chmod 1777 /tmp          # Sticky + 777

或者符号法:

chmod u+s file           # 加 SUID
chmod g+s folder         # 加 SGID
chmod +t folder          # 加 Sticky

SUID:执行时变成所有者

普通命令以运行它的人的身份跑。SUID 文件以文件所有者的身份跑。

经典例子:passwd 命令。

ls -l /usr/bin/passwd
# -rwsr-xr-x 1 root root ... /usr/bin/passwd
#    ↑
#    s = SUID(属主位的 x 变成 s)

普通用户 wadelypasswd,过程中需要修改 /etc/shadow(只 root 能写)。SUID 让 passwd 临时以 root 身份运行——所以你能改自己的密码。

SUID 是安全雷区

  • 任何 SUID-to-root 的程序 = 潜在提权漏洞
  • 自己写的脚本永远不要加 SUID(shell SUID 大多数系统已禁)
  • 定期审计:find / -perm -4000 -type f 2>/dev/null

SGID:执行时变成所属组 / 目录继承组

对可执行文件

类似 SUID,但变成的是文件的组

ls -l /usr/bin/wall
# -rwxr-sr-x 1 root tty ... /usr/bin/wall
#          ↑
#          组位的 x 变成 s

wall 给所有终端发消息,需要 tty 组权限。

对目录 ★ 最有用

在该目录里新建的文件 / 子目录会自动归这个目录的组——而不是用户的主组。

sudo mkdir /srv/team
sudo chown root:team /srv/team
sudo chmod 2775 /srv/team

# 现在 wadely(主组是 wadely)在里面新建文件
touch /srv/team/hello.txt
ls -l /srv/team/hello.txt
# -rw-r--r-- 1 wadely team ... hello.txt
#                    ↑
#                    自动归 team 组(不是 wadely 组)

SGID 目录是团队共享目录的关键——见上一篇 group-mgmt 末尾的例子。

Sticky Bit:只有所有者能删自己的文件

经典用途:/tmp 目录。

ls -ld /tmp
# drwxrwxrwt 18 root root ... /tmp
#          ↑
#          其他人位的 x 变成 t = Sticky

/tmp 权限是 1777——任何人都能进去 + 创建文件,但只能删自己的。否则你删别人的文件、别人删你的,大家都没法用。

适用:多人共享目录

三者对比

数字 对文件 对目录
SUID 4 执行时变文件所有者 无意义
SGID 2 执行时变文件组 新建项继承本目录组 ★
Sticky 1 旧用法(已废弃) 只所有者能删自己的 ★

实战检查 SUID 文件

# 列出所有 SUID 文件(每个都该审一遍)
find / -perm -4000 -type f 2>/dev/null

# 列出所有 SGID 文件
find / -perm -2000 -type f 2>/dev/null

定期检查这两个清单——多出来的可能是入侵后的后门。

显示中的字符

权限位 x 处显示 s/t:

rwsr-xr-x   = SUID 设置(s 代替 x)
rwSr-xr-x   = SUID 设置但没 x(大写 S)

rwxr-sr-x   = SGID
rwxr-Sr-x   = SGID 但没 x

rwxrwxrwt   = Sticky(小写 t)
rwxrwxrwT   = Sticky 但没 x

下一篇:sudo 配置深入。