一、文件特殊权限 SetUID、SetGID、Sticky BIT
SetUID
1、SetUID 是什么
SetUID 的功能可以这样理解:
- 只有可以执行的二进制程序才能设定 SETUID 权限
- 命令执行者要对该程序拥有 x(执行)权限
- 命令执行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程短暂成为为文件的属主)
SetUID 权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效
2、setuid举例
passwd命令的执行位置权限是 s 代表passwd这个文件具有 setuid 权限。
[root@love2 ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
当一个具有执行权限的文件设置 SetUID 权限后,用户执行这个文件时将以文件所有者的身份执行。/usr/bin/passwd命令具有 SetUID 权限,所有者为 root (Linux 中的命令默认所有者都是 root) , 也就是说当普通用户使用 passwd 更改自己密码的时候,一瞬间灵魂附体,实际是在用 passwd 命令所有者 root 的身份在执行 passwd 命令,命令执行完成 后该身份也随之消失。如果取消 SetUID 权限,则普通用户就不能修改自己的密码了。
测试
删除s权限
[root@love2 ~]# chmod u-s /usr/bin/passwd
[root@love2 ~]# su - love2
passwd: Authentication token manipulation error
love2用户修改密码报错。
3、检测setuid
因为setuid权限比较危险,所以我们需要检查计算机内的可执行文件,看是否有一些可以文件被赋予setuid权限。
脚本参考于他人。可提前搜索系统中所有拥有 SUID 和 SGID 的文件作为模板文件。我的模板文件为/root/setuid.check
find / -perm -4000 -o -perm -2000 > /tmp/setuid.check
#搜索系统中所有拥有 SUID 和 SGID 的文件,并保存到临时目录中。
for i in $(cat /tmp/setuid.check)
#做循环,每次循环取出临时文件中的文件名
do
grep $i /root/setuid.check > /dev/null
#比对这个文件名是否在模板文件中
if [ "$?" != "0" ] # 如果不在,则将文件添加到日志文件中
then echo "$i isn't in listfile! " >> /root/suid_log_$(date +%F) # 如果不在,则将文件添加到日志文件中
fi
done
rm -rf /tmp/setuid.check # 删除临时文件
SetGID
1、针对文件的作用
SGID 即可以针对文件生效,也可以针对目录生效,这和 SUID 明显不同。如果针对文件,SGID 的 含义如下:
- 只有可执行的二进制程序才能设置 SGID 权限
- 命令执行者要对该程序拥有 x(执行)权限
- 命令执行在执行程序的时候,组身份升级为该程序文件的属组
- SetGID 权限同样只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效
[root@love2 ~]# ll /var/lib/mlocate/mlocate.db
-rw-r----- 1 root slocate 4252817 Dec 2 03:34 /var/lib/mlocate/mlocate.db
大家发现属主权限是 r、w,属组权限是 r,但是其他人权限是 0:
[root@love2 ~]# ll /usr/bin/locate
-rwx--s--x. 1 root slocate 40520 Apr 11 2018 /usr/bin/locate
当普通用户 love2 执行 locate 命令时,会发生如下事情:
/usr/bin/locate 是可执行二进制程序,可以赋予 SGID
用户 love2 执行/usr/bin/locate 命令时,组身份会升级为 slocate 组,而 slocate 组对 /var/lib/mlocate/mlocate.db 数据库拥有 r 权限,所以普通用户可以使用 locate 命令查询 mlocate.db 数据库
命令结束,love2 用户的组身份返回为 love2 组
2、针对目录的作用(作用不大)
如果 SGID 针对目录设置,含义如下:
- 普通用户必须对此目录拥有 r 和 x 权限,才能进入此目录
- 普通用户在此目录中的有效组会变成此目录的属组
- 若普通用户对此目录拥有 w 权限时,新建的文件的默认属组是这个目录的属组。
3、文件特殊权限之 Sticky BIT
Sticky BIT 粘着位,也简称为 SBIT。SBIT 目前仅针对目录有效,它的作用如下:
- 粘着位目前只对目录有效
- 普通用户对该目录拥有 w 和 x 权限,即普通用户可以在此目录拥有写入权限
- 如果没有粘着位,因为普通用户拥有 w 权限,所以可以删除此目录下所有文件,包括其他用户建立的文件。一但赋予了粘着位,除了 root 可以删除所有文件,普通用户就算拥有 w 权 限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件。
4、设定文件特殊权限
特殊权限这样来表示:
- 4 代表 SUID
- 2 代表 SGID
- 1 代表 SBIT
[root@love2 ~]# chmod 4755 ftest # 赋予 SUID 权限
[root@love2 ~]# chmod 2755 ftest # 赋予 SGID 权限
[root@love2 ~]# mkdir dtest
[root@love2 ~]# chmod 1755 dtest/ #SBIT 只对目录有效,所以建立测试目录,并赋予 SBIT
二、文件系统属性 chattr 权限
1、命令格式
[root@love2 ~]# chattr [+-=] [选项] 文件或目录名
选项:
+: 增加权限
-: 删除权限
=: 等于某权限
i: 如果对文件设置 i 属性,那么不允许对文件进行删除、改名,也不能添加和修改数据;如果对目录设置 i 属性,那么只能修改目录下文件的数据,但不允许建立和删 除文件。
a: 如果对文件设置 a 属性,那么只能在文件中增加数据,但是不能删除也不能修改数据;如果对目录设置 a 属性,那么只允许在目录中建立和修改文件,但是不允许删 除
e: Linux 中绝大多数的文件都默认拥有 e 属性。表示该文件是使用 ext 文件系统进行存储的,而且不能使用“chattr -e”命令取消 e 属性。
2、查看文件系统属性
lsattr
[root@love2 ~]# lsattr 选项 文件名
选项:
-a 显示所有文件和目录
-d 若目标是目录,仅列出目录本身的属性,而不是子文件的
一般都是显示 e 权限
[root@love2 ~]# lsattr .bashrc
-------------e-- .bashrc