通过对 SELinux 的介绍,初学者可以这样认为,在传统 Linux 系统使用访问控制方式的基础上,附加使用 SELinux 可增强系统安全。 那么,SELinux 是如何运行的呢?
在解释 SELinux 的工作模式之前,先解释几个概念。
我们画一张示意图,来表示一下这几个概念之间的关系,如图 1 所示。
解释一下这张示意图:当主体想要访问目标时,如果系统中启动了 SELinux,则主体的访问请求首先需要和 SELinux 中定义好的策略进行匹配。如果进程符合策略中定义好的规则,则允许访问,这时进程的安全上下文就可以和目标的安全上下文进行匹配;如果比较失败,则拒绝访问,并通过 AVC(Access Vector Cache,访问向量缓存,主要用于记录所有和 SELinux 相关的访问统计信息)生成拒绝访问信息。如果安全上下文匹配,则可以正常访问目标文件。当然,最终是否可以真正地访问到目标文件,还要匹配产生进程(主体)的用户是否对目标文件拥有合理的读、写、执行权限。
我们在进行 SELinux 管理的时候,一般只会修改文件或目录的安全上下文,使其和访问进程的安全上下文匹配或不匹配,用来控制进程是否可以访问文件或目录资源;而很少会去修改策略中的具体规则,因为规则实在太多了,修改起来过于复杂。不过,我们是可以人为定义规则是否生效,用以控制规则的启用与关闭的。
SELinux 提供了 3 种工作模式:Disabled、Permissive 和 Enforcing,而每种模式都为 Linux 系统安全提供了不同的好处。
在 Disable 模式中,SELinux 被关闭,默认的 DAC 访问控制方式被使用。对于那些不需要增强安全性的环境来说,该模式是非常有用的。
例如,若从你的角度看正在运行的应用程序工作正常,但是却产生了大量的 SELinux AVC 拒绝消息,最终可能会填满日志文件,从而导致系统无法使用。在这种情况下,最直接的解决方法就是禁用 SELinux,当然,你也可以在应用程序所访问的文件上设置正确的安全上下文。
需要注意的是,在禁用 SELinux 之前,需要考虑一下是否可能会在系统上再次使用 SELinux,如果决定以后将其设置为 Enforcing 或 Permissive,那么当下次重启系统时,系统将会通过一个自动 SELinux 文件重新进程标记。
关闭 SELinux 的方式也很简单,只需编辑配置文件 /etc/selinux/config,并将文本中 SELINUX= 更改为 SELINUX=disabled 即可,重启系统后,SELinux 就被禁用了。
在 Permissive 模式中,SELinux 被启用,但安全策略规则并没有被强制执行。当安全策略规则应该拒绝访问时,访问仍然被允许。然而,此时会向日志文件发送一条消息,表示该访问应该被拒绝。
SELinux Permissive 模式主要用于以下几种情况:审核当前的 SELinux 策略规则;测试新应用程序,看看将 SELinux 策略规则应用到这些程序时会有什么效果;解决某一特定服务或应用程序在 SELinux 下不再正常工作的故障。
某些情况下,可使用 audit2allow 命令来读取 SELinux 审核日志并生成新的 SELinux 规则,从而有选择性地允许被拒绝的行为,而这也是一种在不禁用 SELinux 的情况下,让应用程序在 Linux 系统上工作的快速方法。
从此模式的名称就可以看出,在 Enforcing 模式中, SELinux 被启动,并强制执行所有的安全策略规则。