列文章转如下链接:
Android Display Graphics系列文章-汇总
Android实战经验篇-系列文章汇总
本文主要包括部分:
一、Selinux概述
1.1 SELinux是什么?
1.2 自主访问控制(DAC)
1.3 强制访问控制(MAC)
1.4 SELinux 的工作原理
1.5 SELinux 标签和类型强制访问控制
1.6 Selinux policy language
1.7 Selinux for Android
二、Selinux 修改
2.1 问题解决
2.1.1 SElinux问题分析
2.1.2 增加缺失权限
2.1.3 MLS问题
2.1.4 neverallow问题
2.2 修改验证
2.2.1 Android源码修改验证
2.2.2 设备端修改验证
三、小结
一、Selinux概述
1.1 SELinux是什么?
安全增强型 Linux(SELinux)是一种采用安全架构的 Linux® 系统,它能够让管理员更好地管控哪些人可以访问系统。它最初是作为 Linux 内核的一系列补丁,由美国国家安全局(NSA)利用 Linux 安全模块(LSM)开发而成。
SELinux 于 2000 年发布到开源社区,并于 2003 年集成到上游 Linux 内核中。
1.2 自主访问控制(DAC)
基于Linux内核的衍生操作系统中,全都符合“一切皆文件”的理念。也就是对用户来说,系统的硬件资源(磁盘、内存、网络等)和软件资源都是以一种可访问甚至可编辑修改的方式提供的。这样给使用者带来了极大的便利,但却给计算机带来了很多安全问题。例如,恶意进程会不会强制把其它进程kill掉?会不会在不征求使用者同意的情况下,修改或删除其磁盘的数据?
显然为了控制这种恶意操作或资源管控,需要一种资源管理机制。目前Linux上的资源管理机制是自主访问控制DAC,全称是 Discretionary Access Control。是TCSEC 定义的访问控制中的一种类型。DAC根据主体(如用户、进程或 I/O 设备等)的身份和他所属的组限制对对象的访问。所谓的自主,是因为拥有访问权限的主体,可以直接(或间接)地将访问权限赋予其他主体(除非受到强制访问控制的限制)。
DAC模型是指对象(比如程序、文件、进程)的拥有者可以任意修改或者授予此对象相应的权限,也就是UGO+RWX/ACL权限控制。
权限有三个要素:主体(subject)、对象(object)、策略(policy),用于表示主体对哪个对象拥有什么访问策略,例如:用户小明对\opt\work文件夹拥有读访问策略。
1.2.1 文件的UGO+RWX权限控制
UGO是User(用户)、Group(用户所属组)和Other(其他用户)的简称:
User是文件的所有者(属主),一般是创建文件的用户,对该文件具有完全的权限。只有文件的属主和超级用户root 有修改文件的权限。
Group是文件所属用户组对文件的访问权限(属组)。项目协作中,需要不同开发者(User)相互查看和修改本项目的文件,此时就用到组(Group)的概念的。可以创建一个用户组(Group),把相应开发者(User)添加到这个组(Group)中。在设置文件的访问权限时,允许这个组(Group)中的开发者(User)对项目文件进行读取和修改。
Other是除了User、Group之外,其他用户对该文件的访问权限。也就是不适合放到项目组(Group)中的用户(User),这时候就属于Other。单独设置Other权限就可以有效控制组(Group)外人员的访问。
RWX
RWX则是Read(读)、Write(写)、eXecute(执行)的简称:
每个文件或目录的访问权限都有三组,每组用三位表示,分别为文件属主的读、写和执行三种权限。用命令 ls -l 查看详细信息,最左边一列为文件的访问权限。例如:
$ ls -altotal 2102drwxr-xr-x 1 user 197121 0 Jan 21 17:25 ./drwxr-xr-x 1 user 197121 0 Jan 13 15:49 ../drwxr-xr-x 1 user 197121 0 Jan 21 18:05 .git/drwxr-xr-x 1 user 197121 0 Jan 21 17:25 .github/-rw-r--r-- 1 user 197121 128 Jan 21 17:25 .gitignoredrwxr-xr-x 1 user 197121 0 Jan 21 17:35 .gradle/drwxr-xr-x 1 user 197121 0 Jan 21 17:23 .idea/-rw-r--r-- 1 user 197121 6810 Jan 21 17:25 FAQ.md-rw-r--r-- 1 user 197121 11591 Jan 21 17:25 LICENSE-rw-r--r-- 1 user 197121 6725 Jan 21 17:25 README.mddrwxr-xr-x 1 user 197121 0 Jan 21 17:25 app/
权限列共有 10 个字符,第一个字符为文件类型,后面九个分为三组:第一组为 U(User) ,即文件属主对应的权限;第二组为 G(Group),即同组用户对应的权限;第三组为 O(Others),即其他用户对应的权限。每个字符的意义可用下图描述:
权限列的第一个字符(文件类型),-代表普通文件;l代表链接文件;d代表目录文件。
文件与目录的权限有所区别,如下所示:
权限 | 文件 | 目录 |
R(可读) | 读取文件内容 | 读包含在目录中的文件名称 |
W(可写) | 对文件内容进行编辑 | 可以写信息到目录中,即可以创建、删除文件、移动文件等操作 |
X(可执行) | 作为执行文件执行 | 可以进入目录;可以搜索(能用该目录名称作为路径名去访问它所包含的文件和子目录) |
1.2.2 文件的ACL权限控制
ACL的全称是 Access Control List (访问控制列表) ,一个针对文件/目录的访问控制列表。它在UGO权限管理的基础上为文件系统提供一个额外的、更灵活的权限管理机制。它被设计为UNIX文件权限管理的一个补充。ACL允许你给任何用户或用户组设置任何文件/目录的访问权限。
在UGO+RWX权限中,用户对文件只有三种身份,就是属主、属组和其他人,但是在实际工作中,这三种身份实在是不够用,我们举个例子来看看
根目录中有一个 /project 目录,这是班级的项目目录。班级中的每个学员都可以访问和修改这个目录,老师也需要对这个目录拥有访问和修改权限,其他班级的学员当然不能访问这个目录。需要怎么规划这个目录的权限呢?应该这样:老师使用 root 用户,作为这个目录的属主,权限为 rwx;班级所有的学员都加入 tgroup 组,使 tgroup 组作为 /project 目录的属组,权限是 rwx;其他人的权限设定为 0。这样这个目录的权限就可以符合我们的项目开发要求了。
有一天,班里来了一位试听的学员 st,她必须能够访问 /project 目录,所以必须对这个目录拥有 r 和 x 权限;但是她又没有学习过以前的课程,所以不能赋予她 w 权限,怕她改错了目录中的内容,所以学员 st 的权限就是 r-x。可是如何分配她的身份呢?变为属主?当然不行,要不 root 该放哪里?加入 tgroup 组?也不行,因为 tgroup 组的权限是 rwx,而我们要求学员 st 的权限是 r-x。如果把其他人的权限改为 r-x 呢?这样一来,其他班级的所有学员都可以访问 /project 目录了。
当出现这种情况时,普通权限中的三种身份就不够用了。ACL 权限就是为了解决这个问题的。在使用 ACL 权限给用户 st 陚予权限时,st 既不是 /project 目录的属主,也不是属组,仅仅赋予用户 st 针对此目录的 r-x 权限。这有些类似于 Windows 系统中分配权限的方式,单独指定用户并单独分配权限,这样就解决了用户身份不足的问题。
如下图,user是test,group是test,去写一个root权限的readme.txt文件,就是没权限的。
DAC 的管控颗粒度太大,没法精确控制到某个进程。
1.3 强制访问控制(MAC)
MAC就是为了解决了DAC权限控制颗粒度太大的问题。在SELinux 这样的 MAC 系统上,访问权限有相应的管理设置策略。即使主目录上的 DAC 设置发生更改,SELinux 策略也会阻止其他用户或进程访问目录,从而保证系统的安全。
借助 SELinux 策略,可以设置具体规则。任何进程做任何事情,都需先在安全策略配置文件中赋予权限。也就是说,不在安全策略配置文件中配置的权限,进程就没有该权限。即使你是root,也不一定拥有权限操作。
1.4 SELinux 的工作原理
SELinux 用于定义对系统上应用、进程和文件的访问控制。利用安全策略(一组规则,用于告知 SELinux 可以或不能访问哪些内容)来强制执行策略所允许的访问。
当应用或进程(称为主体)发出访问对象(如文件)的请求时,SELinux 会检查访问向量缓存(AVC),其中缓存有主体和对象的访问权限。如下例子:
进程和文件都被打上了安全上下文(Context),user在写入script的时候,除了要拥有写权限,同时还要在规则库中声明权限,这样才能正常写入。
如果拒绝授予权限,Linux会在/var/log.messages 中将会显示“avc: denied”消息,而android会在logcat或kernel log中显示“avc:denied”。
1.5 SELinux 标签和类型强制访问控制
类型强制访问控制和标签Label是 SELinux 中最为重要的两个概念。
SELinux 可作为标签系统运行,也就是说,系统中的所有文件、进程和端口都具有与之关联的 SELinux 标签。标签可以按照逻辑将目标组合分组。在启动过程中,内核负责管理标签。
标签的格式为 user:role:type:level(level 为可选项)。User、role 和 level 用于更高级的 SELinux 实施中,标签类型对于目标策略而言最为重要。
1.5.1 类型强制
SELinux实现了一个灵活的MAC机制,叫做类型强制TE(Type Enforcement)。SELinux 利用类型强制访问控制来强制执行系统中定义的策略。
TEAC(Type Enforcement Accesc Control)也是的MAC 基本管理单位,而且基于角色的访问控制(RBAC)也是基于 TE 的。 TE 也是 SELinux 中最主要的部分。平时用的 allow 语句就是 TE 的范畴。
在类型强制下,所有主体和客体都有一个”安全上下文“与它们关联,要访问某个客体,主体的类型必须为客体的类型进行授权。
对比SELinux和标准Linux的访问控制属性
标准Linux | 集成SElinux的Linux | |
主体(进程)安全属性 | 真实有效的用户和组ID | 安全上下文 |
客体安全属性 | 访问模式、文件用户户和组ID | 安全上下文 |
访问控制基础 | 进程用户/组ID和文件的访问模式,此访问模式基于文件的用户/组ID | 在进程类型和文件类型之间允许的许可 |
1.5.2 查看安全上下文Context
怎么查看文件和进程的Selinux Context呢?ps 和 ls 都加Z选项。
文件的 Secure Context,使用ls -alZ查看
**************************************************************************************************************
文章全文转免费链接:Android实战经验篇-玩转Selinux(详解版)
**************************************************************************************************************