文件的安全上下文 ---- SEAndroid in Android 5.x

本文详细介绍了Android系统中如何设置文件的安全上下文,包括通过`file_contexts`设定ROM内文件上下文,`genfs_contexts`配置虚拟文件系统上下文,以及`mac_permissions.xml`和`seapp_contexts`来管理应用程序数据文件的安全上下文。通过示例展示了如何为特定应用添加新的安全域。
Android系统中的文件生成方式有两种:
1.ROM里面预设的。对于ROM里面预设的文件,我们使用预先定义的方式来确定他们的安全上下文。
2.动态生成的。对于动态生成的文件,原则上继承父目录的安全上下文。但有一些特别的情况下,我们会遵循预先设定的规则来设置他们的安全上下文。

在SEAndroid使用三种方式来设置文件的安全上下文。
1.设置打包在ROM里面的文件的安全上下文
            external/sepolicy/file_contexts
      文件部分内容如下:
# Root
                u:object_r:rootfs:s0

# Data files
/adb_keys            u:object_r:adb_keys_file:s0
/default\.prop            u:object_r:rootfs:s0
/fstab\..*            u:object_r:rootfs:s0
/init\..*            u:object_r:rootfs:s0
/res(/.*)?            u:object_r:rootfs:s0
/ueventd\..*            u:object_r:rootfs:s0
这个文件中的所有路径都是定义在ROM中的,而不是在系统运行时动态生成的。也就是说,这些路径的安全上下文必须预先设置好。这个文件编译好之后,会存放在$OUT/root/file_contexts
路径按照最佳匹配的原则进行匹配,当遇到类似下面这种时,选择最符合的那一项:
/dev/block(/.*)?      u:object_r:block_device:s0
/dev/block/loop[0-9]*      u:object_r:loop_device:s0
/dev/block/ram[0-9]*      u:object_r:ram_device:s0


  2. 设置虚拟文件系统的安全上下文
external/sepolicy/genfs_contexts
文件内容如下:
# Label inodes with the fs label.
genfscon rootfs / u:object_r:rootfs:s0
# proc labeling can be further refined (longest matchingprefix).
genfscon proc / u:object_r:proc:s0
genfscon proc /net u:object_r:proc_net:s0
genfscon proc /net/xt_qtaguid/ctrl u:object_r:qtaguid_proc:s0
genfscon proc /cpuinfo u:object_r:proc_cpuinfo:s0
genfscon proc /sysrq-trigger u:object_r:proc_sysrq:s0
genfscon proc /sys/fs/protected_hardlinksu:object_r:proc_security:s0
genfscon proc /sys/fs/protected_symlinksu:object_r:proc_security:s0
genfscon proc /sys/fs/suid_dumpableu:object_r:proc_security:s0
genfscon proc /sys/kernel/core_patternu:object_r:usermodehelper:s0
genfscon proc /sys/kernel/dmesg_restrictu:object_r:proc_security:s0
genfscon proc /sys/kernel/hotplugu:object_r:usermodehelper:s0
genfscon proc /sys/kernel/kptr_restrictu:object_r:proc_security:s0
genfscon proc /sys/kernel/modprobeu:object_r:usermodehelper:s0
genfscon proc /sys/kernel/modules_disabledu:object_r:proc_security:s0
genfscon proc /sys/kernel/poweroff_cmdu:object_r:usermodehelper:s0
genfscon proc /sys/kernel/randomize_va_spaceu:object_r:proc_security:s0
genfscon proc /sys/kernel/usermodehelperu:object_r:usermodehelper:s0
genfscon proc /sys/net u:object_r:proc_net:s0
genfscon proc /sys/vm/mmap_min_addru:object_r:proc_security:s0
genfscon proc /sys/vm/dirty_ratio  u:object_r:proc_dirty_ratio:s0
# selinuxfs booleans can be individually labeled.
genfscon selinuxfs / u:object_r:selinuxfs:s0
genfscon cgroup / u:object_r:cgroup:s0
# sysfs labels can be set by userspace.
genfscon sysfs / u:object_r:sysfs:s0
genfscon inotifyfs / u:object_r:inotify:s0
genfscon vfat / u:object_r:vfat:s0
genfscon debugfs / u:object_r:debugfs:s0
genfscon fuse / u:object_r:fuse:s0
genfscon pstore / u:object_r:pstorefs:s0
genfscon functionfs / u:object_r:functionfs:s0
genfscon usbfs / u:object_r:usbfs:s0

