Linux特殊权限

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 相对危险,不建议对 vimrm 进行 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场景说明

需求描述:系统有两个用户,分别为 ex1ex2,这两个用户都拥有 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、粘滞位目录表现在 othersx 位,用 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.因为系统创建文件或目录受 UMASK 控制,比如 UMASK 设置为:022
    • 2.那么创建出来的文件权限是 644,目录是 755
    • 3.目录:777 - 022 = 755 最终创建出来的目录权限;
    • 4.文件:666 - 022 = 644 最终创建出来的文件权限;
  • 结论:
    • UMASK 表示要减掉的权限;

5.3 系统默认权限配置文件

为什么默认 root 用户的 UMASK022,在系统哪个配置文件有设定呢;

  • 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

  • 13
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值