SELinux (Security Enhanced Linux)是由美国NSA(国安局)和 SCC 开发的 Linux 的一个扩张强制访问控制安全模块,目的是最大限度减少系统中服务进程可访问的资源。Google 在 Android 4.4 上正式添加以 SELinux 为基础的系统安全机制,命名为SEAndroid。SEAndroid 在架构和机制上与 SELinux 完全一样,基于移动设备的特点,SEAndroid 的只是所以移植 SELinux 的一个子集。
DAC与MAC
自主访问权限(DAC)
当程序要操作文件时,系统根据程序的 Owner/Group,对比文件的权限,若通过权限检查,则可操作文件,但可能造成问题:
- root 具有最高权限,若某程序属于root,则该程序可操作系统的任何文件
- 使用者可利用程序来变更文件的权限
强制访问控制(MAC)
以进程为主体,任何进程想在系统上干任何事情,都必须在《安全策略文件》中赋予权限。
- TEAC(Type Enforcement Accesc Control):一般用TE表示,是MAC的基础管理思路。根据Security Context中的 type 进行权限审查, 审查 subject type 对 object type 的某个class 类型中某种 permission 是否具有访问权限
- Role Based Accesc Control:MAC的高级管理思路基于角色控制,RBAC 是基于 TE 的
模式
- Enforcing:强制模式:SELinux在运行中,且已经开始限制domain/type之间的验证关系
- Permisssive:宽容模式:SELinux在运行中,如果验证不正确会发出警告
- Disabled:关闭模式,SELinux并没有实际运行
//获取SeLinux模式
adb shell getenforce
//设置SeLinux模式为Enforcing(只允许Enforcing和Permissive之间切换)
adb shell setenforce 1
//设置SeLinux模式为Permisssive
adb shell setenforce 0
sContext
组成
SELinux 安全策略是建立在对象安全上下文的基础上的,对象可以分为两种:
- 主体(Subject):通常指进程。
- 客体(Objcet):指通常要访问的资源,如文件、进程、socket等。
在 SELinux 中,每种东西都会被 Policy 赋予一个安全属性,官方说法叫做 Security Context(sContext),sContext 是一个字符串。根据 SELinux 规范,完整的 sContext 字符串主要由三个部分组成:user:role:type[:range]
- user:Android中只定义了一个SELinux用户,即
u
- role:一个user可以属于多个role,不同role具有不同权限,即MAC的