3. 设置应用程序数据文件的安全上下文
首先查看external/sepolicy/mac_permissions.xml
分析这个文件:
<!-- Platform dev key in AOSP -->
< signer signature="@PLATFORM" >
    < seinfo value="platform" />
< /signer>


按照上面的signer的内容,表明当APP签名为@PLATFORM的时,则这个APP的seinfo为platform。
关于@PLATFORM的具体内容,在/external/sepolicy/keys.conf当中:
[@PLATFORM]
ALL : $DEFAULT_SYSTEM_DEV_CERTIFICATE/platform.x509.pem
这个路径也就是:/build/target/product/security/platform.x509.pem
再看下面的default部分的内容,表明不符合上面筛选条件的APP,最后都会得到seinfo为default。
<!-- All other keys -->
<default>
    <seinfo value="default" />
</default>

然后根据seinfo的内容platform,查看external/sepolicy/seapp_contexts,内容如下:
isSystemServer=true domain=system_server
user=system domain=system_app type=system_app_data_file
user=bluetooth domain=bluetooth type=bluetooth_data_file
user=nfc domain=nfc type=nfc_data_file
user=radio domain=radio type=radio_data_file
user=shared_relro domain=shared_relro
user=shell domain=shell type=shell_data_file
user=_isolated domain=isolated_app
user=_app seinfo=platform domain=platform_apptype=app_data_file
user=_app domain=untrusted_app type=app_data_file
根据匹配最符合项的规则,当一个签名为@PLATFORM的app安装时会得到seinfo=platform,对应这一行:
user=_app seinfo=platform domain=platform_apptype=app_data_file
该应用的进程domain就是platform_app ,该应用的数据文件的type就是app_data_file。
而一般的第三方应用得到的seinfo是default,并没有这个seinfo的条目,根据最匹配规则,则会对应到:
user=_app domain=untrusted_app type=app_data_file
进程domain为untrusted_app,应用的数据文件的type为app_data_file。


如果我们想要在系统中为自己的应用们增加一个特定的domain,名为anrom,那么需要做的事情是:
1./build/target/product/security/目录下,增加我们的签名pem文件:anrom.pem

2.在/external/sepolicy/keys.conf当中,增加我们的pem条目:
[@ANROM]
ALL : $DEFAULT_SYSTEM_DEV_CERTIFICATE/anrom.pem

3.在external/sepolicy/mac_permissions.xml中,增加筛选我们的应用的内容:
   
<signer signature="@ANROM" >

    <seinfo value="anrom" />

    <package name="com.anrom.aaa">
        <seinfo value="aaa" />
    </package>  

    <package name="com.anrom.bbb">
        <seinfo value="bbb" />
    </package>  

</signer>

<!-- All other keys -->
<default>
    <seinfo value="default" />
</default>


signature="@ANROM",表示签名为@ANROM的APP,会进入这个标签筛选的范围中。
signer标签中有三个部分:
第一部分: 直接给出了一个seinfo
第二部分和第三部分:分别给出了两个package name "com.anrom.aaa" 和 "com.anrom.bbb"他们分别对应着seinfo "aaa" 和 "bbb"。
根据第二部分的内容,当一个APP签名为@ANROM,包名为“com.anrom.aaa”,这个APP会得到seinfo为aaa。
第三部分作用类似。
而其他签名为@ANROM的APP,则根据第一部分的内容,得到seinfo为anrom。

4.在external/sepolicy/seapp_contexts中,为seinfo指定domain和type。
user=_app seinfo=anrom domain=anrom_apptype=anrom_app_data_file
user=_app seinfo=aaa domain=aaa_app type=aaa_app_data_file
user=_app seinfo=bbb domain=bbb_app type=bbb_app_data_file

5.在external/sepolicy/路径下,创建新文件anrom_app.te,aaa_app.te和bbb_app.te
具体的文件内容,可以在platform_app.te的基础上进行修改。

