Linux setuid 与 setgid 文件权限详解

5次阅读

setuid使普通用户执行文件时临时获得属主权限,setgid对文件令进程获属组权限、对目录则使新文件继承其属组;二者均通过chmod u+s/g+s或4/2前缀设置,ls -l中s/s标识生效与否,需谨慎使用以防提权风险。

Linux setuid 与 setgid 文件权限详解

linux 中的 setuid 和 setgid 是两个关键的特殊权限位,它们不改变文件的常规读写执行权限,而是影响程序运行时的**身份上下文**——即谁的权限被临时“借用”。理解它们,是掌握 Linux 权限模型和系统安全设计的基础。

setuid:让普通用户临时拥有文件所有者的权限

当一个可执行文件设置了 setuid(u+s),任何用户执行它时,进程的有效用户 ID(EUID)会临时变成该文件的属主 ID,而不是执行者自己的 UID。这使得普通用户能完成本需 root 权限的操作。

  • 典型例子:/usr/bin/passwd 属主是 root,权限为 -rwsr-xr-x。普通用户执行它时,就能以 root 身份修改 /etc/shadow(该文件仅 root 可写)
  • 只对二进制可执行文件有效;对脚本(如 bash、python 文件)无效(内核会忽略,出于安全考虑)
  • 若文件原本没有执行权限(x),设置 setuid 后,权限位显示为大写 S(如 -rwSr--r--),表示该位已设但不生效
  • 设置方式:chmod u+s /path/to/executablechmod 4755 /path/to/executable(4 代表 setuid)

setgid:分两种场景,作用不同

setgid(g+s)的行为取决于目标对象是**可执行文件**还是**目录**,这是它与 setuid 的重要区别。

  • 对可执行文件:类似 setuid,执行时进程的有效组 ID(EGID)变为文件属组 ID。较少见,多用于需要特定组权限的工具
  • 对目录:这才是更常用的功能——该目录下新创建的文件或子目录,其属组自动继承该目录的属组,而非创建者默认的主组。这对协作共享目录非常关键
  • 例如:目录 /shared 属组为 devteam,设置了 drwxrwsr-x(s 在组执行位)。无论谁在其中新建文件,该文件属组都是 devteam,方便组内成员统一读写
  • 设置方式:chmod g+s /path/to/dirchmod 2775 /path/to/dir(2 代表 setgid)

如何识别和验证这两个权限

使用 ls -l 查看时,关注权限字符串第 4 位(setuid)和第 7 位(setgid):

  • 小写 s 表示权限位已设且对应位置有执行权(x),功能生效
  • 大写 S 表示权限位已设,但对应位置无执行权(x),功能不生效
  • 常见组合示例:-rwsr-xr-x(setuid 生效)、-rwxr-sr-x(setgid 目录或文件生效)、drwxrwsr-x(带 setgid 的目录)

安全注意事项

这两个权限强大,也意味着风险。滥用可能成为提权入口:

  • 避免给不可信的程序设置 setuid/setgid,尤其来源不明的二进制文件
  • 定期检查系统中带 s 位的文件:find / -perm -4000 -type f 2>/dev/NULL(setuid)或 find / -perm -2000 -type f,d 2>/dev/null(setgid 文件和目录)
  • 注意:root 用户执行 setuid 程序时,EUID 不变(仍是 0),所以效果不明显;真正体现价值的是普通用户调用
text=ZqhQzanResources