12.7.3 sgid权限知识
12.7.3 sgid权限知识
对于二进制命令或者程序来说,sgid的功能与suid基本相同,唯一的区别是,suid是获得命令所属用户的身份和权限,而sgid是获得命令所属用户组的身份和权限,因此,有关sgid对于二进制命令或者程序方面的知识就不详细叙述了。
1. sgid核心知识小结
1)与suid不同的是,sgid既可以针对文件,也可以针对目录进行设置!
2)sgid的权限是针对用户组权限位的。
对于文件来说,sgid的功能具体如下。
1)sgid仅对二进制命令及程序有效。
2)二进制命令或程序,也需要有可执行权限x的配合。
3)执行命令的任意用户可以获得该命令在程序执行期间所属组的身份和权限。
对于目录(继承目录所属的组)来说,sgid的功能具体如下。
1)Linux里默认情况下所有用户创建文件,默认用户和组都是自身。
2)sgid可以让用户在此目录下创建的文件和目录具有与此目录相同的用户组设置。
setgid位主要用于目录中,在为某个目录设置了setgid位以后,在该目录中新创建的文件具有该目录的所属组权限,而不是创建该文件的用户的默认所有者。这就使得在多个用户之间共享一个目录中的文件变得简单。
提示:用八进制数2000表示setgid权限位。
2. sgid位命令程序权限案例
大家还记得locate命令么?locate命令是一个从系统数据库中查找文件功能的命令,默认查找的数据库文件为/var/lib/mlocate/mlocate.db,通常是使用updatedb更新数据库。示例代码如下:
[root@oldboy ~]# which locate #<==查看路径,CentOS7下需要先安装,命令如下yum install mlocate -y。
/usr/bin/locate
[root@oldboy ~]# ls -l `which locate` #<==查看locate命令属性。
-rwx--s--x. 1 root slocate 38464 Mar 12 2015 /usr/bin/locate
#<==用户组位默认有s,即sgid位。
[root@oldboy ~]# updatedb #<==创建并更新locate命令对应的数据库列表。
[root@oldboy ~]# ls -l /var/lib/mlocate/mlocate.db #<==locate命令对应的数据库。
-rw-r-----. 1 root slocate 1342060 Apr 30 08:26 /var/lib/mlocate/mlocate.db
[root@oldboy ~]# echo "echo oldboyLinux" >/bin/oldboyedu #<==创建一个脚本文件并放到/bin下。
[root@oldboy ~]# chmod +x /bin/oldboyedu #<==加执行权限。
[root@oldboy ~]# locate oldboyedu #<==无法查找到。
[root@oldboy ~]# updatedb #<==该命令会根据PATH路径,将命令索引更新到mlocate.db数据库中。
[root@oldboy ~]# locate oldboyedu #<==重新查找,这次就有了。
/bin/oldboyedu
切换到oldboy用户下测试,查找oldboyedu,示例代码如下:
[oldboy@oldboy ~]$ locate oldboyedu
/bin/oldboyedu
根据基本权限知识,oldboy是普通用户,oldboy执行locate,要想查找到oldboyedu就必须要读取/var/lib/mlocate/mlocate.db数据库中的信息,但是,该文件的用户和用户组分别是root和slocate,oldboy用户对于mlocate.db的权限属于其他权限位,即最后三位(---),所以oldboy用户下是无法查找到oldboyedu这个命令的。
但是事实上,oldboy用户却是查找到了oldboyedu,真实原因就是locate命令本身的用户组位设置了sgid位,因此,oldboy用户在使用locate命令查找文件时,就拥有了与locate命令对应的与用户组相同的身份和权限,因此,在读取/var/lib/mlocate/mlocate.db时,是以slocate用户组身份读取的mlocate.db,而slocate用户组对mlocate.db文件的权限属于中间三位,即“r--”,说明它具有读的权限,因此,oldboy就查到了old-boyedu这个命令文件。
取消locate命令的sgid权限,示例代码如下:
[root@oldboy ~]# chmod g-s `which locate` #<==取消sgid位。
[root@oldboy ~]# ls -l `which locate`
-rwx--x--x. 1 root slocate 38464 Mar 12 2015 /usr/bin/locate
然后,在oldboy用户下进行测试,直接提示权限拒绝了。
locate: can not stat ()'/var/lib/mlocate/mlocate.db': Permission denied
这个sgid的实际应用很少,有能力的读者可以了解一下。
3. sgid基于目录的案例
下面就来看一道RHCE认证考试题(了解即可)。
创建共享目录/home/admins,要求属组为adminuser,adminuser组成员对admins目录有写入、读取和执行的权限,其他所有用户均没有任何权限(root除外),在/home/admins目录中创建的文件会自动继承adminuser组的权限。
参考解答代码如下:
[root@oldboy ~]# mkdir /home/admins #<==创建共享目录admins。
[root@oldboy ~]# groupadd adminuser #<==添加用户组adminuser。
[root@oldboy ~]# ls -ld /home/admins
drwxr-xr-x. 2 root root 4096 Apr 30 16:54 /home/admins
[root@oldboy ~]# chgrp adminuser /home/admins/ #<==为adminis目录授权adminuser用户组。
[root@oldboy ~]# ls -ld /home/admins
drwxr-xr-x. 2 root adminuser 4096 Apr 30 16:54 /home/admins #<==查看授权结果。
[root@oldboy ~]# touch /home/admins/oldboy.txt #<==创建测试文件。
[root@oldboy ~]# ls -l /home/admins/
total 0
-rw-r--r--. 1 root root 0 Apr 30 19:59 oldboy.txt #<==文件默认用户和组都是root。
[root@oldboy ~]# chmod 2770 /home/admins #<==授权sgid权限给admins目录。
[root@oldboy ~]# ls -ld /home/admins/
drwxrws---. 2 root adminuser 4096 Apr 30 20:10 /home/admins/ #<==查看授权结果。
[root@oldboy ~]# touch /home/admins/newfile.txt #<==再创建新文件。
[root@oldboy ~]# ls -l /home/admins/
total 0
-rw-r--r--. 1 root adminuser 0 Apr 30 20:04 newfile.txt
#<==新创建的文件用户组为adminuser了,而非默认的root了。
-rw-r--r--. 1 root root 0 Apr 30 19:59 oldboy.txt
整个配置过程,已满足题意需求。