这是机器未来的第35篇文章
原文首发地址:https://blog.csdn.net/RobotFutures/article/details/125914553
在智能驾驶越来越普及的今天,如何保证车载设备的安全,如何保证分配的权限是最合适的,不会出现越权访问?如何保证对外接口访问用户的权限是高度可控的?在应用程序被攻击后,如何保证黑客不能拿到超越进程的权限?
来看看selinux如何解决这个问题。
SELinux是Security-Enhanced Linux的简称,字面意思是强化版的安全Linux,它是Linux的安全子系统,由美国国家安全局NSA开发,是强制访问控制MAC的实现, Linux历史上最杰出的新安全子系统。
用过linux系统的人知道,文件是有访问权限控制的,读、写、执行,还有用户、组权限的控制,文件的权限控制通过文件来实现的方式,被成为DAC,自主访问控制。这种方式存在2个问题:
(1)超级用户root拥有所有的权限,假如我们的软件存在漏洞呢?这个往往是一个灾难性的问题;
(2)使用者可以通过程序变更文件的访问权限,如果配置为777,那么任何人都可以访问;
针对这2个问题,提出了MAC强制访问权限控制,可以针对特定的程序与特定的文件资源来进行权限的控管,控制的主体不再是使用者,而是程序,即使是root用户也不能任意访问文件,相对于DAC,MAC的权限访问的颗粒度更细了。
访问控制包括三个要素:主体、客体和控制策略。
(1)主体S(Subject)。是指提出访问资源具体请求。是某一操作动作的发起者,但不一定是动作的执行者,可能是某一用户,也可以是用户启动的进程、服务和设备等。
(2)客体O(Object)。是指被访问资源的实体。所有可以被操作的信息、资源、对象都可以是客体。客体可以是信息、文件、记录等集合体,也可以是网络上硬件设施、无限通信中的终端,甚至可以包含另外一个客体。
(3)控制策略A(Access Control Policy)。是主体对客体的相关访问规则集合,即属性集合。访问策略体现了一种授权行为,也是客体对主体某些操作行为的默认。
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为其它用户的权限)。
进程的主体是进程,客体是被访问的资源。
MAC机制的特点在于,资源的拥有者,并不能决定谁可以接入到资源。具体决定是否可以接入到资源,是基于安全策略。而安全策略则是有一系列的接入规则组成,并仅有特定权限的用户有权限操作安全策略。
MAC强制访问控制的流程大致是上图所示,分为3个步骤:
简单来说,主体有政策规则权限还不够,还需要进程和文件的安全上下文匹配之后,最终和DAC访问控制逻辑一样,匹配文件的rwx的权限后才可以访问,如下图所示:
什么是Context,它被成为安全上下文,分为进程安全上下文和资源的安全上下文(文件),只有两者的安全上下文匹配了,进程才可以访问文件。
那么安全上下文是什么样的呢?
先来看一下进程的安全上下文:
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。
类型字段在文件与程序的定义不太相同,分别是:
这几项数据不太好区分,可以看他们后缀:
更多安全上下文信息可以看这个对照表:
说完安全上下文,那么如何才能让安全上下文生效呢?可以通过配置selinux的工作模式来启用。
selinux有三种工作模式:
SELinux 的三种类型与实际运行流程图:
了解了安全上下文,那么它到底是怎样的匹配规则呢,进程和文件的安全上下文如何匹配呢?接下来了解一下selinux的策略类型。
selinux支持三种策略:targeted(default)、mls、src三种。
原理讲了挺多的,主要核心点就是策略Policy、安全上下文security context,那么实际是如何使用的呢?请看下一章,SELinux使用实战。
参考文献:
写在末尾:
- 博客简介:专注AIoT领域,追逐未来时代的脉搏,记录路途中的技术成长!
- 专栏简介:从0到1掌握SELinux的使用。
- 面向人群:嵌入式Linux软件工程师
- 专栏计划:接下来会逐步发布跨入人工智能的系列博文,敬请期待
- Python零基础快速入门系列
- 快速入门Python数据科学系列
- 人工智能开发环境搭建系列
- 机器学习系列
- 物体检测快速入门系列
- 自动驾驶物体检测系列
- …