SUID
UID我们都知道是用户标识,可以使用命令查看当前用户id
id -u username //显示当前用户的id,其中0表示管理员(一般为root)
/etc/shadow文件。对任何人都不开放权限,除了root用户
[[email protected] ~]#ll /etc/shadow----------. 1 root root 1309 Jul 29 11:32 /etc/shadow //rwx权限全部为空
我们以普通用户身份修改密码时,会用到passwd命令,我们都知道shadow是专门存放用户密码的地方,普通用户根本没有权限进入。
那么问题来了,既然shadow文件无法对普通用户开放,那为什么我们还能够修改本用户密码呢?
这就要用到SUID的功能了,我们来看passwd这个程序文件
[[email protected] 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的身份。
[[email protected] ~]$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,表示此目录内新建文件默认的属组就是其一级目录的所属组
举例说明
[[email protected] app]#chmod g+s dir1/ //新建目录dir1,并将组权限加上s[[email protected] app]#chgrp wang dir1/ //将所属组改为wang[[email protected] app]#ll -d dir1/drwxr-sr-x. 2 root wang 6 Jul 29 16:34 dir1/[[email protected] app]#touch dir1/f1[[email protected] app]#ll dir1/f1-rw-r--r--. 1 root wang 0 Jul 29 16:35 dir1/f1 //dir1下新建的文件f1默认所属组就是wang[[email protected] app]#ll -d dir1/dir2/ //在dir1下新建子目录dir2,在dir2下新建文件f2,其所属组都跟一级目录一样 drwxr-sr-x. 2 root wang 16 Jul 29 16:39 dir1/dir2/[[email protected] app]#ll dir1/dir2/f2 -rw-r--r--. 1 root wang 0 Jul 29 16:39 dir1/dir2/f2
通过上述分析,我们知道,SGID会将一级目录所属组一直传递给其目录下的各级文件
SGID只能在文件所属组对应的权限范围进行修改
sticky粘滞位
用户创建的文件,有时候不想让其他人修改、删除
sticky可以帮助解决这个问题
[[email protected] tmp]$ll -d /tmpdrwxrwxrwt. 17 root root 4096 Jul 29 16:52 /tmp ///tmp目录具有sticky位,即other对应的权限是t[[email protected] tmp]$ll wang.txt -rw-rw-r--. 1 wang wang 15 Jul 29 16:48 wang.txt //wang用户创建了文件,并进行过编辑[[email protected] tmp]$id //切换成用户gao,然后执行删除和修改操作,系统提示拒绝uid=1000(gao) gid=1000(gao) groups=1000(gao) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023[[email protected] tmp]$rm -f wang.txt rm: cannot remove ‘wang.txt’: Operation not permitted[[email protected] 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
即f1具有的权限是rwsrw-r--