• Linux权限管理— 文件特殊权限SetUID


    一、文件特殊权限

    文件特殊权限:SetUID,SetGID,Sticky BIT。
    这三个文件不是太安全,是Linux系统应对特殊情况所准备的权限,给Linux系统的一些特殊命令提供的。不推荐用户手动来设置,尤其是SetUID。这三个选项了解一下就好。
    我们之前说过umask值的时候,如下:

    1. [root@localhost ~ ] # umask
    2. 0022

    可以看到umask值是一个4位数,后三位是我们之间讲过的基本权限(读写执行),第一位我们之前空过去了。
    现在来说一下,第一位就是定义SetUID,SetGID,Sticky BIT,这三个特殊权限的。
    还有一点,我们之前说过,普通用户是可以修改自己的密码的,但是我们查看下面两个文件,/etc/passwd文件和/etc/shadow文件。

    我们知道/etc/passwd文件存放着用户的信息,/etc/shadow文件中存放着用户的密码。但是我们可以看到/etc/shadow文件的权限是000,也就是说普通用户对这个文件是没有任何操作权限的,不能看也不能打开,也不能写。
    但是我们知道密码的修改,最终是要写入/etc/shadow文件中的。那用户对/etc/shadow文件没有任何权限,那怎么是把密码最终写入到/etc/shadow文件中呢。
    这个奥秘就是passwd命令中,我们查看一下passwd命令。

    可以看到所有者权限中,有一个标识为小s的权限,我们之前说的基本权限,读写执行分别为rwx。这个小s权限标识,就是表示该文件有SetUID特殊权限。

    • 为什么要给passwd命令设置SetUID特殊权限?
      /usr/bin/passwd命令拥有特殊权限SetUID,也就是在属主的权限位的执行权限上是小s。可以这样来理解它:当一个具有执行权限的文件设置SetUID权限后,用户执行这个文件时将以文件所有者的身份执行
      /usr/bin/passwd命令具有SetUID权限,所有者为root(Linux中的命令默认所有者都是root)
      也就是说当普通用户使用passwd命令,更改自己密码的时候,实际是在用passwd命令所有者root的身份在执行passwd命令,root当然可以将密码写入/etc/shadow文件(不要忘记root这个用户什么事都可以干),所以普通用户也可以修改/etc/shadow文件,命令执行完成后该身份也随之消失。
      总结:passwd命令有SetUID权限,为的就是普通用户修改自己密码的时候,执行passwd命令能够修改/etc/shadow文件。

    如果取消SetUID权限,则普通用户就不能修改自己的密码了。

    小s权限标识在所有者位的时候,特殊权限位 SetUID
    小s权限标识在所属组位的时候,特殊权限位 SetGID
    小t权限标识在其他人位的时候,特殊权限位 Sticky BIT

    二 、SetUID

    1、SetUID是什么
    SetUID的功能可以这样理解(SetUID如果可以想正确执行)
    (1)只有可以执行的二进制程序(自己写的脚本也可以,只要是执行文件就行)才能设定SUID权限。
    如果给非执行文件赋值SetUID,如下

    1. #给abc文件赋值SetUID权限
    2. [root@localhost ~ ] # chmod u+s abc
    3. g+s是给组赋值SetGID权限,和基本权限赋值是一样的。

    查看abc文件信息

    可以看到abc文件的所有者权限上有一个大S权限。表示abc文件没有什么作用,因为该文件不是一个可执行文件。可以理解成小s = 大s + x(执行权限)
    (2)命令执行者要对该程序拥有x(执行)权限
    查看passwd命令,普通用户对于passwd命令是属于其他人权限组里。其他人的权限中是有执行权限的。

    SetUID权限是,必须是用户在执行的时候SetUID权限才生效。
    (3)命令执行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件的属主)
    看上边一中的《为什么要给passwd命令设置SetUID特殊权限?》问题,有解释。
    (4)SetUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效
    注意:Linux系统自带的命令赋予了特殊权限,一般没有什么问题,很安全。最危险的是自己写的脚本赋予了特殊权限,不建议手动赋予。

    三、有几点建议:

    • 1.关键目录应严格控制写权限。比如"/"、"/usr"等;
    • 2.用户的密码设置要严格遵守密码三原则;
    • 3.对系统中默认应该具有SetUID权限的文件作一列表,定时检查有没有这之外的文件被设置了SetUID权限。

    四、检测SetUID的脚本

    首先找一个全新的Linux系统,没有被人操作过。通过脚本在系统中查找含有SetUIDSetGID的文件。如果统一写入一个模板文件。
    然后在定期或者不定期的执行该脚本,存入一个临时文件,然后拿这个临时文件和上面的模版文件进行对比,如果临时文件和模板文件是一样的,证明系统中没有出现新的SetUIDSetGID权限。如果有不同,则把该内容记录下来。

    1. [root@localhost ~ ] # vi suidcheck.sh
    2. #!/bin/bash
    3. # Author:shenchao(E-mail:shenchao@atguigu.com)
    4. #搜索系统中所有拥有SUID和SGID的文件,并保存到临时目录中。
    5. find / -perm -4000 -o -perm -2000 > /tmp/setuid.check
    6. #做循环,每次循环取出临时文件中的文件名
    7. for i in $(cat /tmp/setuid.check(临时文件))
    8. do
    9. grep $i/root/suid.list(模板文件) >/dev/null
    10. #比对这个文件名是否在模板文件中
    11. if["$?"!="0"]
    12. #如果在,不报错
    13. then
    14. #如果文件名不再模板文件中,则报错。并把报错报错到日志中
    15. echo "$i isn't in listfile! " >> /root/suid_log_$(date +%F)
    16. fi
    17. done
    18. #删除临时文件
    19. rm -rf /tmp/setuid.check

    以后如果我新给一个文件赋予了特殊权限

    1. #手工给vi加入SUID权限
    2. [root@localhost ~ ] # chmod u + s /bin/vi
    3. #再此执行检测脚本,就会把新检测出来的特殊权限记录到一个文件中。
    4. [root@localhost ~]#./suidcheck.sh
    5. #报错了,vi不再模板文件中。代表vi被修改了SUID权限,查看文件。
    6. [root@localhost ~ ] # cat suid-1og-2013-01-20
    7. /bin/vi isn't in listfile!

    感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

    ① 2000多本Python电子书(主流和经典的书籍应该都有了)

    ② Python标准库资料(最全中文版)

    ③ 项目源码(四五十个有趣且经典的练手项目及源码)

    ④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)

    ⑤ Python学习路线图(告别不入流的学习)

    重点:配套学习资料和视频教学

    那么在这里我也精心准备了上述大纲的详细资料在下方链接如下

  • 相关阅读:
    眼见为实:关于微服务熔断这几个知识点,你可能理解错了
    Android-APP隐私合规检测Camille(安卓root模拟器)
    三次握手时,客户端发送的 SYN 报文为什么会被丢弃?
    HPC集群自动弹性扩缩的两种实现方式
    JavaScript异步编程——08-Promise的链式调用【万字长文,感谢支持】
    heap use after free
    Cilium系列-1-Cilium特色 功能及适用场景
    【大数据毕设】基于Hadoop的音乐管理系统论文(三)
    Debian 11.5.0 安装流程
    移动Web第五天 1 响应式
  • 原文地址:https://blog.csdn.net/m0_59868866/article/details/126432612