从零开始学习Linux(二十六):文件特殊权限之SetGID
上一节中介绍的SetUID只能是针对可执行二进制文件。本节的SetGID权限既可以针对可执行二进制文件,又可以针对目录。针对不同的目标,起到的作用也不相同。
1、SetGID针对文件
- 只有可执行的二进制文件才能设置SetGID权限;
- 命令执行者要对该程序拥有x(可执行)权限;
- 命令执行者在执行二进制文件的时候,组身份升级为该文件的所属组;
- SetGID权限同样只在该文件执行过程中有效,当程序执行结束后组身份恢复成原来的身份;
我们以搜索命令 locate命令 举例说明,在 从零开始学习Linux(八):其他文件搜索命令 中我们介绍过locate命令的使用方法。
locate是通过生成一个文件和文件夹的索引数据库 /var/lib/mlocate/mlocate.db ,当用户在执行loacte命令查找文件时,它会直接在索引数据库里查找数据。
注意:若该数据库太久没更新或不存在,则会提示以下错误。
解决此问题的办法,执行命令:
updatedb
分别查看locate、mlocate.db文件的权限信息,如下图所示:
locate和mlocate.db权限信息从图中可以看出:
(1)locate文件权限是 -rwx--s--x,其他人权限是x;
(2)locate所属组是slocate,所属组的权限是s,s是代表SetGID;
(3)mlocate.db文件权限是 -rw-r-----,其他人是没有任何权限的;
(4)mlocate.db文件所属组是slocate;
虽然其他人没有locate命令权限,但是真实情况是我们使用非root用户登录的时候,也可以使用locate命令。
执行过程说明:
(1)/usr/bin/locate是可执行二进制程序,且被赋予了s权限;
(2)用户对/usr/bin/locate拥有可执行权限;
(3)用户执行/usr/bin/locate命令时,组身份会变为slocate组,而slocate组对/var/lib/mlocate/mlocate.db文件拥有r权限,所以普通用户也可以使用locate命令查询mlocate.db数据库;
(4)命令结束后,用户组身份恢复之前身份;
整个执行过程如下图所示:
2、SetGID针对目录
- 普通用户必须对此目录拥有r和x权限,才能进入此目录;
- 普通用户在此目录中的有效组会变成此目录的所属组;
- 若普通用户对此目录拥有w权限,新建的文件默认所属组是这个目录的所属组;
举例说明SetGID对目录文件的作用:
(1)进入系统临时文件/tmp目录;
(2)在/tmp目录下面创建testdir目录;
(3)为testdir目录赋予SetGID权限;
(4)查看testdir权限信息;
(5)为testdir目录赋予777(rwxrwxrwx)权限;
(6)切换到zhoujielun用户;
(7)进入testdir目录;
(8)创建一个文件qinghuaci;
(9)查看文件qinghuaci的详细信息;
整个过程执行的命令:
[root@VM-0-8-centos /]# cd /tmp/
[root@VM-0-8-centos tmp]# mkdir testdir
[root@VM-0-8-centos tmp]# chmod -R g+s testdir/
[root@VM-0-8-centos tmp]# ll -d testdir/
[root@VM-0-8-centos tmp]# chmod -R 777 testdir/
[root@VM-0-8-centos tmp]# su - zhoujielun
[zhoujielun@VM-0-8-centos ~]$ cd /tmp/testdir/
[zhoujielun@VM-0-8-centos testdir]$ touch qinghuaci
[zhoujielun@VM-0-8-centos testdir]$ ll qinghuaci
执行结果如下图所示:
从图中可以看到,设置了SetGID权限的目录,虽然用户是普通用户,但是创建的文件所属组依然是root。
3、设定SetGID的方法
3.1、方法一
命令格式:chmod -R 2755 文件名(-R可忽略掉);
3.2、方法二
命令格式:chmod -R g+s 文件名(-R可忽略掉);
因为SetGID权限改变的是组身份,所以是g+s或g-s来设定或取消权限;
4、取消SetGID的方法
4.1、方法一
命令格式:chmod -R 755 文件名(-R可忽略掉);
4.2、方法二
命令格式:chmod -R g-s 文件名(-R可忽略掉);