一,DAC和MAC
DAC:自主访问权限控制。Android 是基于Liunx的操作系统,在Liunx中,有用户和用户组的概念。一个文件可以规定为:拥有它的用户具有什么权限,和它同组的用户具有什么权限以及其它的用户具有什么权限。我们可以通过chmod来改变访问它所需的权限。
MAC:强制访问权限控制。当一个主体(进程)访问一个客体(资源)时,需要通过策略文件的规定,才能进行访问。这样可以实现权限更细化的管控,Seliunx就是属于MAC中的一种
二,策略文件
在Android中,Seliunx的策略文件是te文件,比如app_zygote.te。语句示例如下
allow platform_app system_file:dir r_dir_perms;
从字面意思也很好理解,就是允许platform_app 对 mnt_media_rw_file的dir 具有r_dir_perms的权限。可以看出,这里对主体(platform_app )访问客体(system_file)的子项(比如文件夹)的某项权限都进行了精确的规定
三,安全上下文
上面的 platform_app/system_file分别都代表什么呢?这就要引入安全上下文(Security Contex),通俗讲就是标签。
对于主体,一般来说是进程,可以通过ps -Z 来查看
u:r:platform_app:s0:c512,c768 u0_a17 757 232 1091840 145720 SyS_epoll_ b3b997a4 S com.android.systemui
u:r:platform_app:s0:c512,c768 u0_a6 1209 232 996084 58340 SyS_epoll_ b3b997a4 S android.ext.services
u:r:platform_app:s0:c512,c768 u0_a8 1539 232 997912 59768 SyS_epoll_ b3b997a4 S com.android.managedprovisioning
u:r:platform_app:s0:c512,c768 u0_a49 1595 232 1013920 76988 SyS_epoll_ b3b997a4 S com.xiaojia.powertimer
u:r:platform_app:s0:c512,c768 u0_a49 1867 1595 3556 1620 sigsuspend ad1edaec S sh
u:r:platform_app:s0:c512,c768 u0_a49 1869 1867 4012 1676 __skb_recv b16729d8 S logcat
可以看出很多系统APP都被打上了这个标签,即安全上下文都是platform_app。
对于客体,可以通过 ls -Z 来查看
u:object_r:system_file:s0 system
u:object_r:system_file:s0 vendor
可以看出 system目录和vendor目录都被打上了system_file的标签,即安全上下文是system_file。
四,安全服务
上面命令查看的都是系统起来之后的,主体和客体已经和安全上下文进行了关联。实际上安全上下文是写在一个文件中的,如file_context。将主体和客体和安全上下文进行关联(意思就是打上标签),这项工作是安全服务来做的。常见的安全服务有:init,zygote 和PMS。
五,Seliunx 常见的命令
setenforce:临时关闭或者打开安全策略
getenforce:获取当前安全策略
chcon: 临时修改安全上下文
restorecon:恢复默认
getprop -Z : 查看属性的安全上下文
load_policy : 加载二进制策略文件,临时性的操作,重启无效, 一般用于调试,如重新编译了策略文件, 替换新的策略二进制文件, 可以重新让系统加载策略文件
总结
Seliunx 用户空间的框架由安全服务、安全上下文、安全策略组成。这里说的是用户空间,是因为Seliunx的权限检查还是由内核完成的。用户空间将上下文和策略写给内核,内核来完成检查。最后附上罗大神的框架图
用户空间可以通过libseliunx库和内核进行交互。 内核提供给上层的设备节点在sys/fs/seliunx/ 目录下。