centos 下档案的三种特殊权限的测试

1,008 阅读6分钟
最近刚好做了一个相关的linux课后作业,记录一下。希望能与大家一起学习与进步。

测试SGID

SGID可以作用于二进制程序(binary program) ,也可以作用于目录

对于二进制程序而言:
如果一个二进制程序设置了SGID权限,假设admin用户拥有这个程序的 x权限,那么admin用户在执行这个程序的时候
会暂时拥有这个二进制程序所属的群组对该程序的权限,和下面要测试的SUID非常类似。

对于目录而言:
当目录设置了SGID权限, 假设用户对于此目录有rwx权限,准确的说只需要wx权限,即该用户可以在该目录下创建
档案,那么该创建的档案归属的群组与该目录所归属的群组一致。这非常适合群组开发,因为群员之间创建的档案可以
互相编辑,而一般的,当该目录没有设置SGID特殊权限的时候,用户在该目录下创建的档案归属的群组为该用户的
有效群组。
以下测试SGID作用于目录

测试背景:
在群组开发时,有一个目录,设置了SGID特殊权限,且该目录归属于这个群组,则该群组的任何群员
在该目录下建立一个新的档案,这个新的档案所属的群组与该目录所属的群组相同,
这样的好处是群员之间建立的文档可以相互编辑,
另外的,如果没有设置SGID特殊权限,则群员在该目录下建立档案,该档案所属群组为该群员的有效群组。

测试环境:
目录/usr/local/temp/project权限为 2770 
用户pro1 ,pro2 分别支援 projecta (projecta可以不是他们的有效群组)

首先是环境的搭建,如下所示:
 #主要的命令:
 mkdir -m 2770 /usr/local/temp/project   #创建目录,权限为2770 ,2代表SGID
 #创建群组projecta 添加用户pro1并设置次要群组 projecta
 groupadd projecta && useradd -G projecta -c "order to test SGID" pro1 &&id pro1 
 echo "project" |passwd --stdin pro1     #为pro1用户设置密码为 project
