我们从上图中可以发现除了rwx这三个权限以外,还有s跟t这两个权限,这两个权限的意义与系统的账号和系统的进程管理较为相关
Set UID
当s这个标志出现在文件拥有者的x权限上时,就被称为Set UID 简称SUID的特殊权限
基本上SUID有这样的限制与功能:
- SUID权限仅对二进制(binary program)有效
- 执行者对于该程序需要具有x的可执行权限
- 本权限仅在执行该程序时的过程中有效(run-time)
- 执行者将具有该程序拥有者(owner)的权限
举例说明理解:
Linux系统中,所有账号的密码都记录在/etc/shadow这个文件里面,这个文件的权限为【---------- 1 root root】,此权限的意思为这个文件仅有root可读且仅有root可以强制写入,但是这个文件仅有root用户可以修改,那为什么一般账号也能只用passwd命令来修改自身的密码呢?
这就是SUID的功能,通过上面的功能说明,我们可以理解成:
- 一般账号对于/usr/bin/passwd这个程序是具有x权限的,表示一般账号能执行passwd
- passwd的拥有者是root
- 一般账号执行passwd的过程中,会暂时获得root的权限
- /etc/shadow就可以被一般账号所执行的passwd所修改
如果我们使用一般账号利用cat去读取/etc/shadow时,它是不能读取的,因为cat不具备SUID的权限
SUID仅可用在二进制程序上,不能够用于shell脚本上面。这是因为shell脚本只是将很多的二进制文件调用执行而已。所以SUID的权限部分,还是要看shell脚本调用进来的程序的设置,而不是shell脚本本身。SUID对于目录也是无效的
Set GID
当s标志在用户组的x时,则称为Set GID(SGID)
与SUID不同的是,SGID可以针对文件或目录来设置
对于文件来说,SGID有如下功能:
- SGID对二进制程序有用
- 程序执行者对于该程序来说需要具备x权限
- 执行者在执行的过程中将会获得该程序用户组的支持
举例说明理解:
上图的/usr/bin/locate程序可以去查找/var/lib/mlocate/mlocate.db这个文件的内容与SUID类似,当我们使用一般账号去执行locate时,那一般账号就会取得slocate用户组的支持,因此就能去读取mlocate.db
除了二进制程序外,事实上SGID也能够用于目录中,这是非常常见的一种用途,当目录设置了SGID权限后,它会有如下功能:
- 用户若对于此目录具有r与x权限时,则该用户能够进入此目录
- 用户在此目录下的有效用户组(effective group)将会变成该目录的用户组
- 用途:若用户在此目录下具有w权限(可以新建文件),则用户所建立的新文件的用户组与此目录的用户组是相同的
Sticky Bit
Sticky Bit目前只针对目录有效,对于文件已经没有效果了,它对于目录的作用是:
- 当用户对于此目录具有w、x权限,即具有写入的权限
- 当用户在该目录下建立文件或目录时,仅有自己与root才有权力删除该文件
换句话说,当甲这个用户对于A目录具有用户组或其他人的身份,并且拥有该目录的w权限,这表示甲用户对该目录内任何人建立的目录或文件均可进行删除、改名、移动等操作。不过,如果将A目录加上了SBIT的权限选项时,则甲只能够针对自己建立的文件或目录进行删除、更名、移动等操作,而无法删除其他人的文件
举例说明理解:
我们可以查看一下我们的/tmp权限,它的权限是777
在这样的权限内容下,任何人都可以在此目录下新增、修改文件,但仅有该文件/目录的建立者与root能够删除自己的文件或目录
SUID/SGID/SBIT 权限设置
我们明白权限是可以使用数字形式来表示 即权限为三个数字的组合,当我们要配置SUID、SGID、SBIT权限时,可以在这三个数字前再添加一个数字,使之成为四个数字的组合
- SUID:4
- SGID:2
- SBIT:1
举例说明理解:
当我们想要添加一个SUID时,权限设置为【-rwsr-xr-x】时,需要在原先755的组合前中再加入一个4,权限变更为4755,也就是使用【chmod 4755 filename】来设置
设置SUID与SGID:
设置SBIT:
设置SUID、SGID、SBIT:
需要注意的是大写的S与大写的T,这代表的是空的SUID与SGID权限
设置7666权限时,我们可以发现所有人都没有x这个权限了,所以S与T都代表了空这个意思
除了数字形式,我们还可以使用符号法来处理:
- SUID为u+s
- SGID为g+s
- SBIT为0+t