特殊权限
- 我们知道
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初始化成功" fi1
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