
在 Linux/Unix 系统里,最常见的权限管理机制就是 rwx(三个权限位):读 (read)、写 (write)、执行 (execute)。
但是,光靠这三种权限,很多情况下无法满足安全和功能的平衡需求。
举个例子:
普通用户不能执行
passwd修改自己的密码,因为修改密码需要写系统文件/etc/shadow,而这个文件只有 root 能改。那么,Linux 是怎么允许普通用户安全修改自己密码的?
答案就是 setuid。
一、setuid 的定义
setuid(Set User ID) 是 Linux 文件权限的一种特殊标志。
它的作用是:
当一个可执行文件带有 setuid 标志时,执行它的进程会临时拥有该文件所有者的权限,而不是当前用户的权限。
换句话说:
普通用户执行带有 setuid 的程序时,会“借用”文件所有者的身份来运行。
这样,就能完成原本只有高级用户才能做的操作。
二、怎么看 setuid 权限
在 Linux 里,使用 ls -l 查看文件权限时,如果某个文件有 setuid 标志,会显示一个 s。

示例:
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 54256 Sep 29 /usr/bin/passwd
解读:
普通用户都能执行
/usr/bin/passwd,因为有x。额外的
s出现在 用户权限位 上,说明这是一个带 setuid 的程序。所以,即使普通用户执行,它也会以 root 身份修改
/etc/shadow,从而完成改密码操作。
三、如何给文件加 setuid
命令格式:
chmod u+s 文件名举例:
sudo chmod u+s /usr/local/bin/myscript查看效果:
ls -l /usr/local/bin/myscript
-rwsr-xr-x 1 root root 12345 Sep 29 /usr/local/bin/myscript四、setuid 的常见应用
passwd:允许普通用户安全修改密码。
ping:发送 ICMP 报文需要 root 权限,但普通用户也能 ping。
自定义脚本:如前文提到的“只有指定用户能 reboot 服务器”的安全脚本,可以借助 setuid 提权执行。
五、setuid 的风险
setuid 用好了是好帮手,用不好就是安全漏洞大坑!
❌ 被利用提权:如果 setuid 程序里存在 bug,攻击者就可能利用它获得 root 权限。
❌ 不当使用:给随便的脚本加 setuid,可能让普通用户干掉系统。
❌ root 绕过:一些安全检查写得不严谨时,攻击者可能直接变身 root。
因此,最佳实践:
只给必要的二进制文件添加 setuid。
自定义脚本必须写死逻辑(白名单用户、日志记录、防止命令注入)。
配合
auditd或堡垒机监控所有 setuid 程序调用。
六、总结
setuid 的本质:让程序临时以文件所有者权限运行。
典型用途:普通用户改密码、执行 ping、特殊的受控脚本。
风险与控制:必须谨慎使用,避免被小白和黑客利用。
记住一句话:
setuid 就像一把“权限钥匙”,用好了能解锁功能,用不好可能直接把服务器大门敞开!