Administrator
Published on 2025-09-29 / 22 Visits
0
0

【Linux 权限进阶】setuid、setgid 与 sticky bit 的区别全解析


在 Linux/Unix 世界里,除了大家熟知的 rwx 权限之外,还有三种特殊权限位:
👉 setuid、setgid 和 sticky bit
它们往往在多用户服务器、共享目录和系统命令里扮演关键角色。理解这三者,是从“会用 Linux”到“玩转 Linux 安全”的必修课。


一、setuid(Set User ID)

1. 定义

  • 当一个可执行文件设置了 setuid 标志时,运行它的进程会临时获得该文件所有者的权限

  • 常用于 普通用户需要执行 root 操作,但不能直接给 root 权限 的场景。

2. 权限表现

ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 54256 Sep 29  /usr/bin/passwd
  • 普通执行权限 x 位置变成了 s,表示启用了 setuid。

3. 常见应用

  • /usr/bin/passwd:普通用户修改密码(实际上需要修改 /etc/shadow)。

  • ping:普通用户发送 ICMP 报文。

4. 风险

  • 如果带 setuid 的程序有漏洞,攻击者可能直接提权到 root。

  • 需严格控制、审计。


二、setgid(Set Group ID)

1. 定义

  • 对可执行文件:运行该程序的进程,会临时以文件所属组的身份运行。

  • 对目录:目录下新建的文件/子目录,自动继承父目录的组 ID,而不是当前用户的默认组。

2. 权限表现

ls -ld /project
drwxr-sr-x 2 root dev 4096 Sep 29  /project
  • 组执行位变成了 s,表示目录启用了 setgid。

3. 常见应用

  • 程序层面:某些共享工具需要继承组权限。

  • 目录层面:团队协作目录(如 /project),所有人新建文件都属于 dev 组,方便共享。

4. 风险

  • 对程序:与 setuid 类似,有提权风险。

  • 对目录:若组权限设置过宽,可能被越权访问。


三、sticky bit

1. 定义

  • 只对目录生效

  • 当一个目录设置了 sticky bit,目录下的文件即使所有人可写,也只有文件的所有者或 root 能删除/修改

2. 权限表现

ls -ld /tmp
drwxrwxrwt 10 root root 4096 Sep 29  /tmp
  • 其他用户的执行位显示为 t,就是 sticky bit。

3. 常见应用

  • /tmp 目录:全员可写,但必须防止用户互相删除文件。

  • 公共共享目录:比如 FTP 上传区。

4. 风险

  • 误以为 sticky bit 提权,其实只是“防护锁”。

  • 如果没开,用户可能删掉别人文件,引发事故。


四、三者对比总结

特殊权限

作用对象

效果

权限表现

常见应用

setuid

可执行文件

运行时以文件所有者身份执行

-rwsr-xr-x

passwd, ping

setgid

可执行文件/目录

程序:以文件组身份执行目录:新建文件继承组

drwxr-sr-x

团队目录共享

sticky bit

目录

只有文件所有者或 root 能删除

drwxrwxrwt

/tmp 公共目录


如何设置:

操作这些标志与操作文件权限的命令是一样的, 都是使用chmod

有两种方法对这些标志来操作

  1. chmod u+s temp – 为temp文件加上setuid标志. (setuid 只对文件有效,u=用户)
    chmod g+s tempdir – 为tempdir目录加上setgid标志 (setgid 只对目录有效,g=组名)
    chmod o+t temp – 为temp文件加上sticky标志 (sticky只对文件有效)

  2. 采用八进制方式. 这一组八进制数字三位的意义如下,
    abc
    a - setuid位, 如果该位为1, 则表示设置setuid
    b - setgid位, 如果该位为1, 则表示设置setgid
    c - sticky位, 如果该位为1, 则表示设置sticky

设置后, 可以用 ls -l 来查看. 如果本来在该位上有x, 则这些特殊标志显示为小写字母 (s, s, t). 否则, 显示为大写字母 (S, S, T)
如:

rwsrw-r-- 表示有setuid标志 (rwxrw-r--:rwsrw-r--)
rwxrwsrw- 表示有setgid标志 (rwxrwxrw-:rwxrwsrw-)
rwxrw-rwt 表示有sticky标志 (rwxrw-rwx:rwxrw-rwt)

五、总结

  • setuid:给用户临时“换个身份”,最常见是普通用户执行 root 程序。

  • setgid:给组临时“换个身份”,特别适合团队目录共享。

  • sticky bit:不是提权,而是“文件删除保险锁”。

👉 简单记忆法:

  • uid → 用户换身份

  • gid → 组换身份

  • sticky → 文件锁保险



Comment