Perface
前面的章节我们学了硬件安全,我们在之前说过其实安全就是三个层面的:硬件、操作系统、应用层。
这里来看看操作系统之前先看看内核
操作系统和内核是包含关系,内核是操作系统最基本的部分,它提供了操作系统的最基本功能,是操作系统工作的基础。
操作系统内核负责操作系统的任务调度、用户管理、内存管理、多线程支持、多CPU支持等,并包含必要的网络协议、驱动等。
内核是所有软件的基础,相应的内核安全是操作系统安全的基础。
这里其实可以理解一下什么内核和操作系统:简言之,操作系统就是内核掌握了技能之后的样子。
当前主流操作系统的内核都属于UNIX(或类UNIX)系统。UNIX是一个强大的多用户、多任务操作系统,支持多种处理器架构,属于分时操作系统。
UNIX最早于1969年在AT&T的贝尔实验室开发,随着时间演进产生若干分支,并在移动智能终端操作系统中获得广泛使用,如iOS系统基于UNIX BSD规范,而Android则基于Linux,同属UNIX大类。
简单地说,UNIX是现代操作系统的典型代表,也是各种主要OS的技术源泉;而Linux是类UNIX的一个开源版本,具有产品级的系统稳定性。
典型终端操作系统内核使用情况如表所示。
可以看到,除了iOS,其他多数移动智能终端操作系统均采用了Linux内核。但iOS系统是封闭的,整体来说,对Linux内核的安全研究有相当的实际价值。
在Linux基础之上,2000年12月22日美国国家安全局(NSA,National Security Agency)发布了Linux安全增强版本SELinux,其全称为Security-Enhanced Linux,之后被合并到主线Linux内核版本中。随着近几年安全需求的不断增强,SELinux开始在产品和系统中获得使用。
于是请欢迎咱们的主角SELinux登场!!!
1、SELinux整体架构
1.1 SELinux基本概念
SELinux由NSA发布,之后,Red Hat、Network Associates、Secure Computing Corporation、Tresys Technology以及Trusted Computer Solutions等公司及研究团队都为SELinux的发展做出了重要的贡献。
SELinux本质是一个Linux内核安全模块,可在Linux系统中配置其状态。SELinux的状态分为3种,即disabled、permissive和enforcing。
- (1)disabled状态:指在Linux系统中不启用SELinux模块的功能。
- (2)permissive状态:指在Linux系统中,SELinux模块处于Debug模式,若操作违反策略系统将对违反内容进行记录,但不影响后续操作。
- (3)enforcing状态:指在Linux系统中,SELinux模块有效,若操作违反策略,SELinux模块将无法继续工作。
SELinux涉及的重要概念如下。
(1)主体
主体是访问操作的发起者,是系统中信息流的启动者。主体通常指用户或代表用户意图的进程。
通常,主体是访问的发起者,但有时也会成为访问或受控的对象。
一个主体可以向另一个主体授权,一个进程可能会控制几个子进程,这时受控的主体或子进程就是一种客体。
(2)客体
客体相对主体而存在,通常客体是指信息的载体或从其他主体或客体接收信息的实体,即访问对象。
(3)访问控制分类
管理方式的不同形成不同的访问控制方式。
通常,访问控制方式分为两类:自主访问控制(DAC, Discretionary Access Control)和强制访问控制(MAC, Mandatory Access Control)。
(4)域
域决定了系统中进程的访问,所有进程都在域中运行。本质上,域是一个进程允许的操作列表,决定了一个进程可以对哪些类型进行操作。SELinux中域的概念相当于标准Linux中uid的概念。
(5)类型
类型与域的概念基本相似,但是,域是相对进程主体的概念,类型是相对目录、文件等客体的概念。类型分配给一个客体,并决定哪个主体可以访问该客体。
(6)角色
角色决定了可以使用哪些域。具体哪些角色可以使用哪些域,需要在策略配置文件中预先定义。如果在策略配置文件中定义了某个角色不可以使用某个域,在实际使用中将会被拒绝。
(7)身份
身份属于安全上下文的一部分,身份决定了本质上可以执行哪个域。
(8)安全上下文
安全上下文是对操作涉及的所有部分的属性描述,包括身份、角色、域、类型。
(9)策略
策略是规则的集合,是可以设置的规则。
策略决定一个角色的用户可以访问什么,哪个角色可以进入哪个域,哪个域可以访问哪个类型等。
1.2、SELinux内核架构
最早期的SELinux是Linux系统一个增强安全的补丁集,其后为解决每个系统对安全的细节控制不尽相同的问题,Linux安全框架(LSM, Linux Security Modules)被提出,使SELinux可作为可加载的安全模块运行。
LSM是一个底层的安全策略框架,Linux系统利用LSM管理所有的系统调用。SELinux通过LSM框架整合到Linux内核中。LSM在Linux内核中的位置如图所示。
![](https://img-blog.csdnimg.cn/e...
当用户进程执行系统调用时,进程首先遍历Linux内核现有的逻辑寻找和分配资源,进行一些常规的错误检查,然后进行DAC自动访问控制。
自主访问控制(DAC, Discretionary Access Control)
进程仅在内核访问内部对象之前,由LSM的钩子询问LSM模块可否访问,LSM模块处理该策略问题并回答可以访问或拒绝访问。
LSM框架主要包括安全服务器、客体管理器和访问向量缓存。LSM模块架构如图所示。
安全服务器负责策略决定,安全服务器使用的策略通过策略管理接口载入。
客体管理器负责按照安全服务器的策略决定强制执行它管理的资源集。
对于内核,客体管理器可以理解为一个内核子系统,负责创建并管理内核级的客体,包括文件系统、进程管理和System V进程间通信(IPC, Inter-Process Communication)。
访问向量缓存(AVC, Access Vector Cache)提升了访问确认的速度,并为LSM钩子和内核客体管理器提供了SELinux接口。
1.3、SELinux策略语言
SELinux架构中,对于内核资源,策略通过策略管理接口载入SELinux LSM模块安全服务器中,从而决定访问控制。
SELinux的优势是其策略规则不是静态的,用户必须按照安全目标的要求自行编写策略。使用和应用SELinux本质上就是编写和执行策略的过程。
策略在策略源文件中描述。策略源文件名称为policy.conf,其文件结构包括以下几点。
- (1)类别许可,指安全服务器的客体类别,对于内核而言,类别直接关系内核源文件,许可指针对每个客体类别的许可。通常,SELinux策略编写者不会修改客体的类别和许可定义。
- (2)类型强制声明,包括所有的类型声明和所有的TE(Type Enforcement,类型强制)规则,是SELinux策略中最重要的部分。
- (3)约束,是TE规则许可范围之外的规则,为TE规则提供必要的限制。多级安全(MLS)是一种约束规则。
- (4)资源标记说明,指对所有客体都必须添加的一个“安全上下文”标记,是SELinux实施访问控制的前提。SELinux根据资源标记说明处理文件系统标记以及标记运行时创建的临时客体规则。
SELinux策略大而复杂,由一个个小的策略模块构成。
策略模块的生成一般采用源模块法。源模块法支持单策略的开发,并通过一组shell脚本、m4宏和Makefile一起合并成为文本文件。
多个策略模块集合组成策略源文件,即policy.conf,策略源文件是文本文件,通过策略编译器checkpolicy编译为二进制文件policy.xx(xx为版本号),并通过策略装载函数security_load_policy载入内核且实施访问控制。
使用源模块构造和载入SELinux策略的全过程如图所示。
- 首先,通过源模块法生成一个个策略模块,策略模块聚合形成一个大的策略源文件policy.conf;
- 其次,策略源文件policy.conf通过策略编译器checkpolicy,生成可被内核读取的二进制文件policy.xx;
- 最后,policy.xx通过策略装载函数security_load_policy载入内核空间并实施访问控制。
目前,在SELinux策略上常见的是单策略组合。
下一篇我们来看看Selinux的关键技术有什么?
作者:Hkcoco
文章来源:TrustZone
推荐阅读
更多物联网安全,PSA等技术干货请关注平台安全架构(PSA)专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入PSA技术交流群,请备注研究方向。