|NO.Z.00038|——————————|^^ 操作 ^^|——|Linux&权限管理.V04|——|检测SetUID脚本|
一、文件特殊权限 SetUID、SetGID、Sticky BIT
### --- SetUID 是什么
### --- SetUID 的功能可以这样理解:
~~~ 只有可以执行的二进制程序才能设定 SUID 权限
~~~ 命令执行者要对该程序拥有 x(执行)权限
~~~ 命令执行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件的属主)
~~~ SetUID 权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效
### --- 举例
[root@localhost ~]# ll /etc/passwd
-rw-r--r-- 1 root root 1728 1 月 19 04:20 /etc/passwd
[root@localhost ~]# ll /etc/shadow
---------- 1 root root 1373 1 月 19 04:21 /etc/shadow
### --- 因为
~~~ /usr/bin/passwd 命令拥有特殊权限 SetUID ,也就是在属主的权限位的执行权限上是 s。可以这样来理解它:当一个具有执行权限的文件设置 SetUID 权限后,用户执行这个文件时将以文件所有者的
~~~ 身份执行。/usr/bin/passwd 命令具有 SetUID 权限,所有者为 root(Linux 中的命令默认所有者都是 root),
~~~ 也就是说当普通用户使用 passwd 更改自己密码的时候,那一瞬间突然灵魂附体了,实际是在用 passwd
~~~ 命令所有者 root 的身份在执行 passwd 命令,root 当然可以将密码写入/etc/shadow 文件(不要忘记 root
~~~ 这个家伙是 superman 什么事都可以干),所以普通用户也可以修改/etc/shadow 文件,命令执行完成后该身份也随之消失
[root@localhost ~]# ll /usr/bin/passwd
-rwsr-xr-x 1 root root 25980 2 月 22 2012 /usr/bin/passwd

