进阶权限:SUID、SGID、SBIT 是如何影响系统提权的?
刚接手 Linux 服务器运维,你是不是遇到过“明明给了执行权限,程序还是跑不起来”或者“别人能删我目录里的文件,我却拦不住”的情况?这通常不是普通权限(rwx)的问题,而是你没搞懂 SUID、SGID、SBIT 这三个特殊权限。这篇文章直接用实战命令和排障案例,帮你搞清楚它们是怎么影响系统提权和安全策略的。主机选的 Linux 教程一向只讲能落地的东西,看完你就能在服务器运维中直接套用。

SUID 权限:临时提升执行者的身份
SUID 到底干了什么?
普通权限里,你执行一个脚本,它的进程身份是你自己。但一旦脚本的属主是 root 且设置了 SUID,那任何用户执行它时,进程的有效用户 ID 都临时变成 root。典型的例子就是 `passwd` 命令——普通用户能改自己密码,靠的就是 SUID。
如何查看和设置 SUID?
先用 `ls -l` 看文件权限位。如果属主权限的 x 位变成了 s(小写),就是有 SUID;如果是 S(大写),说明 SUID 设了但没执行权限。
查看 passwd 命令的权限
ls -l /usr/bin/passwd
输出类似:-rwsr-xr-x 1 root root 59976 3月 22 2024 /usr/bin/passwd
看到属主的 x 位是 s,说明 SUID 生效
给一个脚本设置 SUID
chmod u+s /path/to/script.sh
或者用数字法:4 代表 SUID
chmod 4755 /path/to/script.sh
**老鸟叮嘱**:别随便给自定义脚本加 SUID。一旦脚本有漏洞,普通用户就能拿到 root 权限,整台 VPS 直接裸奔。比如一个 SUID 的 shell 脚本里调用了 `cp` 命令,攻击者就能通过软链接替换文件。
SGID 权限:目录下的文件自动继承属组
SGID 适用于哪些场景?
SGID 在文件上可以让执行者临时继承文件属组身份;但在目录上,它的用途更常见——所有在该目录下新建的文件和子目录,都会自动继承该目录的属组。多用户协作的共享目录、Git 仓库、项目部署目录,必须靠它来避免权限混乱。
设置 SGID 并验证效果
创建共享目录,设置 SGID
mkdir /data/share
chown :devteam /data/share
chmod g+s /data/share
数字法:2 代表 SGID,2755 表示 rwxr-sr-x
chmod 2755 /data/share
测试:切换到普通用户,在该目录下创建文件
su – developer
touch /data/share/test.txt
ls -l /data/share/test.txt
输出属组应该是 devteam,而不是 developer 的私有组
**排障区**:如果你发现新文件属组没继承,先检查父目录的 SGID 是否还在(`ls -ld /data/share`),或者是否被 umask 覆盖了。umask 022 不会影响属组继承,但 umask 077 可能导致目录权限过严,文件创建失败。
SBIT 粘滞位:防止别人删你的文件
SBIT 的典型应用场景
SBIT 最经典的应用就是 `/tmp` 目录。所有人都能往 /tmp 里写文件,但只能删除自己创建的文件。没有 SBIT,A 用户就能删掉 B 用户放在 /tmp 里的临时文件,安全漏洞直接拉满。
如何检查和设置 SBIT?
查看 /tmp 目录的权限
ls -ld /tmp
输出类似:drwxrwxrwt 18 root root 4096 3月 22 10:00 /tmp
注意 other 权限的 x 位是 t(小写),说明 SBIT 生效
给一个目录设置 SBIT
chmod o+t /data/shared_tmp
数字法:1 代表 SBIT,1777 表示 rwxrwxrwt
chmod 1777 /data/shared_tmp
**老鸟叮嘱**:SBIT 只对目录有效,对文件设置 SBIT 在 Linux 上会被忽略。另外,SBIT 只限制删除和重命名,不限制修改文件内容。如果用户能写文件,他照样能覆盖内容。
排障实战:权限报错怎么查?
排查提权失败或权限拒绝
场景:普通用户执行一个 SUID 脚本,却报 Permission denied
第一步:检查脚本属主和 SUID 位
ls -l /opt/backup.sh
如果是 -rwxr-xr-x,说明 SUID 没设置,需要 chmod u+s
第二步:检查脚本解释器
head -1 /opt/backup.sh
如果脚本开头是 #!/bin/bash,解释器本身不能是 SUID,否则有安全风险
第三步:检查脚本依赖的命令是否可执行
如果脚本里调用了 /usr/bin/cp,而 cp 没有 SUID,脚本也无法提权
常见错误及解决
• **错误:`Operation not permitted`**
大概率是文件系统挂载时禁用了 SUID/SGID。检查 `/etc/fstab` 里对应分区的挂载选项,去掉 `nosuid`。
• **错误:`Permission denied` 但权限看起来正常**
可能是 SELinux 或 AppArmor 拦截了。用 `ausearch -m avc` 查 SELinux 日志,或者临时 `setenforce 0` 测试(生产环境别干)。
**老鸟叮嘱**:别在生产服务器上同时开 SUID 和 SBIT 来“加强安全”,那只会让排查问题的人想骂娘。每个权限都有明确用途,乱用等于埋雷。
FAQ
Linux 的 SUID 权限有什么用?
SUID 允许普通用户以文件属主(通常是 root)的身份执行程序,典型例子是 `passwd` 命令,让普通用户能修改密码。
SGID 粘滞位和 SUID 有什么区别?
SGID 作用于文件时让执行者继承属组身份,作用于目录时让新建文件自动继承属组;SUID 只针对文件,让执行者临时变成文件属主。
Linux 小白可以直接给脚本设置 SUID 吗?
不建议。SUID 脚本一旦有漏洞(如命令注入),攻击者能直接提权到 root。安全做法是用 sudo 替代 SUID。
VPS 上 /tmp 目录 SBIT 突然失效了怎么办?
检查挂载选项:`mount | grep /tmp`,如果显示 `nosuid` 或 `noexec`,SBIT 可能被覆盖。重新挂载:`mount -o remount,suid,exec /tmp`。
BBR 开启后为什么速度没有明显提升?
BBR 优化的是长肥网络下的拥塞控制,如果 VPS 的带宽本身就小(如 1Mbps)或网络延迟极低,BBR 效果不明显。先测速确认瓶颈在哪。
如何查看一个文件是否设置了 SUID?
用 `ls -l`,看属主权限位:如果 x 变成 s(小写),就是有 SUID;如果是 S(大写),说明 SUID 设了但没执行权限。
转载请注明出处:https://www.zhujixuan.com/jishujiaocheng/9394.html 商家投稿邮箱:zhujixuanblog@qq.com
