SELinux(Security-Enhanced Linux) 安全增强型Linux
是一个Linux内核模块,也是Linux的一个安全子系统
是一种MAC(强制访问控制)类型的权限管理,与Linux的DAC(自主访问控制)机制不同
主要作用是最大限度地减小系统中服务进程可访问的资源(最小权限原则)
SEAndroid 是Google 在Android4.4上正式推出的一套以SELinux为基础核心的系统安全机制
Tips:
打个比方,也就是DAC是草坪上的禁止践踏
的标志,然后MAC是大人限制小孩,提醒他不要践踏草坪
。
SEAndroid是基于SELinux的拓展,Android在用户空间增加了一下内容来适配内核LSM(Linux Security Module)模块。
- Security Context ---- 存放Android系统各分区、进程、属性等资源的安全上下文
- Security Server ---- Android进程主要通过init、Zygote、PMS拉起,拉起后需要对Android进程、应用设置安全上下文;同时init进程也需要在开机初始化Security Context和Security Policy
- Security Policy ---- 存放Android系统的SEPolicy配置
- libselinux ---- 针对Framework、Native层设计的接口,将操作写入 sys/fs/selinux内核节点,对接内核LSM模块
简单介绍:
Android 依靠 SELinux 的类型强制执行(TE)组件来实施其政策。政策规则采用allow source target:class permissions
的格式。
- source - 规则主题的类型(或属性)。也就是谁来请求访问权限?
- 目标 - 对象的类型(或属性)。对哪些内容提出访问权限请求?
- 类 - 要访问的对象(例如,文件、套接字)的类型。
- 权限 - 要执行的操作(或一组操作,例如读取、写入)。
举个栗子:
allow untrusted_app app_data_file:file {read write};
这个例子表示应用可以读取和写入带有 app_data_file
标签的文件。
当编写的规则制定了某个属性名称时,该名称会自动拓展为列出与该属性关联的所有域或类型
。一些重要属性包括:
domain
- 与所有进程类型相关联的属性file_type
- 与所有文件类型相关联的属性
栗子:
# Associate the attribute appdomain with the type untrusted_app.
typeattribute untrusted_app, appdomain;
# Associate the attribute appdomain with the type isolated_app.
typeattribute isolated_app, appdomain;
allow appdomain app_data_file:file { read write };
安全策略使用te(类型强制)语言,编译元为.te文件,在该类文件中可以声明安全上下文的type、domain以及制定安全策略。
type & domain
type 表示的是单一类型,domain可以理解为由N个具有共同属性的单一类型形成的域(集合)
声明一个type,大括号中为可选:
type xxx{,domain};
# /data/misc/profcollectd
type profcollectd_data_file, file_type, data_file_type, core_data_file_type;
# file_type表示文件类型域
声明一个domain
attribute xxx;
给已定义的type xxx追加所属domain xxx_domain
typeattribute xxx,xxx_domain
栗子:
声明一个my_type类型,该类型属于system_data_file域
type my_type,system_data_file
安全策略是围绕type和domain制定的,其语法为:
allow typeA typeB:class{perms};
上面的仅仅是语法,其中每个位置还可以用其他代替或者有自己的含义。
其中,
除了allow外,还有其他集中类型。allow : 允许,dontauit:无论鉴权是否通过,均屏蔽告警且放行,auditallow:允许操作同时产生告警,neverallow:不允许
typeA为主体,可以是type,也可是domain,但主体一定是进程标签或域,可使用{}包含多个type/domain
typeB为客体,可以是type,也可是domain,可以是进程或资源的标签或域,可使用{}包含多个type/domain
class 资源的类型,比如 file|dir|binder等,每一类class对应该类具有的perms
perms 权限,对应Linux内核的系统调用、io等
调试SELinux政策或为文件添加标签时(通过file_contexts
或运行ls -Z
),可能会遇到安全上下文
(也称为标签
)。
安全上下文的格式为: user:role:type:sensitivity[:categories]
,通常可以忽略user
,role
和sensitivity
字段。
不使用SELinux用户,唯一的用户是
u
不使用SELinux角色和基于角色的访问权限控制(RBAC)。定义并使用了两个默认角色:r
(适用于主题,也就是访问者,例如进程)和object_r
(适用于对象,也就是被访问的资源)
type 是安全上下文中最关键的字段,代表着资源的类型
不适用SELinux敏感度。已始终设置好默认的s0
敏感度。sesitivity[:categories]是MLS(Multi-Level Security)多级安全机制判断权限优先级的依据;通常仅有Android应用涉及MLS机制,即s0后存在c15,c256等修饰符,用于部分app数据分隔。低优先级的进程无法访问优先级高的资源。概述一下,其作用是分隔应用数据,使其不被其他应用访问;分割不同时机用户的应用数据
。
举个栗子:
/system/sepolicy/private/file_contexts
/data u:object_r:system_data_root_file:s0
/data/(.*)? u:object_r:system_data_file:s0
上面这个是Android系统中/data目录的标签,其中 user 是 u
,role 是 object_r
,type 是system_data_root_file
以及sensitivity[:categories]是 s0。
安全上下文相关link:
https://source.android.google.cn/docs/security/selinux/implement?hl=zh-cn#context-files
自定义SELinux相关link:
https://source.android.google.cn/docs/security/selinux/customize#available_controls
To be continue…
https://blog.csdn.net/xxdw1992/article/details/120881548
https://source.android.google.cn/docs/security/selinux/customize#available_controls
https://source.android.google.cn/docs/security/selinux/implement?hl=zh-cn#context-files
http://aospxref.com/android-12.0.0_r3/xref/system/sepolicy/private/