权限管理二

一、文件特殊权限 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

相关文章

文章浏览阅读1.8k次,点赞63次,收藏54次。Linux下的目录权限...
文章浏览阅读1.6k次,点赞44次,收藏38次。关于Qt的安装、Wi...
本文介绍了使用shell脚本编写一个 Hello
文章浏览阅读1.5k次,点赞37次,收藏43次。【Linux】初识Lin...
文章浏览阅读3k次,点赞34次,收藏156次。Linux超详细笔记,...
文章浏览阅读6.8k次,点赞109次,收藏114次。【Linux】 Open...