[RHEL7基础篇-7] 特殊权限

139 阅读9分钟

简介

在前面的章节当中([RHEL7基础篇-4] 用户和权限)已经说明过用户的普通权限(r:读权限,w:写权限,x:执行权限,并分别对应了用户权限、组权限和其他用户权限),想要详细回顾普通权限的全部内容,请看前面的 [RHEL7基础篇-4] 。而相对应的特殊权限就是SUID(特殊用户权限)、SGID(特殊组权限)、SBIT(特殊粘滞位权限)

特殊权限

  1. 特殊权限的存在

下面用三个例子来演示特殊权限位的存在

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)

没有权限则表示为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

删除组执行权限后变为S

3)

> ls -ld /tmp/
    drwxrwxrwt. 15 root root 4096 Dec 27 13:34 /tmp/

粘滞位表示为t

在这里可以看到/tmp/的组位权限并不是常见的rwx,而是rwt,而rwt当中的t就是SBIT(特殊粘滞位权限);

与1)相同这里删除执行权限后t也变为了T

删除执行位权限后变为T

注:这里 u-x或g-x或o-x后并不代表SUID或SGID或SBIT不存在

  1. 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权限时候,就能正常执行了

/bin/ls 二进制文件添加特殊权限位

注:通过 chmod 4755 /bin/ls 也能设置为特殊和权限为,这里前面加了4代表SUID的特殊权限位,如果要在group加SUID则是7455,想要取消特殊权限,使用755或u-s即可

其他用户用特殊权限访问/root

当test用户执行ls命令的时候是执行了root用户对 /bin/ls 文件的权限

注:如果通过普通权限也能实现该功能(chmod o+rx /root),使用特殊权限时要谨慎,因为这样开放权限给普通用户是比普通权限来说是要开放得更大的

  1. SGID(Set GID)

1)对于文件,使用该命令的组群权限来运行;

2)对于目录,在设置了 SGID权限的目录中创建的文件会继承该目录的组群身份

实验演示:

在/tmp/test/下创建目录 a ,并查看对应的权限

查看新创建的a目录的权限

为 a 目录增加SGID权限

为a目录增加SGID权限

注:通过 chmod 2755 /tmp/test/a 也能设置为特殊和权限为,这里前面加了2代表SGID的特殊权限位,想要取消特殊权限,使用755或g-s即可

修改 a 目录当前的所属用户和组,并在 a 目录下创建一个文件

修改所属用户和组

可以看得出新创建的文件的所属组是跟随了 a 目录所属组的

当在 a 下创建目录时,不光会继承 a 目录的所属组,也会把SGID继承过来

新创建的目录2获得了上级目录a的所属组和SGID

  1. SBIT

粘滞位(Sticky Bit ):在带有粘滞位的目录中的文件只能被文件的所属用户和根用户删除,不管该目录的写入权限是如何设置的(“ t ” 代表粘滞位)

实验演示:

/tmp本身的权限为1777

在具有sbit的目录下,用户若在该目录下具有w和x权限,则当用户在该目录下建立文件或目录时,只有文件的拥有者和root才有权利删除

只有root才能删除

注:通过 chmod 1777 /tmp 也能设置为特殊和权限为,这里前面加了1代表SBIT的特殊权限位,想要取消特殊权限,使用777或o-s即可

  1. SUID/SGID/SBIT权限设置

和前面[RHEL7基础篇-4] 用户和权限说的rwx差不多,特殊权限的添加和删除也有两种方式,一种是字符方式,一种是数字方式

参数备注
4SUID = u+s
2SGID = g+s
1SBIT = 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

  1. 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权限

特殊权限练习

  1. 练习

公司有一台文件共享服务器,有个公共目录/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都可以进行类似的测试

隐藏属性

  1. 隐藏属性的设置

修改隐藏属性的命令格式:chattr [+=-] [Asacdistu] 文件或目录名

参数备注
i不能增删改
a只能累加

i ![a](8cc9f3ce10024522a28dfdee83d79899.png

注: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. 隐藏属性的性质

1)隐藏属性 a 的性质

在这里插入图片描述 无法用vim修改file2的内容 当加了隐藏属性 a 后,连root也无法删除和无法用vim进行修改,

可以通过echo数据流将数据累加写入(累加例:echo "456" >> file2),但是如果不是通过累加的方式(>>)而是通过覆盖(>)的方式写入的话是不允许的操作(覆盖例:echo "456" > file2)

后面讲述标准数据流会介绍 >> 和 > 相关的内容

无法通过echo覆盖带有隐藏属性a的file2

2)隐藏属性 i 的性质

在这里插入图片描述 :wq!时

当加了隐藏属性 i 后root也不能再进行增加、修改、删除,比 a 属性更加严格,文件变为了只读文件

在这里插入图片描述

甚至连改名都是不行的,基本上对该文件无法做任何操作,如果想要删除只能乖乖的去掉隐藏属性 i 后再删除

后话:在实际的应用环境当中有时候黑客入侵后对二进制命令(二进制文件)的隐藏属性的修改后会造成连root都无法删除文件的现象,甚至有的情况更加会结合剥夺chattr使用内核的能力导致无法对隐藏属性删除,这时重启可以恢复chattr的内核使用能力。

当然,存在既有它的道理,隐藏属性可以防止root权限的泛滥,换句话说就算你是root你也不能无法无天,隐藏属性还可以和CAP概念的结合利用来提高系统的容错和安全系数。