### --- 如果取消 SetUID 权限,则普通用户就不能修改自己的密码了
### --- 危险的 SetUID
[root@localhost ~]# chmod u+s /usr/bin/vim
[root@localhost ~]# ll /usr/bin/vim
-rwsr-xr-x 1 root root 1847752 4 月
### --- 有几点建议:
### --- 5 2012 /usr/bin/vim
~~~ 关键目录应严格控制写权限。比如“/”、“/usr”等;
~~~ 用户的密码设置要严格遵守密码三原则;
~~~ 对系统中默认应该具有 SetUID 权限的文件作一列表,定时检查有没有这之外的文件被设置了 SetUID 权限。
### --- 检测 SetUID 的脚本
[root@localhost ~]# vi suidcheck.sh
#!/bin/bash
# Author: shenchao (E-mail: shenchao@atguigu.com)
find / -perm -4000 -o -perm -2000 > /tmp/setuid.check
#~~~ 搜索系统中所有拥有 SUID 和 SGID 的文件,并保存到临时目录中。
for i in $(cat /tmp/setuid.check)
#~~~ 做循环,每次循环取出临时文件中的文件名
do
grep $i /root/suid.list > /dev/null
#~~~ 比对这个文件名是否在模板文件中
if [ "$?" != "0" ]
#~~~ 如果在,不报错
then
echo "$i isn't in listfile! " >> /root/suid_log_$(date +%F)
#~~~ 如果文件名不再模板文件中,则报错。并把报错报错到日志中
fi
done
rm -rf /tmp/setuid.check
#~~~ 删除临时文件
~~~ 手工给 vi 加入 SUID 权限
[root@localhost ~]# chmod u+s /bin/vi
### --- 执行检测脚本
[root@localhost ~]# ./suidcheck.sh
~~~ 报错了,vi 不再模板文件中。代表 vi 被修改了 SUID 权限
[root@localhost ~]# cat suid_log_2013-01-20
/bin/vi isn't in listfile!
二、文件特殊权限 SetUID:实验专题
### --- 文件特殊权限 SetUID
[root@server11 ~]# ll -d /etc/shadow
---------- 1 root root 1888 Mar 11 22:15 /etc/shadow // 用户对于这个文件是没有任何权限的
### --- 没有任何权限,是通过/usr/bin/passwd文件中授予的
[root@server11 ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd // 红色字体显示,权限所有者多出一个s权限,也就是SUID权限,所以shadow文件没有任何权限,但是创建用户是可以读写shadow文件
### --- SetUID授权:给不是执行文件授予SUID权限,查看效果
[root@server11 ~]# chmod u+s yanqi
[root@server11 ~]# ll
-rwSr--r-- 1 root root 0 Mar 12 00:03 yanqi // 显示S为大写;其实是报错,说明该文件没有作用
### --- 若是想给文件授予SUID权限,必须是执行文件
### --- 若是小写s:说明该文件是执行文件+SUID权限
[root@server11 ~]# chmod 755 yanqi // 把之前的S权限覆盖掉,因为是没有效果的大S权限。
[root@server11 ~]# ll
-rwxr-xr-x 1 root root 0 Mar 12 00:03 yanqi
[root@server11 ~]# chmod 4755 yanqi // 4表示为SUID权限
[root@server11 ~]# ll
total 0
-rwsr-xr-x 1 root root 0 Mar 12 00:03 yanqi
### --- 命令执行者要对该程序拥有x(执行)权限
~~~ 所以普通用户只能修改自己密码,root密码是不可以修改的
[root@server11 ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd // 其他人也是有执行权限的
[root@server11 ~]# ll /etc/shadow
---------- 1 root root 1888 Mar 11 22:15 /etc/shadow
[yanqi@server11 ~]$ cat /etc/shadow // 普通该用户不可以执行
cat: /etc/shadow: Permission denied
### --- 危险的SetUID
[root@server11 ~]# chmod u+s /usr/bin/vim
[root@server11 ~]# ll /usr/bin/vim
-rwsr-xr-x. 1 root root 2337208 Dec 16 00:44 /usr/bin/vim
### --- 任何人在执行vim时,权限都变为root权限,所以不可以修改
[root@server11 ~]# chmod u-s /usr/bin/vim
[root@server11 ~]# ll /usr/bin/vim
-rwxr-xr-x. 1 root root 2337208 Dec 16 00:44 /usr/bin/vim
### --- 建议修改方案
~~~ 关键目录应严格控制写权限,比如“/”“/usr”等
~~~ 用户的密码设置要样遵守密码三原则
~~~ 对系统中默认应该具有SUID权限的文件做一列表,定时检查这之外的文件被设置了SetUID权限
### --- 检查系统默认SUID文件是否发生变化,若是有;则处理不可控因素
[root@server11 ~]# vim suidcheck.sh
#!/bin/bash
# Author: shenchao (E-mail: shenchao@atguigu.com)
find / -perm -4000 -o -perm -2000 > /tmp/setuid.check
### --- 搜索系统中所有拥有 SUID 和 SGID 的文件,并保存到临时目录中。
for i in $(cat /tmp/setuid.check)
### --- 做循环,每次循环取出临时文件中的文件名
do
grep $i /root/suid.list > /dev/null
### --- 比对这个文件名是否在模板文件中
if [ "$?" != "0" ]
### --- 如果在,不报错
then
echo "$i isn't in listfile! " >> /root/suid_log_$(date +%F)
### --- 如果文件名不再模板文件中,则报错。并把报错报错到日志中
fi
done
rm -rf /tmp/setuid.check
### --- 删除临时文件
### --- 手工给 vi 加入 SUID 权限
[root@server11 ~]# chmod u+x suidcheck.sh
[root@localhost ~]# chmod u+s /bin/vi
### --- 执行检测脚本
[root@localhost ~]# ./suidcheck.sh
### --- 报错了,vi 不再模板文件中。代表 vi 被修改了 SUID 权限
[root@localhost ~]# cat suid_log_2013-01-20
/bin/vi isn't in listfile!
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
分类:
cdv005-basic
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」