特殊权限
- 我们知道
r、w、x
这三种权限,但在查询系统文件时会发现有一些其他权限的字母;- 比如:
/usr/bin/passwd
文件,属主应该是×
的权限位出现了s
; - 比如:
/usr/bin/locate
文件,属组应该是×
的权限位出现了s
; - 比如:
/tmp
目录,其他人应该是×
的权限位出现了t
;
- 比如:
- 我们把这种称为特殊权限,那么特殊权限有什么作用呢?或者说能干啥?
# 特殊权限SUID
# SUID产生背景
在Linux
系统中,每个普通用户都可以更改自己的密码,这是合理的设置;但是用户的密码信息存储在/etc/shadow
文件中,也就是说,普通用户在更改自己密码时会更新/etc/shadow
文件的内容。
但/etc/shadow
文件不允许任何人修改,那为什么普通用户可以修改自己的权限呢?
[root@web ~]# ll /etc/shadow
---------- 1 root root 11409 Apr 13 03:26 /etc/shadow
1
2
2
其实,普通用户可以修改自己的密码在于passwd
命令本身,该命令拥有特殊权限SetUID
也就是在属主的权限位的执行权限上是s
。那如何理解特殊权限SetUID
:当一个执行文件设置SetUID
后,用户在执行这个文件时将以文件所有者的身份来执行。
- 当我们使用普通用户
bi
执行passwd
命令会发生什么变化呢?- 由于
passwd
命令拥有suid
特殊权限;(在命令属主权限位有一个s
) - 所以
passwd
命令在执行的过程中,会以命令的属主身份运行该命令;(也是root身 份) - 总结:
bi
-->passwd
-->转换为命令属主身份root
执行-->操作/etc/shadow
信息变更;
- 由于
# SUID配置语法
[root@web ~]# chmod u+s /usr/bin/cat
[root@web ~]# chmod 4755 /usr/bin/cat
1
2
2
# SUID作用总结
- 让普通用户对可执行的二进制文件,临时拥有二进制文件的所属主权限;
- 如果设置的二进制文件没有执行权限,那么
suid
的权限显示就是大S
; - 特殊权限
suid
仅对二进制可执行程序有效,其他文件或目录则无效; - 注意:
suid
相对危险,不建议对vim
或rm
进行suid
设定操作;
# 特殊权限SGID
# 什么是SGID
SGID
:- 设置二进制可执行文件,命令在执行的过程中,会以命令的属组身份运行该命令
- 设置在目录上,这时候在该目录下新建的文件/目录自动继承父目录的属组
# SGID配置语法
[root@web ~]# chmod g+s /dir
[root@web ~]# chmod 2755 /dir
1
2
2
# SGID场景说明
需求描述
- 系统有两个用户,分别为
ex1
与ex2
,这两个用户都拥有example
附加组; - 这两个用户需要共同拥有
/data/code
目录的开发权; - 互相之间能修改彼此的文件,且该目录不允许其他人进入查阅;
[root@web ~]# groupadd example [root@web ~]# useradd ex1 -G example [root@web ~]# useradd ex2 -G example [root@web ~]# mkdir /data/code [root@web ~]# chgrp example /data/code/ [root@web ~]# chmod 770 /data/code/ [root@web ~]# chmod 2770 /data/code/
1
2
3
4
5
6
7- 系统有两个用户,分别为
# 特殊权限SBIT
# 什么是SBIT
一旦目录被赋予了粘滞位Sticky(SI TI KI)
除了root
可以删除目录中的所有文件,普通用户对该目录就算拥有w
权限,也只能删除自己建立的文件,而不能删除其他用户建立的文件。
# SBIT配置示例
需求︰默认情况下/mnt
不是粘滞位,如何将此目录设置为粘滞位;
[root@web ~]# chmod 1755/tmp
[root@web ~]# chmod o+t /tmp
1
2
2
# SBIT使用场景
后期当我们要初始化MySQL
服务时,服务会创建一些临时文件存储至/tmp
目录下,当初始化完毕后,自己会清理掉里面的数据,别人无法清理。(如果这个目录不是粘滞位,那么初始化MySQL就会报错)
编写Shell脚本模拟此场景
- 模拟
MySQL
初始化创建文件至/tmp
目录; - 然后登陆普通用户删除
MySQL
的初始化文件; - 如果普通用户删除成功,则初始化失败(因为
MySQL
服务创建的文件,需要自行销毁); - 如果普通用户删除失败,则
MySQL
服务尝试删除,删除成功,则初始化成功;
- 模拟
Shell
脚本如下#脚本如下 [root@web ~]# cat mysql_init.sh #! /urs/bin/bash mysql_tmp_file=/tmp/mysql.init User=bi #1.初始化MySQL服务 touch ${mysql_tmp_file} #2.模拟用户删除文件 useradd ${User} su - ${User} -c "rm -f ${mysql_tmp_file} &>/dev/null" #3.检查是否删除成功 if [ $? -eq 0 ];then echo "${mysql_tmp_file}文件被${User}用户删除成功,该目录不是sbit,mysql初始化失败" else echo "${mysql_tmp_file}文件被${User}用户删除失败,该目录是sbit,mysql初始化成功" fi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20结果测试与验证
#默认粘滞位测试 [root@web ~]# sh mysql_init.sh /tmp/mysql.init 文件被 bi 用户删除失败,该目录是sbit,mysql初始化成功 #修改为普通目录测试 [root@web ~]# chmod 777 /tmp/ [root@web ~]# sh mysql_init.sh /tmp/mysql.init 文件被bi 用户删除成功,该目录不是sbit,mysql初始化失败
1
2
3
4
5
6
7
8
# SBIT作用总结
- 让所有普通用户对该目录具有写入权限,并且能实现每个用户只能删自己的文件;
- 粘滞位目录表现在
others
的×
位,用t
表示; - 粘滞位目录的属主以及
root
用户有权限删除目录中的内容,其他用户无权限删除;
Last Updated: 2021/11/12, 16:51:33