[root@localhost temp]# 
[root@localhost temp]# mkdir -m 2770 /usr/local/temp/project && ls -ld /usr/local/temp/project
drwxrws---. 2 root root 6 Mar 29 15:47 /usr/local/temp/project #档案权限为 drwxrws---  
[root@localhost temp]# 
[root@localhost temp]# 
[root@localhost temp]# groupadd projecta && useradd -G projecta -c "order to test SGID" pro1 &&id pro1
uid=1002(pro1) gid=1003(pro1) groups=1003(pro1),1002(projecta)
[root@localhost temp]# 
[root@localhost temp]# 
[root@localhost temp]# 
[root@localhost temp]# useradd -G projecta -c "order to test SGID" pro2
[root@localhost temp]# 
[root@localhost temp]# id pro2
uid=1003(pro2) gid=1004(pro2) groups=1004(pro2),1002(projecta)
[root@localhost temp]# 
[root@localhost temp]# 
[root@localhost temp]# echo "project" |passwd --stdin pro1
Changing password for user pro1.
passwd: all authentication tokens updated successfully.
[root@localhost temp]# 
[root@localhost temp]# 
[root@localhost temp]# 
[root@localhost temp]# echo "project" |passwd --stdin pro2
Changing password for user pro2.
passwd: all authentication tokens updated successfully.
[root@localhost temp]# 
[root@localhost temp]# 
[root@localhost temp]# 
[root@localhost temp]# 
环境搭建好了之后,现在来测试一下,测试流程如下,切换到pro1 用户下,在/usr/local/temp/project 目录
创建档案 pro1.txt,观察档案pro1.txt 所归属的群组。
[root@localhost temp]# su - pro1  #切换至pro1
Last failed login: Wed Mar 18 11:33:10 CST 2020 on pts/0
There were 4 failed login attempts since the last successful login.
[pro1@localhost ~]$ 
[pro1@localhost ~]$ ls -ld /usr/local/temp/project
drwxrws---. 2 root root 6 Mar 29 15:47 /usr/local/temp/project
[pro1@localhost ~]$ 
[pro1@localhost ~]$ cd /usr/local/temp/project  #可以看到没有权限,忘记设置将project目录归属于projecta 群组了
-bash: cd: /usr/local/temp/project: Permission denied
[pro1@localhost ~]$ 
[pro1@localhost ~]$ 
[pro1@localhost ~]$ exit
logout
[root@localhost temp]# 
[root@localhost temp]# chgrp projecta /usr/local/temp/project && ls -ld /usr/local/temp/project   #chgrp改变档案所属群组
drwxrws---. 2 root projecta 6 Mar 29 15:47 /usr/local/temp/project
[root@localhost temp]# 
[root@localhost temp]# su - pro1
Last login: Sun Mar 29 15:59:28 CST 2020 on pts/0
[pro1@localhost ~]$ 
[pro1@localhost ~]$ 
[pro1@localhost ~]$ 
[pro1@localhost ~]$ 
[pro1@localhost ~]$ cd /usr/local/temp/project
[pro1@localhost project]$ 
[pro1@localhost project]$ 
[pro1@localhost project]$ 
[pro1@localhost project]$ touch pro1.txt ;ls -ld pro1.txt  #可以看到设置了SGID的目录,用户在该目录下创建的档案所归属的群组与该目录归属的群组一致
-rw-rw-r--. 1 pro1 projecta 0 Mar 29 16:01 pro1.txt
[pro1@localhost project]$ 
[pro1@localhost project]$ 
[pro1@localhost project]$ su - pro2
Password: 
Last failed login: Fri Mar 27 15:01:52 CST 2020 on pts/0
There was 1 failed login attempt since the last successful login.
[pro2@localhost ~]$ 
[pro2@localhost ~]$ 
[pro2@localhost ~]$ cd /usr/local/temp/project
[pro2@localhost project]$ 
[pro2@localhost project]$ 
[pro2@localhost project]$ touch pro2.txt ;ls -ld pro2.txt  #可以看到设置了SGID的目录,用户在该目录下创建的档案所归属的群组与该目录归属的群组一致
-rw-rw-r--. 1 pro2 projecta 0 Mar 29 16:05 pro2.txt
[pro2@localhost project]$ 
[pro2@localhost project]$ 
一般的我们在没有设置SGID权限的目录下创建一个档案,这个档案默认归属于当前用户的有效群组,
(一个用户可能加入多个群组,利用groups命令可以查看当前用户支援(加入)的所有群组,
在bash界面输入groups,回显的第一个群组即为当前用户的有效群组)
为了与上面设置了SGID权限目录对比,这里我们取消project目录的SGID权限,
再来创建档案,观察档案所归属的群组
[root@localhost temp]# 
[root@localhost temp]# chmod g-s /usr/local/temp/project/ && ls -ld /usr/local/temp/project  #取消SGID权限
drwxrwx---. 2 root projecta 38 Mar 29 16:05 /usr/local/temp/project
[root@localhost temp]# 
[root@localhost temp]# 
[root@localhost temp]# 
[root@localhost temp]# 
[root@localhost temp]# su - pro1
Last login: Sun Mar 29 16:00:58 CST 2020 on pts/0
[pro1@localhost ~]$ 
[pro1@localhost ~]$ 
[pro1@localhost ~]$ cd /usr/local/temp/project/
[pro1@localhost project]$ 
[pro1@localhost project]$ 
[pro1@localhost project]$ ll
total 0
-rw-rw-r--. 1 pro1 projecta 0 Mar 29 16:01 pro1.txt
-rw-rw-r--. 1 pro2 projecta 0 Mar 29 16:05 pro2.txt
[pro1@localhost project]$ 
[pro1@localhost project]$ 
[pro1@localhost project]$ 
[pro1@localhost project]$ touch 123.txt;ls -ld 123.txt    #可以看到123.txt归属的群组是pro1 也就是pro1用户的有效群组
-rw-rw-r--. 1 pro1 pro1 0 Mar 29 16:29 123.txt
[pro1@localhost project]$ 
[pro1@localhost project]$ 
[pro1@localhost project]$ 
[pro1@localhost project]$ 
[pro1@localhost project]$ groups  #pro1 用户的有效群组为 pro1 支援的群组有pro1 ,projecta 
pro1 projecta
[pro1@localhost project]$ 
[pro1@localhost project]$ 

至此,SGID特殊权限算是测试完毕了,总结如下:当用户具有一个目录的rwx权限的时候,准确的说只需要wx权限,即用户可以在该目录下创建档案,如果该目录设置了SGID权限,那么用户在这个目录下创建的档案所归属的群组和这个目录所归属的群组是一致的 如果该目录没有设置SGID权限,那么用户在这个目录下创建的档案所归属的群组是用户的有效群组。

