且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

权限分析之SUID、SGID、sticky

更新时间:2022-09-21 22:55:48

SUID

UID我们都知道是用户标识,可以使用命令查看当前用户id

1
id -u username  //显示当前用户的id,其中0表示管理员(一般为root)



/etc/shadow文件。对任何人都不开放权限,除了root用户

1
2
[root@CentOS7 ~]#ll /etc/shadow
----------. 1 root root 1309 Jul 29 11:32 /etc/shadow  //rwx权限全部为空



我们以普通用户身份修改密码时,会用到passwd命令,我们都知道shadow是专门存放用户密码的地方,普通用户根本没有权限进入。

那么问题来了,既然shadow文件无法对普通用户开放,那为什么我们还能够修改本用户密码呢?

这就要用到SUID的功能了,我们来看passwd这个程序文件

1
2
[root@CentOS7 app]#ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd  //在属主对应权限中有个s权限



s权限,作用就是当某一用户执行调用passwd这个程序时,其身份会临时切换为本程序所属主,也就是root,然后再以root身份执行此程序

举例说明:

当用户wang想修改自己的密码,会执行passwd命令,这条命令对应的其实是一份文件/usr/bin/passwd,而此文件具有s权限,所以会将普通用户wang的身份临时切换成root,

然后再以root身份来对shadow文件进行修改,命令执行结束,root切换回普通用户wang的身份。

1
2
[wang@CentOS7 ~]$ls -l /etc/shadow
----------. 1 root root 1405 Jul 29 16:01 /etc/shadow  //密码修改完成之后,我们会看到shadow文件时间更新了,说明此文件已经被修改了



SUID的这个特性只是应用在二进制可执行程序上,我们平时接触的文件、目录不会出现所属主具有s权限的

SUID只能在文件所有者权限范围做修改,要想修改文件所属组对应权限,可以参考SGID


SGID

SGID跟SUID功能有些相似,在针对二进制文件时,都会临时切换进程所有者身份,只不过SGID是将所有者身份切换到对应的组里,然后执行组所对应的权限;

另外SGID还可以针对目录设置,指定目录所属组然后将组权限加上s,表示此目录内新建文件默认的属组就是其一级目录的所属组

举例说明

1
2
3
4
5
6
7
8
9
10
11
[root@CentOS7 app]#chmod g+s dir1/  //新建目录dir1,并将组权限加上s
[root@CentOS7 app]#chgrp wang dir1/   //将所属组改为wang
[root@CentOS7 app]#ll -d dir1/
drwxr-sr-x. 2 root wang 6 Jul 29 16:34 dir1/
[root@CentOS7 app]#touch dir1/f1
[root@CentOS7 app]#ll dir1/f1
-rw-r--r--. 1 root wang 0 Jul 29 16:35 dir1/f1  //dir1下新建的文件f1默认所属组就是wang
[root@CentOS7 app]#ll -d  dir1/dir2/    //在dir1下新建子目录dir2,在dir2下新建文件f2,其所属组都跟一级目录一样                              
drwxr-sr-x. 2 root wang 16 Jul 29 16:39 dir1/dir2/
[root@CentOS7 app]#ll  dir1/dir2/f2                                   
-rw-r--r--. 1 root wang 0 Jul 29 16:39 dir1/dir2/f2



通过上述分析,我们知道,SGID会将一级目录所属组一直传递给其目录下的各级文件

SGID只能在文件所属组对应的权限范围进行修改


sticky粘滞位

用户创建的文件,有时候不想让其他人修改、删除

sticky可以帮助解决这个问题

1
2
3
4
5
6
7
8
9
10
[gao@CentOS7 tmp]$ll -d /tmp
drwxrwxrwt. 17 root root 4096 Jul 29 16:52 /tmp   ///tmp目录具有sticky位,即other对应的权限是t
[gao@CentOS7 tmp]$ll wang.txt 
-rw-rw-r--. 1 wang wang 15 Jul 29 16:48 wang.txt   //wang用户创建了文件,并进行过编辑
[gao@CentOS7 tmp]$id   //切换成用户gao,然后执行删除和修改操作,系统提示拒绝
uid=1000(gao) gid=1000(gao) groups=1000(gao) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[gao@CentOS7 tmp]$rm -f wang.txt 
rm: cannot remove ‘wang.txt’: Operation not permitted
[gao@CentOS7 tmp]$echo "linux" >> wang.txt 
bash: wang.txt: Permission denied



设置了sticky位的文件,只有所有者自己和root可以编辑、删除,其他人是不能做任何修改的


我们知道文件的权限有两种表示方法:

模式法:rwx

数字法:666

同样SUID、SGID和sticky也有这两中表示方法

模式法:sst

数字法:421

其中

SUID对应数字4

SGID对应数字2

sticky对应数字1


加入要修改文件f1具有SUID权限,且传统权限位744,那么可以这样做

chmod 4764 f1


本文转自  a_pan  51CTO博客,原文链接:http://blog.51cto.com/panpangao/1951975