安全增强型 Linux(Security-Enhanced Linux)简称 SELinux,它是 Linux 的一个安全子系统。SELinux 主要作用是最大限度地减小系统中服务进程可访问的资源(最小权限原则)。对资源的访问控制分为两类: DAC和MAC.
在未使用SELinux的系统上, 对资源的访问是通过权限位来确定, 比如一个文件对所属用户是否有读、写、执行权限, 其他用户的访问可由所属用户进行配置. 这种由所属用户自己决定是否将资源的访问权或部分访问权授予其他用户,这种控制方式是自主的,即自主访问控制(Discretionary Access Control, DAC).
> ls -l note
-rw-rw-r-- 1 ifantsai ifantsai 37 6月 17 13:36 note
在使用了 SELinux 的系统上,对资源的访问除了通过权限位判定外,还需要判断每一类进程是否拥有对某一类资源的访问权限。这种方式对资源的访问控制, 称之为强制访问控制(Mandatory Access Control, MAC).只给每个进程开放所需要的资源, 将权限开放到最小, 当进程出现漏洞时也只会影响到该进程所涉及的资源, 这大大提升了安全性.
SELinux 有三种工作模式,分别为:
通过执行getenforce
命令可以获取当前SELinux的工作模式
在Android系统开发中, 可能会遇到SELinux的权限不足而引起的各种问题. 可以尝试将SELinux工作模式临时改为宽容模式看问题是否解决, 来判定是否是SELinux引起的问题.
# 修改工作模式为宽容模式
setenforce permissive
(adsbygoogle=window.adsbygoogle||[]).push({})
遇到权限问题时, 在log中会打印avc denied提示缺少什么权限, 可以通过dmesg | grep avc
过滤出所有avc denied.
笔者在RK Android9.0上进行操作, 权限文件以.te
为后缀, 涉及到需要修改的路径:
android/device/rockchip/common/sepolicy
android/device/rockchip/rk3399/sepolicy
Android自带的进程服务通过以上目录配置即可 , 自己添加的第三方进程需要添加到自定义的目录下
以如下所示的avc denied为例讲解
# avc: denied { 操作权限 } for pid=7201 comm=“进程名” scontext=u:r:源类型:s0 tcontext=u:r:目标类型:s0 tclass=访问类别 permissive=0
avc: denied { read } for pid=7517 comm="audio@2.0-servi" name="u:object_r:default_prop:s0" dev="tmpfs" ino=11426 scontext=u:r:hal_audio_default:s0 tcontext=u:object_r:default_prop:s0 tclass=file permissive=0
主要关注以下内容:
denied {read}
: 表示缺少read权限scontext=u:r:hal_audio_default:s0
: 表示hal_audio_default缺少了权限tcontext=u:object_r:default_prop:s0
: 表示是对default_prop缺少了权限tclass=file
: 表示缺少权限的资源类型为file因此只要在hal_audio_default.te文件中加入下面内容即可xia
allow hal_audio_default tcontext:file read;
如果需要赋予read, open权限, 当有多个权限时用{}
包裹
allow hal_audio_default tcontext:file { read open };
或者参考android/system/sepolicy/public/global_macros
中赋予一个复合权限, 如r_file_perms
表示{ getattr open read ioctl lock map }
以上内容都是基于Android中自带的进程服务进行配置, 如果是自己引入的进程服务, 则需要自行创建.te
文件, 这部分内容后续再来填坑QAQ
本文作者: Ifan Tsai (菜菜)
本文链接: https://cloud.tencent.com/developer/article/2164595
版权声明: 本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!