- 首发公号:Rand_cs
前段时间的工作遇到了一些关于 SELinux 的问题,初次接触不熟悉此概念,导致当时配置策略时束手束脚,焦头烂额,为此去系统的学习了下 SELinux 的东西。聊 SELinux 之前,先来看看什么叫做访问控制。
访问控制模型简介
从上图可知,一个访问控制模型包括四个部分:
- Subject,主体:访问的发起者,通常就是进程
- Object,客体:被访问的对象,一般是操作系统所管理的资源,最常见的就是文件
- Rules DB,规则库/策略:定义了主体客体的属性以及主体对客体的访问规则
- RVM:操作系统内实现的验证机制,上述访问控制策略的执行者,在访问操作过程中根据规则库判断当前操作是否合法
DAC 简介
DAC(Discretionary Access Control),自主访问控制机制,名字听着很陌生,但你一定很熟悉,就是 Linux 下那套常见的 ugo、rwx 规则。
DAC 主要思想是用户(UID)作为资源的拥有者,用户可以决定自身资源的所有访问权限,此用户执行的所有程序也默认拥有同样的权限。 DAC 只起到了用户隔离的作用,所有 DAC 机制都有一个共同的弱点,即无法识别自然人与计算机程序之间最基本的区别。如果一个用户被授权允许访问某资源,则意味着此用户执行的所有程序都被授权访问。
However,用户(或者说用户登录的 shell 进程)是可信的绝不等于用户执行的程序(shell fork 出来的子进程)也是可信的。是程序便可能有漏洞,有漏洞便可能被利用,一旦被攻击植入代码,黑客便可以获取该用户在系统上所有的权力。
另外 DAC 对于权力(root,non-root)的划分、权限(r, w, x)的划分都不够细致,粒度过大,不符合最小权限原则。
最小权限原则是指每个程序和系统用户都应该具有完成任务所必需的最小权限集合,在计算机科学以及其它领域中,它要求计算环境中的特定抽象层的每个模块(如进程、用户或者计算机程序等)只能访问当下所必需的信息或者资源
SELinux 简介
为此,便有了 MAC(Mandatory Access Control),强制访问控制机制,而 SELinux(Security-Enhanced Linux)便是其中一种,用于在 Linux 操作系统上提供高度的安全性保护。
SELinux 可以解决 DAC 存在的问题,其最根本的改变在于,资源的拥有者不再决定资源的访问权限,被限制的基本单位从用户变为了进程。
MAC 的基本原理是通过给每个主体(进程)客体(文件等)分配一个安全上下文(安全标签、标签),然后制定策略来限制标签之间的访问,也就限制了主体对客体的访问。这是以一种白名单的方式开放权限,意味着我们需要明确地规定哪些操作是被允许的,而其他所有的操作都将被拒绝。
现在 SELinux 被广泛用于 Android 系统,Android 启动的第二阶段便是初始化 SELinux 子系统。一般的 Linux 发行版没有使能 SELinux,需要安装相关库、策略文件并修改启动参数来使能 SELinux。比如说 ubuntu 并没有使能 SELinux,ubuntu 默认使用另外一种 MAC:Apparmor
SELinux 访问控制示例
此小节简单给出一个 SELinux 的访问控制示例,好亲身感受一下 SELinux 到底是如何限制访问的。SELinux 本身又分了多种访问控制模型,本文作为开篇,先简单介绍其中最常用的一种模型:TE(Type Enforcement) 模型。
假设现在有进程 a、b,有文件 x、y,它们的类型如下所示:
a -- proc_a_t
x -- file_x_t
策略文件如下所示:
allow proc_a_t file_x_t : file read;
// allow subject object : class { perms };
上述语句的意思是:proc_a_t 类型的进程对类型为 file_x_t 的文件有读权限。SELinux 的策略为白名单机制,意思是说,proc_a_t 对于 file_x_t 类型的文件只有读权限,没有其他权限,想要有其他权限,必须额外添加策略
SELinux 策略有专属的语法,上面的 allow 语句便是其中一种,也是用的最多的一条语句,其语法为 allow subject_t object_t : class { perms };
- allow 表示后面的 主体对客体的访问方式为允许
- subject_t 表示主体的类型,比如上述例子中进程的类型:proc_a_t
- object_t 表示客体的类型,比如说上述例子中文件的类型:file_x_t
- class 表示客体类别,SELinux 中对客体进行了分类,常见的有文件、目录等
- perms 表示权限集合,在 allow 语句中表示将要授予的权限,不同的客体类别有着不同的权限集合,比如说文件客体有读写权限,目录客体有搜索权限等等
好了,本文就只是先做个简单介绍,后面再继续,有什么问题欢迎来讨论交流。
- 首发公号:Rand_cs