Linux SetGID(SGID)文件特殊权限用法详解

前面章节我们提到了 SetGID,那什么是 SetGID 呢?当 s 标志在属主的 x 位置时是 SetUID,那么 s 标志在属组的 x 位置时是 SetGID,简称为SGID。比如:
[root@localhost ~]# ll /usr/bin/locate
-rwx–s--x 1 root slocate 35612 8月24 2010 /usr/bin/locate

SetGID针对文件的作用
SetGID 既可以针对文件生效,也可以针对目录生效,这和 SetUID 明显不同。如果针对文件,那么 SetGID 的含义如下:
只有可执行的二进制程序才能设置 SetGID 权限。
命令执行者要对该程序拥有 x(执行)权限。
命令执行者在执行程序的时候,组身份升级为该程序文件的属组。
SetGID 权限同样只在该程序执行过程中有效,也就是说,组身份改变只在程序执行过程中有效。

和 passwd 命令类似,普通用户在执行 locate 命令的时候,会获取 locate 属组的组身份。locate 命令是在系统中按照文件名査找符合条件的文件的,不过它不是直接搜索系统的,而是搜索 /var/lib/mlocate/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

大家会发现,属主权限是 r、w,属组权限是 r,其他人的权限是 0。那是不是意味着普通用户不能使用 locate 命令呢?再看看 locate 命令的权限。
[root@localhost ~]# ll /usr/bin/locate
-rwx–s--x 1 root slocate 35612 8月24 2010/usr/bin/locate

当普通用户 lamp 执行 locate 命令时,会发生如下事情:
/usr/bin/locate 是可执行二进制程序,可以被赋予 SetGID 权限。
执行用户 lamp 对 locate 命令拥有执行权限。
执行 locate 命令时,组身份会升级为 slocate 组,而 slocate 组对 /var/lib/mlocate/mlocate.db 数据库拥有 r 权限,所以普通用户可以使用 locate 命令査询 mlocate.db 数据库。
命令结束,lamp 用户的组身份返回为 lamp 组。
SetGID针对目录的作用
如果 SetGID 针对目录设置,则其含义如下:
普通用户必须对此目录拥有 r 和 x 权限,才能进入此目录。
普通用户在此目录中的有效组会变成此目录的属组。
若普通用户对此目录拥有 w 权限,则新建文件的默认属组是这个目录的属组。

举个例子:
[root@localhost ~]# cd /tmp/
#进入临时目录做此实验。因为只有临时目录才允许普通用户修改
[root@localhost tmp]# mkdir dtest
#建立测试目录
[root@localhost tmp]# chmod g+s dtest
#给测试目录赋予SetGID权限
[root@localhost tmp]# ll -d dtest/
drwxr-sr-x 2 root root 4096 1月20 06:04 dtest/
#SetGID权限已经生效
[root@localhost tmp]# chmod 777 dtest/
#给测试目录赋予777权限,让普通用户可以写
[root@localhost tmp]# su - lamp
#切换成普通用户lamp
[lamp@localhost ~]$ cd /tmp/dtest/
#普通用户进入测试目录
[lamp@localhost dtest]$ touch abc
#普通用户建立abc文件
[lamp@localhost dtest]$ ll
总用量0
-rw-rw-r-- 1 lamp root 01月20 06:07 abc
#abc文件的默认属组不再是lamp用户组,而变成了dtest组的属组root

猜你喜欢

转载自blog.csdn.net/zyy1659949090/article/details/88176522