三个特殊权限
在普通 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)
普通用户 wadely 跑 passwd,过程中需要修改 /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 配置深入。