SUID SGID详细说明
Unix下关于文件权限的说明
9 8 7 6 5 4 3 2 1 0
- r w x r - x r - x
第9位表示文件类型,类型说明:
文件类型 | 说明 |
---|---|
p | 管道文件 |
d | 目录文件 |
l | 符号连接文件 |
- | 普通文件 |
s | socket文件 |
c | 字符设备文件 |
b | 块设备文件 |
第8-6位 文件所有者权限 第5-3位 同组用户权限 第2-0位 其他用户权限
r表示可读 w表示可写 x表示可执行
uid
真实用户ID
gid
真实组ID
euid
有效用户ID
egid
有效组ID
SUID和SGID详细说明
在unix中,内核是通过euid和egid来确定一个进程对于资源的访问权限。
如果一个进程没有SUID和SGID位,那么权限为euid=uid,egid=gid,权限的话就是运行这个程序的用户权限。
如果进程有SUID和SGID位,那么euid和egid为设置的用户权限,uid和gid为实际用户权限,程序运行的时候,内核根据euid和egid来判断进程的资源访问权限。
SUID
该权限仅对二进制程序有效,执行者对于该程序需要拥有可执行权限,权限是在程序执行的过程中有效。
目的:让本来没有相应权限的用户运行这个程序的时候,可以访问他本身没有权限访问的资源。
例子:passwd
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 54256 May 16 2017 /usr/bin/passwd*
$ ls -l /etc/shadow
-rw-r----- 1 root shadow 1042 Jun 1 06:00 /etc/shadow
我们知道用户密码保存在/etc/shadow
,这个文件的权限如上,可以看到只有root用户有读写权限,同组只有读权限,其他用户没有任何权限,但是我们在使用passwd这个命令的时候,哪怕普通用户也是可以修改密码,这个就是SUID的作用。
首先/usr/bin/passwd
是任何用户都有权限执行的,这个程序设置了SUID,因此所有用户执行这个程序的时候,就拥有了root用户的权限访问系统资源。
SUID的优先级比SGID高,当一个二进制程序设置了SUID,则SGID会变成相应的egid。
SGID
SGID主要用在目录上,其他的和SUID相似。
目的:让程序或者目录拥有所属用户组的权限。
SBIT(Sticky Bit)
针对others设置,和SUID和SGID相似。
目的:只针对目录有效,当用户在该目录下新建文件或目录时,仅有自己和root才有权限进行删除。
具有代表性的 /tmp
目录
$ ll / | grep tmp
drwxrwxrwt 10 root root 4096 Jun 5 15:17 tmp/
设置方法
chmod u+s <filename>
设置SUID位
chmod u-s <filename>
去掉SUID设置
chmod g+s <filename>
设置SGID位
chmod g-s <filename>
去掉SGID设置
chmod o+t <filename>
设置SBIT
- 对应数字设置
4 为 SUID = u+s 2 为 SGID = g+s 1 为 SBIT = o+t
大写S和T问题
大写S和T是因为标记位没有可执行权限了,这个时候这个设置就相当于一个空权限,没有意义。有这个问题的时候,需要排查修复下。