6.在app.te文件中查看neverallow部分是否有不符合我们需求的部分,比如我们可能需要在neverallow规则中去掉anrom_app,那就需要我们将文件中所有出现的
neverallow { appdomain -platform_app}
全部改成
neverallow { appdomain -platform_app -anrom_app}

7.在file.te中,增加
type anrom_app_data_file, file_type, data_file_type;
type aaa_app_data_file, file_type, data_file_type;
type bbb_app_data_file, file_type, data_file_type;

8.在installd.te里面,为installld增加anrom_app_data_file类文件的操作权限(这里只列举anrom_app_data_file,剩下两个type类似操作)
allow installd { system_app_data_file bluetooth_data_filenfc_data_file radio_data_file shell_data_file app_data_fileanrom_app_data_file }:dir { create_dir_perms relabelfrom relabelto};
allow installd { system_app_data_file bluetooth_data_filenfc_data_file radio_data_file shell_data_file app_data_fileanrom_app_data_file }:lnk_file { create setattr getattr unlinkrename relabelfrom relabelto };
allow installd { system_app_data_file bluetooth_data_filenfc_data_file radio_data_file shell_data_file app_data_fileanrom_app_data_file }:{ file sock_file fifo_file } { getattr unlinkrename relabelfrom relabelto setattr };


课程简述  Android是目前最为流行的移动操作系统之一,它的开发涉及到多个知识领域。本课程将深入介绍Android系统启动过程中的重要组成部分——init进程,并探讨与之相关的多项关键技术。我们还将提供实际的开发案例,以RK3399开发板为例,通过演示Android产品配置、init启动流程、selinux权限管理、init.rc启动脚本定制等实际案例,让学员深入理解这些技术在实际产品开发中的应用场景和实现方法,提高学员的实际开发能力和经验,从而更好地应对实际产品开发中遇到的问题和挑战。知识运用方向学习Android启动方面的知识,可以参与如下实际开发工作项:启动流程定制: 根据产品需求调整Android启动流程,包括修改init.rc脚本、修改启动顺序和等待时间、加入自定义服务等。属性系统定制: 通过Android属性系统定制化启动流程,例如增加产品版本信息、定制开机音量等。日志系统分析: 掌握日志的捕捉、分析和排错技术,在启动过程中,需要加入调试信息来方便开发人员进行调试,同时需要进行日志的优化,避免日志输出过多占用过多的系统资源。selinux安全策略定制:在Android系统中,selinux是一种安全机制,用于保护系统的敏感资源和数据。在实际开发中,可能需要对selinux策略进行定制,以确保系统的安全性和稳定性。课程内容主要内容简述1, RK3399 开发板操作这部分内容重点介绍如何在FIreFly开发板上将Android 10系统运行起来, 包含编译FireFly的Android源码下载和编译, 镜像烧录运行,内核和模块编译,以及RK3399内核启动init进程的过程。2, 产品定制这部分讲解获取到方案商或者原厂提供的源码后, 如何定制一个新的产品,产品配置文件和模型, 原始代码中的配置文件和定制化东西3, Android日志代码编写之前讲过Android的日志系统, 并没涉及到代码编写, 这个部分重点讲解C/C++, java代码编写日志的API和代码4, 属性系统在Android中,属性使用的非常频繁的,可以用来作为进程间通信,也可以用于一些行为控制, 这个部分会重点介绍属性系统框架, API接口, 属性文件等知识点5selinux进程对文件进行访问时,Android 4.3就开始集成了selinux权限管控, 如果需要启动某个脚本或者服务, selinux的配置就避免不了,并且Android8之后, Android系统对进程访问的权限管控的非常严格。6, init.rc脚本Android定义的一种脚本, 改脚本是有init进程启动, 是非常重要的一个脚本, 会包含系统中的其他很多脚本, 在我们系统开发时, 我们经常通过这个脚本进行一些定制化动作。7, init进程代码分析想要了解一个系统,就必须对源码进行分析和理解, 这个章节,带大家去跟读init进程代码, 这样,换了另外一个Android版本,完全就可以去读代码, 知道有什么变化。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值