|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

 

 

posted on   yanqi_vip  阅读(38)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示