以上实验另外需要注意的一点就是,pro1,pro2都加入了projecta 群组,这只是为了让pro1,pro2有进入project目录并创建档案的权限。即模拟群组开发的环境。

例如,admin用户没有加入projecta 群组,先授予admin在project目录下创建档案的权限,再在project目录下创建新的档案,因为project目录设置了SGID特殊权限,所以这个新的档案所属的群组也为project目录所属的群组,如下所示

[root@localhost temp]# ls -ld /usr/local/temp/project/
drwxrwx---. 2 root projecta 53 Mar 29 16:29 /usr/local/temp/project/
[root@localhost temp]# 
[root@localhost temp]# 
[root@localhost temp]# 
[root@localhost temp]# setfacl -mu:admin:rwx /usr/local/temp/project/  #单独授予admin用户在project目录下的rwx权限
[root@localhost temp]# 
[root@localhost temp]# getfacl /usr/local/temp/project/
getfacl: Removing leading '/' from absolute path names
# file: usr/local/temp/project/
# owner: root
# group: projecta
user::rwx
user:admin:rwx
group::rwx
mask::rwx
other::---

[root@localhost temp]# 
[root@localhost temp]# 
[root@localhost temp]# chmod g+s /usr/local/temp/project/ && ls -ld /usr/local/temp/project #上面测试的时候取消了SGID权限,重新赋予/usr/local/temp/project目录SGID权限
drwxrws---+ 2 root projecta 70 Mar 29 16:51 /usr/local/temp/project
[root@localhost temp]# 
[root@localhost temp]# 
[root@localhost temp]# 
[root@localhost temp]# 
[root@localhost temp]# su - admin
Last login: Sun Mar 29 16:50:35 CST 2020 on pts/0
[admin@localhost ~]$ 
[admin@localhost ~]$ 
[admin@localhost ~]$ 
[admin@localhost ~]$ cd /usr/local/temp/project/
[admin@localhost project]$ 
[admin@localhost project]$ 
[admin@localhost project]$ touch admin.conf && ls -ld admin.conf    #可以看到admin.conf 档案归属的群组是projecta
-rw-rw-r--. 1 admin projecta 0 Mar 29 16:52 admin.conf
[admin@localhost project]$ 
[admin@localhost project]$ 

测试 SBIT

目前只针对目录有效,对于档案已经没有效果了。SBIT 对于目录的作用是:
1当使用者对于此目录具有w, x 权限,亦即具有写入的权限时;
2当使用者在该目录下建立档案或目录时,仅有自己与root 才有权力删除该档案
----摘自鸟哥

总结一下就是,该权限只对目录有效,用户在该目录下创建的档案只有自己和root用户可以删除,测试如下:

[root@localhost local]# mkdir -m 1777 test_sbit && ls -ld test_sbit   #创建目录并赋予SBIT权限
drwxrwxrwt. 2 root root 6 Mar 29 17:07 test_sbit
[root@localhost local]# 
[root@localhost local]# 
[root@localhost local]# su - pro1
Last login: Sun Mar 29 16:28:41 CST 2020 on pts/0
[pro1@localhost ~]$ 
[pro1@localhost ~]$ 
[pro1@localhost ~]$ cd /usr/local/test_sbit/
[pro1@localhost test_sbit]$ 
[pro1@localhost test_sbit]$ 
[pro1@localhost test_sbit]$ 
[pro1@localhost test_sbit]$ cat >pro1.txt <<"eof"
> created by pro1 2020/3/29
> eof
[pro1@localhost test_sbit]$ 
[pro1@localhost test_sbit]$ 
[pro1@localhost test_sbit]$ ls -ld pro1.txt 
-rw-rw-r--. 1 pro1 pro1 26 Mar 29 17:09 pro1.txt
[pro1@localhost test_sbit]$ 
[pro1@localhost test_sbit]$ 
[pro1@localhost test_sbit]$ exit
logout
[root@localhost local]# 
[root@localhost local]# 
[root@localhost local]# su - pro2
Last login: Sun Mar 29 16:04:40 CST 2020 on pts/0
[pro2@localhost ~]$ 
[pro2@localhost ~]$ 
[pro2@localhost ~]$ cd /usr/local/test_sbit/
[pro2@localhost test_sbit]$ 
[pro2@localhost test_sbit]$ 
[pro2@localhost test_sbit]$ 
[pro2@localhost test_sbit]$ ll
total 4
-rw-rw-r--. 1 pro1 pro1 26 Mar 29 17:09 pro1.txt
[pro2@localhost test_sbit]$ 
[pro2@localhost test_sbit]$ 
[pro2@localhost test_sbit]$ 
[pro2@localhost test_sbit]$ rm -rf pro1.txt #可以看到尽管pro2用户拥有该目录的完整权限rwx,仍然无法删除pro1创建的档案,且从回显的信息来看,是操作不被允许,而不是permission denied 
rm: cannot remove ‘pro1.txt’: Operation not permitted
[pro2@localhost test_sbit]$ 
[pro2@localhost test_sbit]$ 

