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