网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
用过linux系统的人知道,文件是有访问权限控制的,读、写、执行,还有用户、组权限的控制,文件的权限控制通过文件来实现的方式,被成为DAC,自主访问控制。这种方式存在2个问题:
(1)超级用户root拥有所有的权限,假如我们的软件存在漏洞呢?这个往往是一个灾难性的问题;
(2)使用者可以通过程序变更文件的访问权限,如果配置为777,那么任何人都可以访问;
针对这2个问题,提出了MAC强制访问权限控制,可以针对特定的程序与特定的文件资源来进行权限的控管,控制的主体不再是使用者,而是程序,即使是root用户也不能任意访问文件,相对于DAC,MAC的权限访问的颗粒度更细了。
4 selinux的实现原理是怎样的,为什么它能?
4.1 主体与客体
访问控制包括三个要素:主体、客体和控制策略。
(1)主体S(Subject)。是指提出访问资源具体请求。是某一操作动作的发起者,但不一定是动作的执行者,可能是某一用户,也可以是用户启动的进程、服务和设备等。
(2)客体O(Object)。是指被访问资源的实体。所有可以被操作的信息、资源、对象都可以是客体。客体可以是信息、文件、记录等集合体,也可以是网络上硬件设施、无限通信中的终端,甚至可以包含另外一个客体。
(3)控制策略A(Access Control Policy)。是主体对客体的相关访问规则集合,即属性集合。访问策略体现了一种授权行为,也是客体对主体某些操作行为的默认。
4.2 自主访问控制DAC实现的原理
DAC的主体是使用者,客体是被访问的资源。
DAC访问策略下,文件的拥有者可以自主地说明它所拥有的资源允许系统中的哪些用户以何种权限进行共享。
linux下的文件是基于权限位实现的访问控制。
执行一下ls -l查看目录下的文件列表,可以看到一行信息最左侧的就是访问权限位
zhoushimin@zsm:tools$ ls -l
total 728236
drwxrwxr-x. 1 zhoushimin zhoushimin 454 Jul 6 20:20 anaconda3
-rw-rw-r--. 1 zhoushimin zhoushimin 667976437 Jul 2 15:56 Anaconda3-5.3.1-Linux-x86_64.sh
-rwxrwxr-x. 1 zhoushimin zhoushimin 244 Jul 19 10:41 clean_snaps.sh
-rwxr--r-x. 1 zsm2 zhoushimin 244 Jul 19 10:41 clean_snaps2.sh
-rw-rw-r--. 1 zhoushimin zhoushimin 983655 Jul 13 14:38 'LTE<E-A_QFlash_Linux&Android_V2.0.zip'
lrwxrwxrwx. 1 zhoushimin zhoushimin 20 Jul 10 00:12 picgo -> PicGo-2.2.2.AppImage
-rwxrwxr-x. 1 zhoushimin zhoushimin 69324801 Jul 3 00:57 PicGo-2.3.0.AppImage
drwxrwxr-x. 1 zhoushimin zhoushimin 284 Jul 18 10:44 platform-tools
-rw-rw-r--. 1 zhoushimin zhoushimin 7406632 Jul 18 10:44 platform-tools_r33.0.2-linux.zip
drwxrwxr-x. 1 zhoushimin zhoushimin 890 Jul 13 14:18 QFlash_Linux_Android
drwxr-xr-x. 1 root root 324 Jul 4 11:19 Qt
以第3个文件clean_snaps.sh为例,它的权限位信息为-rwxrwxr-x,权限位3位一组,拆分rwx,rwx,r-x,分别代表文件的所有者的访问权限、文件所有者所在组的访问权限、其它用户的访问权限。r代表读、w代表写、x代表执行,-代表无权限。
那么用户zhoushimin对clean_snaps2.sh文件有什么访问权限呢?
首先先查看该用户的用户组信息
# 查看用户、用户组信息
zhoushimin@zsm:tools$ id zhoushimin
uid=1000(zhoushimin) gid=1000(zhoushimin) groups=1000(zhoushimin),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),120(lpadmin),132(lxd),133(sambashare)
可以看到clean_snaps2.sh文件属于zsm2用户,它的组为zhoushimin,zhoushimin用户的组信息从id zhoushimin输出可知,也是zhoushimin,那么用户zhoushimin和zsm2在同一个组,那么zhoushimin拥有clean_snaps2.sh属主的访问权限,为r–(注:rwxr–r-x为其访问控制的权限位,从左到右,rwx为属主的权限,r–为属组的权限,r-x为其它用户的权限)。
4.3 强制访问控制MAC实现的原理
4.3.1 原理概述
进程的主体是进程,客体是被访问的资源。
MAC机制的特点在于,资源的拥有者,并不能决定谁可以接入到资源。具体决定是否可以接入到资源,是基于安全策略。而安全策略则是有一系列的接入规则组成,并仅有特定权限的用户有权限操作安全策略。
4
MAC强制访问控制的流程大致是上图所示,分为3个步骤:
- 主体程序必须要通过 SELinux 政策内的规则放行后,就可以与目标资源进行安全性本文的比对;
- 若比对失败则无法存取目标,若比对成功则可以开始存取目标。
- 最终能否存取目标还是与文件系统的 rwx 权限设置有关
简单来说,主体有政策规则权限还不够,还需要进程和文件的安全上下文匹配之后,最终和DAC访问控制逻辑一样,匹配文件的rwx的权限后才可以访问,如下图所示:
4.3.2 安全上下文Security Context
什么是Context,它被成为安全上下文,分为进程安全上下文和资源的安全上下文(文件),只有两者的安全上下文匹配了,进程才可以访问文件。
那么安全上下文是什么样的呢?
- SELinux User:每一个Linux用户都会映射到SELinux用户,每一个SELinux User都会对应相应的Role。
- SELinux Role:每个Role也对应几种SELinux Type,并且充当了User和Type的‘中间人’
- SELinux Type:安全策略使用SELinux Type制定规则,定义何种Domian(Type)的Subject,可以接入何种Type的Object。
- SELinux Level:安全级别
先来看一下进程的安全上下文:
zhoushimin@zsm:Desktop$ ps -auxZ | grep typora
system_u:system_r:initrc_t:s0 zhoushi+ 49036 0.2 0.8 38271896 141120 ? Sl 11:47 0:20 /usr/share/typora/Typora
在原来的查看进程的命令参数中添加Z选项即可查询进程的安全上下文信息。上面的例子的安全上下文信息为system_u:system_r:initrc_t:s0,其构成为selinux用户、selinux角色、域domain、级别mls:s0
再来看一下文件的安全上下文:
zhoushimin@zsm:~$ ls -lZ
-rw-rw-r--. 1 zhoushimin zhoushimin system_u:object_r:user_home_dir_t:s0 585756 Jul 20 15:26 2022-07-20-14-07-09.log
同样的,在ls -l的基础上添加Z选项即可查看文件的security context,其上下文为system_u:object_r:user_home_dir_t:s0,对应的selinux用户为system_u、selinux角色object_r,类型Type为user_home_dir_t,安全级别为S0。
类型字段在文件与程序的定义不太相同,分别是:
- type:在文件资源 (Object) 上面称为类型 (Type);
- domain:在主体程序 (Subject) 则称为领域 (domain)
这几项数据不太好区分,可以看他们后缀:
- system_u: 后缀为u,代表为selinux用户user
- object_r:后缀为r,达标为selinux角色role
- user_home_dir_t:后缀为t,达标为selinux类型或域
- s0:s开头的达标mls安全级别。MAC 细分为两种方式,一种叫类别安全(MCS)模式,另一种叫多级安全(MLS)模式,mls级别仅在MLS模式下生效
更多安全上下文信息可以看这个对照表:
说完安全上下文,那么如何才能让安全上下文生效呢?可以通过配置selinux的工作模式来启用。
4.3.3 selinux工作模式
selinux有三种工作模式:
- enforcing:强制模式。违反 SELinux 规则的行为将被阻止并记录到日志中。
- permissive:宽容模式。违反 SELinux 规则的行为只会记录到日志中。一般为调试用, 首次开启建议先配置为permissive,特别在PC上,防止进不了系统。
- disabled:关闭 SELinux,直接去匹配文件系统的rwx权限。
SELinux 的三种类型与实际运行流程图:
了解了安全上下文,那么它到底是怎样的匹配规则呢,进程和文件的安全上下文如何匹配呢?接下来了解一下selinux的策略类型。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新