SELinux学习

SELinux

SELinux简单介绍

SELinux(Security-Enhanced Linux) 安全增强型Linux
是一个Linux内核模块,也是Linux的一个安全子系统
是一种MAC(强制访问控制)类型的权限管理,与Linux的DAC(自主访问控制)机制不同
主要作用是最大限度地减小系统中服务进程可访问的资源(最小权限原则)
SEAndroid 是Google 在Android4.4上正式推出的一套以SELinux为基础核心的系统安全机制

Tips:

  • DAC是由被访问者的资源来决定访问权限(资源的rwx属性决定访问者是否能够访问)
  • MAC是由访问者的角度来决定访问权限(系统根据配置来决定某个进程能够访问哪些资源)

打个比方,也就是DAC是草坪上的禁止践踏的标志,然后MAC是大人限制小孩,提醒他不要践踏草坪

SEAndroid简单介绍

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模块

SELinux Policy

简单介绍:
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 Context

调试SELinux政策或为文件添加标签时(通过file_contexts或运行ls -Z),可能会遇到安全上下文(也称为标签)。
安全上下文的格式为: user:role:type:sensitivity[:categories],通常可以忽略user,rolesensitivity字段。

不使用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

avc警告

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/

你可能感兴趣的:(学习,android)