首页 > 编程笔记 > Linux笔记 阅读:1

SELinux是什么(非常详细)

SELinux 是 Security Enhanced Linux 的缩写,也就是安全强化的 Linux 系统。

SELinux 是由美国国家安全局(NSA)开发的,用于解决原先 Linux 中自主访问控制(Discretionary Access Control,DAC)系统中的各种权限问题(如 root 权限过高等)。

在传统的自主访问控制系统中,Linux 的默认权限是对文件或目录的所有者、所属组和其他人的读、写和执行权限进行控制。而在 SELinux 中采用的是强制访问控制(Mandatory Access Control,MAC)系统,也就是控制一个进程对具体文件系统中的文件或目录是否拥有访问权限。当然,判断进程是否可以访问文件或目录的依据是在 SELinux 中设定的较多策略规则。

说到这里,我们需要介绍一下这两个访问控制系统的特点:
1) 自主访问控制系统是 Linux 的默认访问控制方式,也就是根据用户的身份和该身份对文件及目录的 rwx 权限来判断是否可以访问。不过,在自主访问控制系统的实际使用中,我们也发现了一些问题:

2) 强制访问控制系统则通过 SELinux 的默认策略规则来控制特定的进程对系统的文件资源的访问。也就是说,即使你是 root 用户,当你访问文件资源时,如果使用了不正确的进程,那么也是不能访问这个文件资源的。

这样一来,SELinux 控制的就不再是用户及权限,而是进程。不过 Linux 的默认权限还是有作用的,也就是说,一个用户要想能够访问一个文件,既要求这个用户的进程符合 SELinux 的规定,也要求这个用户的权限符合 rwx 权限。

每个进程能够访问哪个文件资源,以及每个文件资源可以被哪些进程访问,都靠 SELinux 的规则策略来确定。不过,系统中有许多进程,也有许多文件,如果手工进行分配和指定,那么工作量过大。因此,SELinux 提供了很多的默认策略规则,这些策略规则已经设定得比较完善,稍后再来学习如何查看和管理这些策略规则。

举个例子,假设在 Apache 服务上发现了一个漏洞,使某个远程用户可以访问系统的敏感文件,如 /etc/shadow。如果在 Linux 系统中启用了 SELinux,那么,因为 Apache 服务的进程并不具备访问 /etc/shadow 的权限,所以这个远程用户通过 Apache 服务访问 /etc/shadow 文件就会被 SELinux 所阻挡,起到保护 Linux 系统的作用。

SELinux的运行模式

其实,上面说了这么多的概念,归根结底就是说 SELinux 更加安全。不过,SELinux 是如何运行的呢?

在解释 SELinux 的运行模式之前,先来解释几个概念:
1) 主体(Subject):就是想要访问文件或目录资源的进程。要想得到资源,基本流程是这样的:由用户调用命令,由命令产生进程,由进程访问文件或目录资源。在自主访问控制系统中(Linux 默认权限中),靠权限控制的主体是用户;而在强制访问控制系统中(SELinux 中),靠策略规则控制的主体是进程。

2) 目标(Object):这个概念比较明确,就是需要访问的文件或目录资源。

3) 策略(Policy):Linux 系统中进程与文件的数量庞大,那么限制进程是否可以访问文件的 SELinux 规则就更加烦琐,如果每个规则都需要管理员手工设定,那么 SELinux 的可用性就会变得极低。

还好我们不用手工定义规则,SELinux 默认定义了两个策略,规则都已经在这两个策略中写好了,只要调用策略就可以正常使用了。这两个默认策略如下:
targeted:这是 SELinux 的默认策略,这个策略主要是限制网络服务的,对本机系统的限制极少。我们使用这个策略就已经足够了。
mls:多级安全保护策略,这个策略限制得更为严格。

4) 安全上下文(Security Context):每个进程、文件和目录都有自己的安全上下文,进程具体是否能够访问文件或目录,要看这个安全上下文是否匹配。

如果进程的安全上下文和文件或目录的安全上下文能够匹配,该进程就可以访问这个文件或目录。当然,判断进程的安全上下文和文件或目录的安全上下文是否匹配,需要依靠策略中的规则。

我们画一张示意图来表示这几个概念之间的关系,如下图所示:


图 1 SELinux运行模式的相关概念

解释一下这张示意图。当主体想要访问目标时,如果系统中启动了 SELinux,那么主体的访问请求需要先和 SELinux 中定义好的策略进行匹配。如果进程符合策略中定义好的规则,就允许访问,这时进程的安全上下文就可以和目标的安全上下文进行匹配:
我们在进行 SELinux 管理的时候,一般只会修改文件或目录的安全上下文,使其和访问进程的安全上下文匹配或不匹配,用来控制进程是否可以访问文件或目录资源;而很少会修改策略中的具体规则,因为规则实在太多了,修改起来过于复杂。不过,我们可以人为定义规则是否生效,用以控制规则的启用与关闭。

相关文章