简介
在前面的章节当中([RHEL7基础篇-4] 用户和权限)已经说明过用户的普通权限(r:读权限,w:写权限,x:执行权限,并分别对应了用户权限、组权限和其他用户权限),想要详细回顾普通权限的全部内容,请看前面的 [RHEL7基础篇-4] 。而相对应的特殊权限就是SUID(特殊用户权限)、SGID(特殊组权限)、SBIT(特殊粘滞位权限)
特殊权限
-
特殊权限的存在
下面用三个例子来演示特殊权限位的存在1)
> ls -l /usr/bin/passwd -rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
在这里可以看到/usr/bin/passwd的用户位权限并不是常见的rwx,而是rws,而rws当中的s就是SUID(特殊用户权限);
若这里把s当中的执行权限删掉,则会出现S(大写s)
2)
> ls -l /usr/bin/wall -r-xr-sr-x. 1 root tty 15344 Jun 10 2014 /usr/bin/wall
在这里可以看到/usr/bin/wall的组位权限并不是常见的r-x,而是r-s,而r-s当中的s就是SGID(特殊组权限);
与1)相同这里删除组的执行权限后s也变为了S
3)
> ls -ld /tmp/ drwxrwxrwt. 15 root root 4096 Dec 27 13:34 /tmp/
在这里可以看到/tmp/的组位权限并不是常见的rwx,而是rwt,而rwt当中的t就是SBIT(特殊粘滞位权限);
与1)相同这里删除执行权限后t也变为了T
注:这里 u-x或g-x或o-x后并不代表SUID或SGID或SBIT不存在
-
SUID
1)SUID是用于二进制的文件当中,但是对目录是无效的!
2)让一般用户在执行某些二进制的文件的时候,能够暂时拥有该程序(二进制文件)所有者的权限;
3)使用该命令的所属用户的权限来运行,而不是命令执行者的权限。SUID作用:
a:SUID权限仅对二进制程序(binary program)有效;
b:执行者对于该程序需要具有x的可执行权限;
c:本权限仅在执行该程序的过程中有效(run-time);
d:执行者将具有该程序拥有者(owner)的权限。实验演示:
在root用户的家目录下(在某一目录下执行ls命令时候,要看其目录对应的权限)> ls -ld /root ---------普通用户是在/root是没有权限的--------- dr-xr-x---. 19 root root 4096 Jan 4 09:36 /root > ls -l /root/ -----------能看到/root内的一系列文件----------- total 14312 -rw-------. 1 root root 1832 Jul 5 2019 anaconda-ks.cfg drwxrwxr-x 31 clamav 1005 4096 Dec 16 2020 clamav-0.103.0 ... drwxr-xr-x. 2 root root 6 Jul 5 2019 Templates drwxr-xr-x. 2 root root 6 Jul 5 2019 Videos
普通用户test 使用ls命令查看/root 文件夹下的文件时,提示权限不够
当在root用户中给ls命令加个SUID权限时候,就能正常执行了
注:通过 chmod 4755 /bin/ls 也能设置为特殊和权限为,这里前面加了4代表SUID的特殊权限位,如果要在group加SUID则是7455,想要取消特殊权限,使用755或u-s即可
当test用户执行ls命令的时候是执行了root用户对 /bin/ls 文件的权限注:如果通过普通权限也能实现该功能(chmod o+rx /root),使用特殊权限时要谨慎,因为这样开放权限给普通用户是比普通权限来说是要开放得更大的
-
SGID(Set GID)
1)对于文件,使用该命令的组群权限来运行;
2)对于目录,在设置了 SGID权限的目录中创建的文件会继承该目录的组群身份实验演示:
在/tmp/test/下创建目录 a ,并查看对应的权限
为 a 目录增加SGID权限
注:通过 chmod 2755 /tmp/test/a 也能设置为特殊和权限为,这里前面加了2代表SGID的特殊权限位,想要取消特殊权限,使用755或g-s即可
修改 a 目录当前的所属用户和组,并在 a 目录下创建一个文件
可以看得出新创建的文件的所属组是跟随了 a 目录所属组的
当在 a 下创建目录时,不光会继承 a 目录的所属组,也会把SGID继承过来
-
SBIT
粘滞位(Sticky Bit ):在带有粘滞位的目录中的文件只能被文件的所属用户和根用户删除,不管该目录的写入权限是如何设置的(“ t ” 代表粘滞位)实验演示:
/tmp本身的权限为1777
在具有sbit的目录下,用户若在该目录下具有w和x权限,则当用户在该目录下建立文件或目录时,只有文件的拥有者和root才有权利删除
注:通过 chmod 1777 /tmp 也能设置为特殊和权限为,这里前面加了1代表SBIT的特殊权限位,想要取消特殊权限,使用777或o-s即可 -
SUID/SGID/SBIT权限设置
和前面[RHEL7基础篇-4] 用户和权限说的rwx差不多,特殊权限的添加和删除也有两种方式,一种是字符方式,一种是数字方式参数 备注 4 SUID = u+s 2 SGID = g+s 1 SBIT = o+t 在权限设置使用数字设置示例:
# SUID chmod 4755 /tmp/test # SGID chmod 2755 /tmp/test # SBIT chmod 1755 /tmp/test
小s和大S的区别:
小s和大S只出现在user位和group位上,小s代表既有特殊权限位SUID/SGID,又有执行位x,而大S则是仅有特殊权限位SUID/SGID,没有执行位x
小t和大T的区别:
小t和大T只出现在other位上,小t代表既有特殊权限位SBIT,又有执行位x,而大T则是仅有特殊权限位SBIT,没有执行位x -
SUID/SGID/SBIT权限删除
命令 | 功能 |
---|---|
chmod u-s /tmp/test | 删除/tmp/test的SUID权限 |
chmod g-s /tmp/test | 删除/tmp/test的SGID权限 |
chmod o-t /tmp/test | 删除/tmp/test的SBIT权限 |
特殊权限练习
- 练习
公司有一台文件共享服务器,有个公共目录/common,属于pub组;公司有3个部门sales、markets和techs;user1属于sales部门,user2属于markets部门,user3属于techs部门;要求:user1、user2、user3有访问/common目录的权限,并且在/common目录中创建的文件及目录的属组为pub组,而且不能删除其他用户创建的文件及目录,只有自己有权限删除新建目录/common,并将他加入pub组,同时保证pub组的人都能在该目录下进行读和写 > mkdir /common > groupadd pub > chgrp pub /common > chmod g=rwx /common 新建三个用户并加入对应组,同时都加入pub这个附加组中 > groupadd sales > groupadd markets > groupadd techs > useradd user1 -g sales > echo 123456 |passwd --stdin user1 > useradd user2 -g markets > echo 123456 |passwd --stdin user2 > useradd user3 -g techs > echo 123456|passwd --stdin user3 > usermod -G pub user1 > usermod -G pub user2 > usermod -G pub user3 > chmod g+s /common > chmod o+t /common 验证测试新建对象是否属于pub组 > su - user1 > cd /common > touch user1_file > mkdir user1_d > ls -l * 确认user1_file和user1_d是否都属于pub组 验证测试普通用户能否删除其他用户建立的对象 > exit > su - user2 > cd /common > rm -rvf user1_file 确认user2能否删除之前user1创建的两个对象 备注:user1\user2\user3都可以进行类似的测试
隐藏属性
-
隐藏属性的设置
修改隐藏属性的命令格式:chattr [+=-] [Asacdistu] 文件或目录名参数 备注 i 不能增删改 a 只能累加
注:lsattr为查看隐藏属性的命令设置隐藏属性 a:
增加隐藏属性 a > chattr +a file2 覆盖隐藏属性为 a > chattr =a file2 删除隐藏属性 a > chattr -a file2
设置隐藏属性 i
增加隐藏属性 i > chattr +i file2 覆盖隐藏属性为 i > chattr =i file2 删除隐藏属性 i > chattr -i file2
查看隐藏属性:
查看文件的隐藏属性 > lsattr file2 查看目录的隐藏属性 > lsattr /tmp/test
-
隐藏属性的性质
1)隐藏属性 a 的性质
当加了隐藏属性 a 后,连root也无法删除和无法用vim进行修改,
可以通过echo数据流将数据累加写入(累加例:echo “456” >> file2),但是如果不是通过累加的方式(>>)而是通过覆盖(>)的方式写入的话是不允许的操作(覆盖例:echo “456” > file2)
后面讲述标准数据流会介绍 >> 和 > 相关的内容
2)隐藏属性 i 的性质
当加了隐藏属性 i 后root也不能再进行增加、修改、删除,比 a 属性更加严格,文件变为了只读文件
甚至连改名都是不行的,基本上对该文件无法做任何操作,如果想要删除只能乖乖的去掉隐藏属性 i 后再删除后话:在实际的应用环境当中有时候黑客入侵后对二进制命令(二进制文件)的隐藏属性的修改后会造成连root都无法删除文件的现象,甚至有的情况更加会结合剥夺chattr使用内核的能力导致无法对隐藏属性删除,这时重启可以恢复chattr的内核使用能力。
当然,存在既有它的道理,隐藏属性可以防止root权限的泛滥,换句话说就算你是root你也不能无法无天,隐藏属性还可以和CAP概念的结合利用来提高系统的容错和安全系数。