01 Linux特殊权限
文章目录
- 此前我们已经学习过
r、w、 x
这三种权限,但在査询系统文件时会发现有一些其他权限的字母;- 比如:
/usr/bin/passwd
文件,属主应该是x
的权限位出现了s
, - 比如:
/usr/bin/write
文件,属组应该是x
的权限位出现了s
; - 比如:
/tmp
目录,其他人应该是x
的权限位出现了t
;
- 比如:
- 我们把这种称为特殊权限,那么特殊权限有什么作用? 或者说能干啥?
1、特殊权限SUID
1.1 SUID产生背景
在 Linux
系统中,每个普通用户都可以更改自己的密码,这是合理的设置;但是用户的密码信息存储在 /etc/shadow
文件中,也就是说,普通用户在更改自己密码时会更新 /etc/shadow
文件的内容。
但 /etc/shadow
文件不允许任何人修改?那为什么普通用户可以修改自己的权限呢?
[root@web ~]# ll /etc/shadow
---------- 1 root root 11409 Apr 13 03:26 /etc/shadow
其实,普通用户可以修改自己的密码在于 passwd
命令本身,该命令拥有特殊权限 SetUID
也就是在属主的权限位的执行权限上是 s
那如何理解特殊权限 SetUID
:当一个执行文件设置 SetUID
后,用户在执行这个文件时将以文件所有者的身份来执行。
当我们使用普通用户 sun
执行 passwd
命令会发生什么变化?
- 1、由于
passwd
命令拥有suid
特殊权限;(在命令属主权限位有一个s) - 2、所以
passwd
命令在执行的过程中,会以命令的属主身份运行该命令;(也是root身份)
总结:sun
--> passwd
–> 转换为命令属主身份 root
执行 --> 操作 /etc/shadow
信息变更;
1.2 SUID配置语法
[root@web ~]# chmod u+s /usr/bin/cat
[root@web ~]# chmod 4755 /usr/bin/cat
1.3 SUID作用总结
- 1、让普通用户对可执行的二进制文件,临时拥有二进制文件的所属主权限;
- 2、如果设置的二进制文件没有执行权限,那么
suid
的权限显示就是大S
; - 3、特殊权限
suid
仅对二进制可执行程序有效,其他文件或目录则无效; - 注意:
suid
相对危险,不建议对vim
或rm
进行suid
设定操作;
2、特殊权限SGID
2.1 什么是SGID
SGID有两种工能:
SGID
设置二进制可执行文件,命令在执行的过程中,会以命令的属组身份运行该命令(效果不大)SGID
设置在目录上,那么在该目录下新建的文件/目录自动继承父目录的属组
2.2 SGID配置语法
[root@web ~]# chmod g+s /dir
[root@web ~]# chmod 2755 /dir
2.3 SGID场景说明
需求描述:系统有两个用户,分别为 ex1
与 ex2
,这两个用户都拥有 example
附加组;
- 1、这两个用户需要共同拥有
/data/code
目录的开发权(读写执行权限); - 2、互相之间能修改彼此的文件,但该目录不允许其他人进入查阅;
[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/
需要给创建的文件添加664权限:
或者
umask 0002
3、特殊权限SBIT
3.1 什么是SBIT
一旦目录被赋予了粘滞位 Sticky(SI TI KI)
除了 root
可以删除目录中的所有文件,普通用户对该目录就算拥有 w
权限,也只能删除自己建立的文件,而不能删除其他用户建立的文件。
3.2 SBIT配置示例
需求:默认情况下 /mnt
不是粘滞位,如何将此目录设置为粘滞位;
[root@web ~]# chmod 1755 /tmp
[root@web ~]# chmod o+t /tmp
3.3 SBIT使用场景
当我们初始化 MySQL
服务时,服务会创建一些临时文件存储至 /tmp
目录下,当初始化完毕后,自己会清理掉里面的数据,别人无法清理。(如果这个目录不是粘滞位,那么初始化MySQL
就会报错)
案例:通过Shell
脚本模拟对应的场景
- 1、模拟
MySQL
初始化创建文件至/tmp
目录; - 2、模拟普通用户登陆系统删除
MySQL
的初始化文件; - 3、如果普通用户删除成功,则初始化失败 (因为
MySQL
服务创建的文件,需要自行销毁) - 4、如果普通用户删除失败,则
MySQL
服务尝试删除,删除成功,则初始化成功;
Shell
脚本如下
# 脚本如下
[root@web ~]# cat myql_init.sh
#!/urs/bin/bash
mysql_tmp_file=/tmp/mysql.init
User=sun
# 1.初始化MySQL服务
touch ${mysql_tmp_file}
# 2.模拟用户删除文件
useradd sun
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
结果测试与验证
# 默认粘滞位测试
[root@web ~]# sh myql_init.sh
/tmp/mysql.init 文件被 sun 用户删除失败, 该目录是sbit,mysql初始化成功
# 修改为普通目录测试
[root@web ~]# chmod 777 /tmp/
[root@web ~]# sh myql_init.sh
/tmp/mysql.init 文件被 sun 用户删除成功, 该目录不是sbit,mysql初始化失败
3.4 SBIT作用总结
- 1、让所有普通用户对该目录具有写入权限,并且能实现每个用户只能删自己的文件;
- 2、粘滞位目录表现在
others
的x
位,用t
表示,如果没有执行权限则显示为T
; - 3、粘滞位目录的属主以及
root
用户有权限删除目录中的内容,其他用户无权限删除;
4、文件特殊属性
4.1 什么是特殊属性
这类文件属性凌驾于 rwx
基础权限之上,是一种高级属性。
4.2 特殊属性的作用
- 1、创建一个文件,不允许被修改、移动、删除,包括
root
也不行。适合/etc/passwd
; - 2、创建一个文件,仅允许往文件里面追加数据,不允许修改、移动、删除。适合
sudo
审计日志;
5.3 特殊属性如何配置
Linux
系统通过 chattr
来实现特殊属性的配置
命令格式:chattr [+-=] [选项] 文件或目录名
a
:可对文件进行追加内容;i
:锁定文件,不允许其他操作;
1、配置 /etc/passwd
文件,不能改,不能追加,不能删除。
#1.赋予i权限
[root@web ~]# chattr +i /etc/passwd
#2.验证权限
[root@web ~]# rm -f /etc/passwd
rm: cannot remove '/etc/passwd': Operation not permitted
2、配置 /var/log/secure
文件,只能追加写入日志,不允许手动修改,也不允许删除。
#1.赋予 a 权限
[root@web ~]# chattr +a /var/log/secure
[root@web ~]# lsattr /var/log/secure
-----a---------- /var/log/secure
#2.测试追加数据
[root@web ~]# echo "test" >> /var/log/secure
[root@web ~]# echo "test" >> /var/log/secure
#3.不能删除,不能修改
[root@oldboy tmp]# rm -f /var/log/secure
rm: cannot remove '/var/log/secure': Operation not permitted
3、取消特殊属性,需要使用 root
身份。
[root@web ~]# chattr -i /etc/passwd
[root@web ~]# chattr -a /var/log/secure
5.4 特殊属性场景示例
模拟病毒串改站点,然后使用 chattr
锁住文件,让病毒程序无法串改,然后追踪并杀死病毒程序;
- 1、安装并启动
http
服务; - 2、模拟病毒脚本篡改网页内容;
- 3、锁定篡改文件,然后找出病毒,将其杀死;
1、安装 http
服务,然后启动对外
[root@web ~]# setenforce 0
[root@web ~]# systemctl stop firewalld
[root@web ~]# systemctl disable firewalld
[root@web ~]# yum install httpd -y
[root@web ~]# systemctl start httpd
2、编写病毒脚本,尝试篡改网页内容
[root@web ~]# cat /usr/bin/virus
#!/usr/bin/bash
web_site=/var/www/html/index.html
while true
do
# 1.模拟入侵
echo "我是病毒的Code" > ${web_site}
sleep 10
# 2.将这个脚本放入定时任务中
echo "*/1 * * * * /bin/bash -x /usr/bin/virus &>/tmp/virus.log" > /var/spool/cron/root
# 3.将脚本锁住
chattr +i /usr/bin/virus
done
3、锁定篡改文件,然后杀死病毒
[root@web ~]# > /var/spool/cron/root
[root@web ~]# chatttr +i /var/spool/cron/root
[root@web ~]# echo "Hello Web Server" /var/www/html/index.html
[root@web ~]# chatttr +i /var/www/html/index.html
[root@web ~]# kill $(ps -ef | grep virus | grep -v grep | awk '{print $2}')
5、文件默认权限
5.1 什么是默认权限
默认权限:指用户在创建文件或目录时,默认分配给文件或目录的访问权限;
5.2 默认权限的由来
- 背景
- 1.用户创建一个文件的默认访问权限为:
rw-rw-rw-
(八进制值666) - 2.用户创建一个目录的默认访问权限为:
rwxrwxrwx
(八进制值777) - 3.但最终创建出来的文件权限是
644
目录是755
,为什么目录不是777
,文件不是666
?
- 1.用户创建一个文件的默认访问权限为:
- 分析:
- 1.因为系统创建文件或目录受
UMASK
控制,比如UMASK
设置为:022
- 2.那么创建出来的文件权限是
644
,目录是755
- 3.目录:
777 - 022 = 755
最终创建出来的目录权限; - 4.文件:
666 - 022 = 644
最终创建出来的文件权限;
- 1.因为系统创建文件或目录受
- 结论:
UMASK
表示要减掉的权限;
5.3 系统默认权限配置文件
为什么默认 root
用户的 UMASK
为 022
,在系统哪个配置文件有设定呢;
- 1、当用户登陆系统时,会加载
/etc/profile
环境变量文件; - 2、在该配置文件中有一条
UMASK
的判断语句; - 3、如果用户
UID
小于199
那么就将UMASK
初始化为022
- 4、如果用户
UID
大于199
并且组名称和用户名称一致,那么就将UMASK
初始化为002
CentOS7系统的UMASK判断语句如下:
[root@web ~]# vim /etc/profile
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
umask 002
else
umask 022
fi
Rocky Linux 9 中使用 useradd 命令创建一个用户时,这个用户的默认 umask 通常会被设置为 0022
[root@web ~]# cat /etc/login.defs
UMASK 022
5.4 默认权限的计算公式
#1.假设umask值为:022(所有位为偶数)
#文件的起始权限值
6 6 6 - 0 2 2 = 6 4 4
7 7 7 - 0 2 2 = 7 5 5
#2.假设umask值为:045(其他用户组位为奇数)
#计算出来的权限。由于umask的最后一位数字是5,所以,在其他用户组位再加1。
6 6 6 - 0 4 5 = 6 2 1 + 1 = 622
7 7 7 - 0 4 5 = 7 3 2
#umask所有位全为偶数时
# umask 044
# mkdir d044 目录权限为 777 - 044 = 733
# touch f044 文件权限为 666 - 044 = 622
#umask部分位为奇数时
# umask 023
# mkdir d023 目录权限为777 - 023 = 754
# touch f023 文件权限为666 - 023 = 643 + 001 = 644
#umask部分位为奇数时
# umask 032
# mkdir d032 目录权限为777 - 032 = 745
# touch f032 文件权限为666 - 032 = 634 + 010 = 644
#umask值的所有位为奇数时
# umask 035
# mkdir d035 目录权限为777 - 035 = 742
# touch f035 文件权限为666 - 035 = 631 + 011 = 642