共计 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
你会发现该文件在 owner
与group
区域的执行权限字段不是 x
而是 s
。其中owner
区的 s
代表 SUID
, 而group
区的 s
则代表SGID
。
如果一个命令的 SUID
位被设置为 s
,那么其在执行的过程中,命令的执行用户就会切换成命令的owner
进行执行。
注意,有时候在 owner
区的 s
可能设置的是 S
。大写的意思是,owner
区执行位权限是空-
。
Set-group identification (SGID)
SGID
与 SUID
基本类似,只是在命令执行后切换的用户不是 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.