当前位置: 首页 > 工具软件 > SE Android > 使用案例 >

SEAndroid使用

钮刚洁
2023-12-01

SEAndroid是Security Enhancement for Android的简称,这是将SElinux一直到Android的项目,这是它的官方网站http://seandroid.bitbucket.org/

1 SELinux

SELinux的全称是security enhancement for Linux的,它是美国国安局在Linux社区的帮助下开发的一种强制访问控制体系(MAC),在这种体系的控制下,进程只能访问那些规定可以访问的文件和资源。

1.1 安全机制

DAC:自主访问控制机制,Linux传统的安全机制,主要对各分组权限访问进行控制,分为用户,同组用户,其他用户三组,只能控制这三组的读写和执行权限。
MAC:强势访问控制机制,它将系统中的资源分为密级和类别进行控制,只有明确授权可以访问的资源,用户才能够访问。
MAC的两个重要概念:主体和客体。主体,主要指用户或用户运行的进程;客体,主要包括系统的文件,目录,socket等资源。但是,当进程1被进程2访问时,进程2是主体,进程1是客体。
在MAC机制中,主体和客体都被设置了安全上下文,配合系统中存在的安全规则库使用。

1.2LSM框架

早期的SELinux是以Linux系统补丁集的方式实现的,他实现了自己的一套安全框架,后来随着Linux内核的发展,开发出了一套通用的安全框架LSM(Linux security module),它将安全策略和实现分离出来,允许安全模块载入内核中,从而更加严格的控制安全性。通常用户进程在访问系统资源前都会进行DAC检查,在DAC检查之后,调用LSM提供的钩子函数进行更严格的权限检查。

Created with Raphaël 2.1.0 用户进程 系统调用 查找节点 错误检查 DAC检查 LSM检查(调用LSM安全模块) 访问节点

1.3 SELinux架构

SELinux主要有三部分组成:

  • SELinux虚拟文件系统:SELinux内核和用户进程间的数据交换接口
  • 安全服务模块:包含SELinux的安全策略,它根据区安全策略生成访问规则,其访问规则保存在访问向量缓存中,以提高速度
  • 访问向量缓存:缓存之前的访问规则,以提高性能,如果客体的请求没有在缓存中找到,则会把请求递交到安全服务模块中,有安全服务模块响应请求,并更新缓存。

1.4 安全上下文

安全上下文的格式:
USER:ROLE:TYPE[:LEVEL]
其主要有四部分组成,第四项为可选项。

  • USER:指定用户,常用的3种用户类型,user_u(普通用户,限制权限),system_u(系统级别进程),root(root用户)
  • ROLE:指定角色,不同的角色有不同的权限。文件,目录,socket等客体角色通常是object_r,主体进程的角色通常是r。一个用户通常有多个角色,但同一时间只能使用一个。
  • TYPE:定义客体和主体所属类型。对于进程而言,他的类型也成为domain。类型是安全上下文最重要的内容,后续会深入介绍。
  • LEVEL:定义安全等级,只用于mls策略中,可能值是s0-s15。

在安全上下文中,最重要的定义是TYPE,无论是主体或客体的类型,都是通过policy文件type语句定义的类型,type语法如下:

type 类型名称 [,属性]

type语法中的属性值都是预定义好的,有特别的含义。如domain表示域,通常主体的type具有domain属性,因此我们也把主体的type成为domain。fs_type表示文件,通常用于客体的类型表示中,SELinux定义的类型在system/sepolicy/attribute文件中。

1.5 访问规则

除了安全上下文之外,SELinux还定义了主体对客体访问规则,这种访问规则一般存放在te文件中。目前SELinux策略语言支持4种类型的访问规则:

  • allow:表示允许主体对客体执行指定的操作
  • dontaudit:表示不记录某条违反规则的决策信息
  • auditallow:记录决策信息,通常SELinux只记录失败的决策信息,应用这条规则后也会记录成功的决策信息
  • neverallow:表示不允许主体对客体执行指定的操作

访问规则语法:
allow source_type target_type:class Permission

  • 源类型(source type):通常是某种属性为domain的类型,代表主体
  • 目标类型(target type):允许访问的客体的类型,目标类型可以同时指定多个
  • 客体类别(object class):对客体目标类型进行限制,目标类型可能涵盖file,dir,socket等多个类别,如果将class设置为file,则主体只拥有访问客体file的权限。
  • 许可(permission):主体可以对客体执行的操作的种类,SELinux定义的许可种类可以参考system/sepolicy/access_vectors

    SELinux的安全策略的实现是通过比较安全上下文中定义的类型来完成的,这种方式称为类型强制,是非常细粒度的权限管理方式。SELinux还提供了一种角色访问控制(RBAC),这是一种简化的权限管理方式,系统中先创建不同的角色,角色间拥有不同的权限,通过为用户指定不同的角色来赋予不同的权限。但是这种权限管理方式还没有应用到android,有需要的可以深入了解一下。

    1.6 域转移

    1.7 常用命令

    setenforce:切换系统enforcing状态和permissive状态,如setenforce 0表示系统切入permissive状态
    getenforce:获取系统enforcing状态和permissive状态
    id:显示当前用户的uid,gid和安全上下文
    chcon:改变文件或目录的安全上下文
    restorecon:恢复系统原始的安全上下文设置

2 SEAndroid

2.1 SEAndroid组成

SEAndroid主要有两部分构成:

  • SELinux安全模块:位于kernel/security/selinux下。
  • 用户态工具:用于产生SELinux的策略文件(规则文件),位于system/sepolicy下,这个目录保存了系统初始的规则文件。另外,external/libselinux下存放了libselinux的源码,它提供了帮助用户进程使用SELinux的一些函数。
    在system/sepolicy下有几个很重要的文件:
    • file_contexts:系统中所有文件的安全上下文;
    • property_contexts:系统中所有属性的安全上下文;
    • seapp_contexts:定义用户、seinfo和域之间的关系,用于确定用户进程的安全上下文;
    • sepolicy:二进制文件,保存系统策略,系统初始化时会把它设置到内核中;
      SELinux虚拟文件系统在sys/fs/selinux下,该目录下的文件是SELinux内核和用户进程进行同行的接口。

2.2 策略文件

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
系统中所有属性的安全上下文。

 类似资料: