SEAndroid是Security Enhancement for Android的简称,这是将SElinux一直到Android的项目,这是它的官方网站http://seandroid.bitbucket.org/
SELinux的全称是security enhancement for Linux的,它是美国国安局在Linux社区的帮助下开发的一种强制访问控制体系(MAC),在这种体系的控制下,进程只能访问那些规定可以访问的文件和资源。
DAC:自主访问控制机制,Linux传统的安全机制,主要对各分组权限访问进行控制,分为用户,同组用户,其他用户三组,只能控制这三组的读写和执行权限。
MAC:强势访问控制机制,它将系统中的资源分为密级和类别进行控制,只有明确授权可以访问的资源,用户才能够访问。
MAC的两个重要概念:主体和客体。主体,主要指用户或用户运行的进程;客体,主要包括系统的文件,目录,socket等资源。但是,当进程1被进程2访问时,进程2是主体,进程1是客体。
在MAC机制中,主体和客体都被设置了安全上下文,配合系统中存在的安全规则库使用。
早期的SELinux是以Linux系统补丁集的方式实现的,他实现了自己的一套安全框架,后来随着Linux内核的发展,开发出了一套通用的安全框架LSM(Linux security module),它将安全策略和实现分离出来,允许安全模块载入内核中,从而更加严格的控制安全性。通常用户进程在访问系统资源前都会进行DAC检查,在DAC检查之后,调用LSM提供的钩子函数进行更严格的权限检查。
SELinux主要有三部分组成:
安全上下文的格式:
USER:ROLE:TYPE[:LEVEL]
其主要有四部分组成,第四项为可选项。
在安全上下文中,最重要的定义是TYPE,无论是主体或客体的类型,都是通过policy文件type语句定义的类型,type语法如下:
type 类型名称 [,属性]
type语法中的属性值都是预定义好的,有特别的含义。如domain表示域,通常主体的type具有domain属性,因此我们也把主体的type成为domain。fs_type表示文件,通常用于客体的类型表示中,SELinux定义的类型在system/sepolicy/attribute文件中。
除了安全上下文之外,SELinux还定义了主体对客体访问规则,这种访问规则一般存放在te文件中。目前SELinux策略语言支持4种类型的访问规则:
访问规则语法:
allow source_type target_type:class Permission
许可(permission):主体可以对客体执行的操作的种类,SELinux定义的许可种类可以参考system/sepolicy/access_vectors
SELinux的安全策略的实现是通过比较安全上下文中定义的类型来完成的,这种方式称为类型强制,是非常细粒度的权限管理方式。SELinux还提供了一种角色访问控制(RBAC),这是一种简化的权限管理方式,系统中先创建不同的角色,角色间拥有不同的权限,通过为用户指定不同的角色来赋予不同的权限。但是这种权限管理方式还没有应用到android,有需要的可以深入了解一下。
setenforce:切换系统enforcing状态和permissive状态,如setenforce 0表示系统切入permissive状态
getenforce:获取系统enforcing状态和permissive状态
id:显示当前用户的uid,gid和安全上下文
chcon:改变文件或目录的安全上下文
restorecon:恢复系统原始的安全上下文设置
SEAndroid主要有两部分构成:
1.system/sepolicy/roles
角色定义文件,SEAndroid中之定义了r。
2.system/sepolicy/users
用户定义文件,SEAndroid中之定义了u。
3.system/sepolicy/attributes
属性定义文件,SELinux中已经提到。
4.system/sepolicy/security_classes
class定义文件,定义客体的类别。
5.system/sepolicy/access_vectors
操作种类定义文件,定义了主体对客体的所有操作种类。
6.system/sepolicy/*.te
类型强制规则定义文件。
7.system/sepolicy/te_macros
定义了te文件中的各种宏。
8.system/sepolicy/file_contexts
系统中所有文件的安全上下文。
9.system/sepolicy/property_contexts
系统中所有属性的安全上下文。