SUID-SGID-和-Sticky-Bit-到底是什么

6次阅读

共计 1227 个字符,预计需要花费 4 分钟才能阅读完成。

对于 Linux 系统而言,针对可执行文件与目录存在三个特殊权限设置。分别是:

  • SUID
  • SGID
  • Sticky bit

Set-user Identification (SUID)

你是否想过,一个非 root 用户是如何通过修改他的密码,并且新的密码写入到一个他没有写权限的文件 /etc/shadow 中的。要解答这个问题,我们首先检查以下 /usr/bin/passwd 命令的文件属性:

$: ls -lrt /usr/bin/passwd
-r-sr-sr-x   1 root     sys        31396 Jan 20  2014 /usr/bin/passwd

你会发现该文件在 ownergroup区域的执行权限字段不是 x 而是 s。其中owner 区的 s 代表 SUID, 而group 区的 s 则代表SGID

如果一个命令的 SUID 位被设置为 s,那么其在执行的过程中,命令的执行用户就会切换成命令的owner 进行执行。

注意,有时候在 owner 区的 s 可能设置的是 S。大写的意思是,owner 区执行位权限是空-

Set-group identification (SGID)

SGIDSUID 基本类似,只是在命令执行后切换的用户不是 owner 而是group

SUID 不同的是,如果 group 区的执行位权限设置是空 - 的话,同时 SGID 位设置了,那么在其执行位表示的不是S, 而是l

Sticky Bit

Sticky Bit主要用于目录的共享。目录 /var/tmp and /tmp就具备共享功能,所有用户都可以创建文件,还可以修改或执行其它用户的文件,但是删除文件只能是文件拥有者。一旦目录的 Sticky Bit 被设置了,就能保证目录中各自的文件只有文件的拥有者可以删除。

# ls -ld /var/tmp
drwxrwxrwt  2   sys   sys   512   Jan 26 11:02  /var/tmp

类似 S, 当Sticky Bit 设置的值是 T 时,表示 other 区的执行权限为空 -t 则代表 other 区的执行权限已设置。

如何设置以上特殊权限

设置可执行文件或目录的特殊权限,关键是要知道这些权限值具体在文件属性中是如何存储的。其实文件属性设置位,不是我们看到的 10 位,即 1 字节的类型位 + 9 字节的 3 组 rwx 位。

其实在系统的实现中,文件权限使用 12 个二进制位表示:

11 10 9 8 7 6 5 4 3 2 1 0
S  G  T r w x r w x r w x

第 11 位为 SUID 位,第 10 位为 SGID 位,第 9 位为 sticky 位,第 8 - 0 位对应于上面的三组 rwx 位。所以要设置相应的值和其它位类似:

# 设置 SUID
$: chmod 4555 [path_to_file]

# 设置 SGID
$: chmod 2555 [path_to_file]

# 设置 Sticky Bit
$: chmod 1777 [path_to_directory]
# 或者
$: chmod +t [path_to_directory]

本篇短文主要是对我的博客文章构建可靠、安全、最小化的 Docker 镜像: 原理与实践的补充。

参考:

  • What is SUID, SGID and Sticky bit.
正文完
 0