简介
在前面的章节当中([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概念的结合利用来提高系统的容错和安全系数。