文章目录
- 前言
- SGID(Set GID)
- SGID的作用
- 实例讲解
- 默认情况(不使用SGID)
- 使用SGID权限
- SGID的用法
- 判断是否有SGID权限
- 加点小料:locate命令
- 使用SGID的注意事项
*** linux系统中的特殊权限之SUID(Set UID)***
*** linux系统中的特殊权限之SGID(Set GID)***
*** linux系统中的特殊权限之SBIT(Sticky BIT)***
前言
之前,简单的讲解了SUID,有需要的可以使用上面的链接跳转,查看关于SUID的相关知识。
下面,来为大家介绍SGID这一特殊权限。
SGID(Set GID)
SGID的作用
SGID最常见的作用对象是目录,即对目录添加SGID权限。
当一个目录的属组拥有w权限(写权限),并且拥有SGID权限时,所有属于此目录的属组的用户,在以属组的身份在这个目录中新建文件(包括目录)时,新文件的属组不是用户的基本组,而是和此目录的属组相同。
光看概念的话可能不好理解,下面还是以实例来讲解。
实例讲解
默认情况(不使用SGID)
假设tom和jerry属于同一工作组,他们使用的文件,都放在同一个目录下,可以这样设置;
- #创建一个新的组,并将tom和jerry添加到组中
[root@centos7u6 tmp]# groupadd workgroup
[root@centos7u6 tmp]# usermod -a -G workgroup tom
[root@centos7u6 tmp]# usermod -a -G workgroup jerry
[root@centos7u6 tmp]# id tom
uid=1004(tom) gid=1004(tom) groups=1004(tom),1006(workgroup)
[root@centos7u6 tmp]# id jerry
uid=1005(jerry) gid=1005(jerry) groups=1005(jerry),1006(workgroup)
- #创建一个共享目录,并将目录的属组改为workgroup
[root@centos7u6 tmp]# mkdir /tmp/test_SGID
[root@centos7u6 tmp]# ls -ld test_SGID/
drwxr-xr-x 2 root root 6 Mar 30 11:09 test_SGID/
[root@centos7u6 tmp]# chown :workgroup /tmp/test_SGID/
[root@centos7u6 tmp]# ls -ld test_SGID/
drwxr-xr-x 2 root workgroup 6 Mar 30 11:09 test_SGID/
- #需要给/tmp/test_SGID目录的属组赋予写权限,否则,tom和jerry无法在该目录中新建文件
[tom@centos7u6 test_SGID]$ touch /tmp/test_SGID/tom_test
touch: cannot touch ‘/tmp/test_SGID/tom_test’: Permission denied
- #分别使用tom和jerry用户在/tmp/test_SGID目录中创建文件
[tom@centos7u6 ~]$ echo "tom" > /tmp/test_SGID/tom.test
[tom@centos7u6 ~]$ cat /tmp/test_SGID/tom.test
tom
[jerry@centos7u6 test_SGID]$ echo "jerry" > /tmp/test_SGID/jerry.test
[jerry@centos7u6 test_SGID]$ cat /tmp/test_SGID/jerry.test
jerry
- #查看被创建的文件的属组,分别为tom和jerry的基本组
[root@centos7u6 test_SGID]# ls -l
total 8
-rw-rw-r-- 1 jerry jerry 6 Mar 30 13:16 jerry.test
-rw-rw-r-- 1 tom tom 4 Mar 30 13:14 tom.test
以上是默认不使用SGID的情况,但是这种情况下,用户tom只能查看jerry.test,但是无法修改jerry.test的内容。
[root@centos7u6 test_SGID]# su tom
[tom@centos7u6 test_SGID]$ cat jerry.test
jerry
[tom@centos7u6 test_SGID]$ echo "tom2" >> jerry.test
bash: jerry.test: Permission denied
现在,当tom和jerry需要可以互相修改对方的文件时,SGID便派上用场了。
使用SGID权限
- #现在赋予/tmp/test_SGID目录特殊权限SGID
注意,拥有SGID权限后,文件属组的x权限(执行权限)位,变成了小s
drwxrwxr-x 2 root workgroup 40 Mar 30 13:27 /tmp/test_SGID/
[root@centos7u6 test_SGID]# chmod g+s /tmp/test_SGID/
[root@centos7u6 test_SGID]# ls -ld /tmp/test_SGID/
drwxrwsr-x 2 root workgroup 40 Mar 30 13:27 /tmp/test_SGID/
- #现在我们再分别用tom和jerry创建文件,并查看文件的属性
可以看到新创建的文件的属主不变,但是属组不再是用户的基本组,而是变成了/tmp/tset_SGID目录的属组
[tom@centos7u6 test_SGID]$ echo "tom2" > /tmp/test_SGID/tom2.test
[jerry@centos7u6 test_SGID]$ echo "jerry2" > /tmp/test_SGID/jerry2.test
[root@centos7u6 test_SGID]# ls -l /tmp/test_SGID/
total 16
-rw-rw-r-- 1 jerry workgroup 5 Mar 30 13:40 jerry2.test
-rw-rw-r-- 1 jerry jerry 6 Mar 30 13:27 jerry.test
-rw-rw-r-- 1 tom workgroup 5 Mar 30 13:40 tom2.test
-rw-rw-r-- 1 tom tom 4 Mar 30 13:14 tom.test
- 现在,tom和jerry可以互相修改对方创建的文件的内容了
[tom@centos7u6 test_SGID]$ echo "tom is coming..." >> jerry2.test
[tom@centos7u6 test_SGID]$ cat jerry2.test
[tom@centos7u6 test_SGID]$ cat jerry2.test
jerry2
tom is coming...
chmod
[jerry@centos7u6 test_SGID]$ echo "jerry is coming" >> /tmp/test_SGID/tom2.test
[jerry@centos7u6 test_SGID]$ cat tom2.test
tom2
jerry is coming
通过对比,我们应该能更清晰的看到SGID的作用了。
SGID的用法
同之前的SUID类似:
- 第一种方法:
chmod g+|-s FILENAME- 设置权限:chmod g+s /tmp/test
- 取消:chmod g-s /tmp/test
- 第二种方法:
使用8进制赋权- 设置权限:chmod 2775 /tmp/test
- 取消:chmod 775 /tmp/test
SUID | SGID | SBIT | 八进制权限 |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 |
0 | 1 | 0 | 2 |
0 | 1 | 1 | 3 |
1 | 0 | 0 | 4 |
1 | 0 | 1 | 5 |
1 | 1 | 0 | 6 |
1 | 1 | 1 | 7 |
判断是否有SGID权限
SGID的权限展示位,在文件属组的x权限(执行权限)位上。
- 如果有SGID
- 属组原本有执行权限,则属组的执行权限位,显示为小s
- 属组原本没有执行权限,则属组的执行权限位,显示为大写S
- 如果没有SUID
- 属组的执行权限位,仍然按其基本权限,显示为x或者-
[root@centos7u6 test_SGID]# ls -ld /tmp/test_SGID/
drwxrwsr-x 2 root workgroup 40 Mar 30 13:27 /tmp/test_SGID/
加点小料:locate命令
在linux系统中,SGID多用于目录,但是也可以用于文件,locate命令就是其中一个。
- #locate命令文件的存放路径如下,文件的属主是root,属组为是locate。
[root@centos7u6 test_SGID]# ls /usr/bin/locate -l
-rwx--s--x 1 root slocate 40520 Apr 11 2018 /usr/bin/locate
locate命令查找是基于对数据库中索引的搜索完成的,数据库的路径和名称是/var/lib/mlocate/mlocate.db,可以看到mlocate.db文件的属主是root,属组为slocate。
[root@centos7u6 ~]# ls -l /var/lib/mlocate/mlocate.db
-rw-r----- 1 root slocate 597052 Mar 30 14:32 /var/lib/mlocate/mlocate.db
由于locate命令文件拥有SGID权限,所以在一般用户tom去使用locate命令查找,发起一个进程时,tom会临时被添加到slocate组中,而slocate组中的用户对mlocate.db文件有r权限(读权限),所以这个进程可以读取数据库文件中的内容,完成查找操作。
[tom@centos7u6 ~]$ locate fstab
/etc/fstab
/usr/lib/dracut/modules.d/95fstab-sys
/usr/lib/dracut/modules.d/95fstab-sys/module-setup.sh
/usr/lib/dracut/modules.d/95fstab-sys/mount-sys.sh
/usr/lib/systemd/system-generators/systemd-fstab-generator
/usr/share/man/man5/fstab.5.gz
/usr/share/man/man8/systemd-fstab-generator.8.gz
如果,我们将locate命令SGID权限取消,那么tom在去执行locate命令,则不会被临时添加至slocate组中,当这个进程以other用户的身份去访问数据库时,会因为没有read权限而被拒绝,最终导致查找操作失败。
[root@centos7u6 ~]# chmod g-s /usr/bin/locate
[root@centos7u6 ~]# ls -l /usr/bin/locate
-rwx--x--x 1 root slocate 40520 Apr 11 2018 /usr/bin/locate
[root@centos7u6 ~]# su tom
[tom@centos7u6 root]$ locate fstab
locate: can not stat () `/var/lib/mlocate/mlocate.db': Permission denied
[tom@centos7u6 root]$
注: 测试完后,记得将其修改回去。
使用SGID的注意事项
- 可以针对二进制文件使用
- 文件的属组需要有x权限
- SGID的生命周期:当这个程序运行为进程时SGID有效,进程结束后,SGID权限也随之消失
- 可以针对目录使用
- 目录的属组需要有r权限,这样才能进入到目录
- 目录的属组需要拥有w权限,这样用户才可以在目录中创建文件
- 目录的属组需要拥有x权限 ,这样SGID才能生效