logo资料库

SELinux for Android 8.0_中文版.doc (Android8.0 sepolicy权限新特性,权限配置指...

第1页 / 共14页
第2页 / 共14页
第3页 / 共14页
第4页 / 共14页
第5页 / 共14页
第6页 / 共14页
第7页 / 共14页
第8页 / 共14页
资料共14页,剩余部分请下载后查看
此文档从官网的《SELinux for Android 8.0》翻译而来  Android8.0 AndroidSELinux 设计目标 Android4.4 到 Android7.0,SELinux 策略的构建流程是将所有的策略(平台和非 平台)合并在一起,最后将合并生成的文件统一放在 root 目录下(即 boot.img)。但 这种方式有悖于 Android 8.0 的预定设计目标;Android8.0 设计的初衷是允许合作 方可以独立的更新他们自有的策略,即在 Android8.0 之后 Google 允许合作方将自有 的策略部分与系统原有的进行分离,如合作方可以将自有的部分解耦到 vendor.img 分 区中,在需要更新的情况下只需更新 vendor 部分即可实现; SELinux 在 Android8.0 上的设计目标包含以下: 1. 策略模块化。在 Android4.4 到 Android7.0,大部分 SELinux 策略文件都打包在根 文件系统中,这样的话,策略文件改变的情况下,芯片厂商和 ODM 厂商需要同时更新 boot.img 和 system.img(system.img 只针对 ab 系统,因为 ab 系统的话,boot.img 是打包在 system.img 镜像中的)。Android8.0 之后,Google 为 SoC 和 ODM 提供 了新的方式,这种方式在他们自有的 SELinux 策略发生变化时仅需要修改他们自有的分 区即可,如 vendor.img; 2. 策略兼容性。 关于 Android8.0 架构如下图:
图 1.Android 分区 1. 2. 3. 4. 5. 6. 7. system.img 包含 Android 框架部分; boot.img 包含 kernel 和 ramdisk; vendor.img 包含芯片厂商客制化代码和配置 odm.img 包含 dom 厂商客制化代码和配置 oem.img 包含 oem 厂商客制化部分代码和配置; bootloader 引导部分 radio modem 部分
在 Androird8.0 之前,vendor、odm 和 omd 镜像都是可选的;在这些镜像中的配 置都是通过 symlinks 被放在 boot.img 和 system.img 中的(如 /vendor>/system/vendor)。在 Android8.0 之后,vendor 镜像被强制以镜像的形 式分离出来了。 这种模化设计体现在 Android 分区定义上,它使得平台在升级时(system.img)不会 对 SoC 和 ODM 厂商自有部分的代码和配置产生影响。  关于 SELinux SELinux 是通过标签系统来控制主体对客体的读写等访问权限的。每个进程或者其他 主体都有一个相关联的标签;我们称之为安全上下文。这个上下文是有 user,role, type,MLS 四部分组成; 1. type 我们也称之为 domain(域),这个域必须要在 SELinux 策略中进行定 义; 2. 一个主体的标签常常由对应的安全上下文文件所决定; SELinux 策略也包含角色,一个角色声明了哪些域可以访问哪些客体;在 Andoird4.4 到 Android7.0 的版本中,SELinxu 策略文件(sepolicy,file_context.bin, property_context 等)都是打包在根文件系统中的,如下:
这些文件包含了 SELinxu 策略规则和所有的标签,包括 ODM,SOC 和 AOSP。但是 在 Android8.0,这些文件将以模块的形式存在在不同的分区中;  Android7.x 的 SELinux 架构 a.SELinux 源文件 SELinux 源文件目录结构如下: external/selinux 外部 SELinux 工程 external/selinux/libselinux external/selinux/libsepol chkcon libsepol external/selinux/checkpolicy system/sepolicy Android SELinux 策略核心配置,包含 contexts 和策略文件 b.SELinux 编译流程 SELinux 策略的创建实际上就是将AOSP 策略文件和设备制造商自定义的策略文件合 并到一起,然后通过策略编译器编译,再通过各种策略校验机制校验,最终生成的一些 如 root/file_contexts.bin 的文件,被打包到镜像中去。 设备制造商可以通过在 Boardconfig.mk 文件,使用 BOARD_SEPOLICY_DIRS 宏定 义,将自有客制化部分的策略文件包含进去。如: BOARD_SEPOLICY_DIRS += device/$SoC/common/sepolicy BOARD_SEPOLICY_DIRS += device/$SoC/$DEVICE/sepolicy
system/sepolicy 目录下的 file_contexts 和 BOARD_SEPOLICY_DIRS 定义的策略 目录最终会编译生成 file_contexts.bin 文件。 图 2.SELinux 编译流程 sepolicy 策略文件是有多种源文件组成的,如: 图 3.SELinux 策略文件 policy.conf 是由 security_classes,initial_side,...*.te,genfs_contexts 和 port_contexts 串联生成的。 c.SELinux 文件 Android 设备通常包含下面这些 SELinux 相关的文件 selinux_version
1. 2. 3. 4. 5. 6. 7. sepolicy : binary output after combining policy files ( security_classes , initial_sids , *. te , etc.) file_contexts property_contexts seapp_contexts service_contexts system/etc/mac_permissions.xml d.SELinux 初始化 当系统启动时,SELinux 并不是强制模式(enforcing mode),而是宽容模式 (permissive mode)。init 进程会执行以下操作: 1. 通过/sys/fs/selinux,从 ramdisk 中载入 selinux 策略文件到 kernel 中; 2. 切换 SELinux 到强制模式 3. re-exec(),将 SELinux 域规则运用自己身上,即 init 进程。  Android 8.0 SELinux 设计思路 a.第一阶段 mount
在 Android8.0 之前,SELinux 文件是通过合并自定义策略和 aosp 的策略。在 Android8.0 之后,Android 提供了一种方式可以将非平台的策略从 aosp 平台中分离 出,这样合作方就可以独立的对自有部分的 SELinux 策略进行构建和更新。 解耦之后的 SELinux 策略文件可以存储在合作方自有的分区中(如 vendor),这 样一来,init 进程需要更早的将 system、vendor 分区挂在起来,这样才能保证在 init 初始化的时候可以尽早的读取加载 SELinux 文件,并与保存在 system 目录下的核心 SELinux 文件合并起来,之后再将合并之后的 SELinux 策略加载到内核中去。 b.SELinux 上下文标签 1>文件上下文 Android8.0 对 file_contexts 引入了以下修改: file_contexts 以二进制的形式打包在镜像中,这在 Android7.0 以及之前的版本都是以可读的文本的形式存在的。 Android8.0 将 file_contexts 分离成了两个文件: Plat_file_contexts:Android 平台 file_context 除了对 vendor 分区进行标记之外,没有其他有关设 备制造商自有的标签了。平台相关的 file_context 必须打包到 system 分区,如 /system/etc/selinux/plat_file_context。说白了 也就是从 Android8.0 开始,SELinux 平台相关的策 略文件将会打包到 system 分区,这个要与 Android7.0 进行区分,详细如下:
Android7.0 图 1 Android8.0 图 1 Android8.0 图 2 注!上面目录在 Andrid8.0 平台上的 boot 分区中 etc 目录会对 system/etc 目录进行映射,如下:
分享到:
收藏