Linux上除了有普通的文件权限(r,w,x)以外,还包括的特殊权限: suid, sgid, sticky
安全上下文的规则
一个进程运行时它拥有的文件读写权限来自于启动它的用户的权限,因此进程也是有属主和属组的,和文件同理(linux上 一切皆是文件)。规则如下:
(1) 任何一个可执行程序文件能否被启动为进程, 取决于发起进程发起用户对程序文件是否拥有执行权限(只要ugo其中一个有即可)。
(2) 启动进程后,进程的属主为启动用户,进程的属组为进程发起用户的属组。
(3) 进程读写文件的权限取决于进程启动用户的权限:
[1] 进程的发起用户和文件的属主一致,那么适用文件属主权限;
[2] 进程的发起用户属于文件的属组,则适用文件的属组权限;
[3] 如果进程的发起用户既不是文件的属主也不属于文件的属组,那么适用文件的其他权限;
总结: 安全上下文规则定义进程启动用户、进程文件、其他文件之间的权限使用规则。
SUID
SUID的作用是打破安全上下文的权限规则,可以用来提权或是降权,他的应用规则如下:
(1) 任何一个可执行程序文件能否被启动为进程, 取决于发起进程发起用户对程序文件是否拥有执行权限(只要ugo其中一个有即可)。
(2) 启动进程后,进程的属主为进程文件的属主。
例如,使用 ll which passwd
, 可以看到passwd命令启动文件的执行位权限是s, 属主是root, 意思是当passwd启动时的进程属主是root,也就是说该命令运行时是以root的身份来运行的。
SUID 权限设置
chmod u+s file...
chmod u-s file...
SGID
SGID 的作用对象是一个目录。 功能和SUID的功能是不一样的。它的适用规则如下:
(1) 默认情况下,用户创建文件(目录)的属组为该用户的基本组,一旦目录被设置了SGID权限,那么对该目录由写权限的用户在此目录创建的文件(目录)所属组不再属于基本组,而是该目录的属组。
SGID 权限设置
chmod g+s dir...
dhmod g-s dir...
sticky
sticky 作用对象是一个目录。 是对于一个多人可写的目录, 如果设置了sticky权限, 每个用户只能删除自己(属主)的文件。 从而消除sgud带来的风险。linux上/tmp,/var/tmp 默认就有该权限。
sticky 权限设置
chmod o+t dir...
chmod o-t dir...
suid,sgid, sticky联合权限设置
suid,sgid, sticky 和普通权限一样,也是映射为一个八进制数字, 因此也可以使用八进制数字来设置
sticky 1
sgid 3
suid 4
示例: chmod 4777 /tmp/a.txt , 第一个是特殊权限位置
注意:
suid占据属主的执行权限位, sgid占据文件的group权限位,sticky占据o的权限位,
如果特殊权限显示S, 表示该文件没有执行权限,如果是s表示该文件是有执行权限的。