测试 SUID

SUID权限只对二进制程序(binary program)有效,刚才我还傻傻的写了一个脚本(里面有些命令只有root有权限执行),
然后赋予脚本SUID权限,用一般用户再来执行脚本一直permission denied  。。。,终究还是吃了没仔细看文档的亏

这里就举一个鸟哥上面的例子,
我们知道用户在执行passwd命令的的时候,势必要修改/etc/shadow里面的密码栏位,
但/etc/shadow档案只有root用户才有权限查看并修改的,那普通用户怎么又可以修改自己的密码?
原来是拥有SUID权限的二进制程序档案有点儿特殊,
普通用户在执行这个二进制程序的时候,会暂时拥有该二进制程序拥有者的权限,这里也就是root,这样一来就可以修改
/etc/shadow档案的内容了,也就是我们看到的,普通用户可以修改自己的密码。

为了测试这个SUID,先把这个二进制程序(这里测试的是/usr/bin/passwd)的SUID权限拿掉,再用一般用户执行这个程序,即使用passwd命令更改自己的密码,看能否修改成功,按照上面的说法,应该无法修改才对,因为一般用户无法对/etc/shadow档案进行操作,如下所示:

[root@localhost local]# 
[root@localhost local]# which passwd
/usr/bin/passwd
[root@localhost local]# 
[root@localhost local]# 
[root@localhost local]# ls -ld /usr/bin/passwd   #可以看到该二进制程序是有SUID 权限的且归属于root用户
-rwsr-xr-x. 1 root root 27856 Aug  9  2019 /usr/bin/passwd
[root@localhost local]# 
[root@localhost local]# 
[root@localhost local]# su - admin
Last login: Sun Mar 29 17:32:36 CST 2020 on pts/0
[admin@localhost ~]$ 
[admin@localhost ~]$ passwd   #普通用户可以修改自己的密码
Changing password for user admin.
Changing password for admin.
(current) UNIX password: 
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.
[admin@localhost ~]$ 
[admin@localhost ~]$ 
[admin@localhost ~]$ exit
logout
[root@localhost local]# 
[root@localhost local]# chmod u-s /usr/bin/passwd && ls -ld /usr/bin/passwd   #拿掉SGID权限,再切换到admin用户再来更改自己的密码
-rwxr-xr-x. 1 root root 27856 Aug  9  2019 /usr/bin/passwd
[root@localhost local]# 
[root@localhost local]# 
[root@localhost local]# su - admin
Last login: Sun Mar 29 17:33:56 CST 2020 on pts/0
[admin@localhost ~]$ 
[admin@localhost ~]$ 
[admin@localhost ~]$ passwd   #完了,admin用户连自己的密码都不能修改了!印证了上面的说明,转念一想,这样可以让root用户限制普通用户更改自己的密码,岂不是有点意思?掌握一个使坏的小技巧哈哈哈
Changing password for user admin.
Changing password for admin.
(current) UNIX password: 
New password: 
Retype new password: 
passwd: Authentication token manipulation error   #提示认证令牌操作错误
[admin@localhost ~]$ 
[admin@localhost ~]$ 
[admin@localhost ~]$ 
[admin@localhost ~]$ exit
logout
[root@localhost local]# 
[root@localhost local]# 
[root@localhost local]# chmod u+s /usr/bin/passwd && ls -ld /usr/bin/passwd #赶紧改回来
-rwsr-xr-x. 1 root root 27856 Aug  9  2019 /usr/bin/passwd
[root@localhost local]# 
[root@localhost local]# 

至此三种特殊权限 SUID,SGID,SBIT都测试完毕。以上均是个人测试所得,如有错误,欢迎各位大神指正。