SELinux
SELinux则是由NSA(美国国安局)在Linux社区的帮助下设计的一个针对Linux的安全强化系统。
在LinuxKernel中,SELinux通过LSM(LinuxSecurity Modules)实现.
SELinux是一种基于域-类型(domain-type)模型的强制访问控制(MAC)安全系统。
-
自主访问控制模型(Discretionary Access Control,DAC)、
进程理论上所拥有的权限与运行它的用户权限相同。比如,以root用户启动shell,那么shell就有root用户的权限 -
强制访问控制模型(Mandatory Access Control,MAC).
任何进程想在SELinux系统中干任何事,都必须先在安全策略的配置文件中赋予权限。凡是没有在安全策略中配置的权限,进程就没有该项操作的权限。
SEAndroid
SEAndroid是Google在Android4.4上正式推出的一套以SELinux为核心的系统安全机制。
1)LSM提供了一种通用的安全框架,允许将安全模型以模块方式载入内核,
2)AVC是一个策略缓存,当进程试图访问系统资源的时候,kernel中的安全策略服务将会先在AVC中查找策略,如果没有命中,则会到安全服务器中查找,找到了,则权限被缓存,允许访问,如果没找到,则拒绝访问;
3)SecurityPolicy描述系统资源的安全访问策略,系统启动时init进程负责把策略文件加载到内核的LSM模块中;
4)SecurityContext描述系统资源的安全上下文,SELinux的安全访问策略就是在安全上下文的基础上实现的;
5)libselinux为用户空间提供了SELinux文件系统访问接口;
sepolicy中的所有相关文件整合成一个源文件plicy.conf,然后通过checkpolicy 编译器将policy.conf策略源文件编译成root/sepolicy的二进制策略文件,编译完成的二进制策略文件会在系统启动时被加载到内核中在权限检测时使用
模式切换
SELinux支持Disabled,Permissive,Enforce三种模式;
# getenforce
Enforcing
Disabled,此时SELinux的权限检查机制处于关闭状态;
Permissive模式就是SELinux有效,但是即使你违反了它的安全策略,它让你继续运行,但是会把你违反的内容记录下来。在策略开发的时候非常有用,相当于Debug模式;
Enforce模式就是你违反了安全策略的话,就无法继续操作下去。
# setenforce 0
# getenforce
Permissive
在Eng版本使用setenforce命令,可以在Permissive模式和Enforce模式之间切换。
安全属性
user:role:type[:range]
SELinux中,每种东西都会被赋予一个安全属性,它就是SecurityContext
Security Context是一个字符串,主要由三部分组成。
进程的SContext
ps -Z
u:r:servicemanager:s0 system 134 1 /system/bin/servicemanager
u:r:surfaceflinger:s0 system 135 1 /system/bin/surfaceflinger
u:r:sayeye:s0 system 136 1 /system/bin/sayeye
u:r:zygote:s0 root 137 1 zygote
u:r:shell:s0 shell 138 1 /system/bin/sh
u:r:netd:s0 root 139 1 /system/bin/netd
u:r:init:s0 root 1 0 /init
u:r:kernel:s0