一、SetGID
SGID即可以针对文件生效,也可以针对目录生效,这和SUID明显不同。
1、针对文件的作用
针对文件,SGID的含义如下:
(1)只有可执行的二进制程序才能设置SGID权限。
同SUID。
(2)命令执行者要对该程序拥有x(执行)权限。
同SUID。
(3)命令执行在执行程序的时候,组身份升级为该程序文件的属组。
#查看locate命令
[root@localhost ~ ] # ll /usr/bin/locate
-rwx-s--x 1 root slocate 35612 8月 24 2010 /usr/bin/locate
#查看mlocate.db文件
[root@localhost ~ ] # ll /var/lib/mlocate/mlocate.db
-rw-r---1 root slocate 1838850 1月 20 04:29 /var/lib/mlocate/mlocate.db
当普通用户user1执行locate
命令时,会发生如下事情:
-
/usr/bin/locate
是可执行二进制程序,可以赋予SGID, - 执行命令的用户user1,对
/usr/bin/locate
命令拥有执行权限。 - 执行
/usr/bin/locate
命令时,组身份会升级为slocate
组,而slocate
组对
/var/lib/mlocate/mlocate.db
数据库拥有r
权限,所以普通用户可以使用locate
命令查询mlocate.db数据库。 - 命令结束,user1用户的组身份返回为user1组。
(4)SetGID权限同样只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效。
2、针对目录的作用
SGID针对目录设置,含义如下:
- 普通用户必须对此目录拥有r和x权限,才能进入此目录。
- 普通用户在此目录中的有效组会变成此目录的属组。
- 若普通用户对此目录拥有w权限时(也就是其他人权限是7,普通用户才能进入目录),新建的文件的默认属组是,这个目录的属组。
不明白,看下面的例子。
#进入临时目录做此实验。因为临时目录才允许普通用户修改
[root@localhost ~ ] # cd /tmp/
#建立测试目录
[root@localhost tmp] # mkdir dtest
#给测试目录赋予SGID
[root@localhost tmp] # chmod g+s dtest
#查看dtest/目录,SGID已经生效
[root@localhost tmp] # ll -d dtest/
drwxr-sr-x 2 root `root` 4096 1月 20 06:04 dtest/
#给测试目录权限,让普通用户可以写,
#注意权限一定要是777,否则普通用户进入不了目录。
[root@localhost tmp]#chmod 777 dtest/
#切换成普通用户userl
[root@localhost tmp] # su - user1
#普通用户进入测试目录,
#如果上边权限不设置成777,测试普通用户进不来。
[user1@localhost ~ ]$ cd /tmp/dtest/
#普通用户建立abc文件
[user1@localhost dtest]$ touch abc
#abc文件的默认属组不再是user1用户组,而变成了dtest组的属组root
[user1@localhost dtest]$ ll
总用量0
-rw-rw-r-1 userl `root` 0 1月 20 06:07 abc
总结上边例子的意思:也就是说,root用户如果给目录赋予了
SGID
特殊权限。那么普通用户(user1)在该文件中所创建的文件的所有组不是user1,而是这个目录的所属组。
SGID针对目录的作用本身没有风险。就是赋予目录的权限是777有些风险,能不用就别用。
关于特殊权限SGID的针对目录的作用,了解一下即可。