理解Linux下的SELinux
长久以来,每当遇到授权问题或者新安装的主机,我的第一反应是通过setenforce 0命令禁用SELinux,来减少产生的权限问题,但是这并不是一个良好的习惯。这篇文章尝试对SELinux的基本概念和用法进行简单介绍,并且提供一些更深入的资料。
Linux下默认的接入控制是DAC,其特点是资源的拥有者可以对他进行任何操作(读、写、执行)。当一个进程准备操作资源时,Linux内核会比较进程和资源的UID和GID,如果权限允许,就可以进行相应的操作。此种方式往往会带来一些问题,如果一个进程是以root的身份运行,也就意味着他能够对系统的任何资源进行操作,而且不被限制。 假如我们的软件存在漏洞呢?这个往往是一个灾难性的问题。因此,就引出了另外的一种安全接入控制机制MAC,Linux下的一种现实是SELinux,也就是我们将要讨论的内容。
基本概念
Mandatory Access Control (MAC)
SELinux 属于MAC的具体实现,增强了Linux系统的安全性。MAC机制的特点在于,资源的拥有者,并不能决定谁可以接入到资源。具体决定是否可以接入到资源,是基于安全策略。而安全策略则是有一系列的接入规则组成,并仅有特定权限的用户有权限操作安全策略。
一个简单的例子,则是一个程序如果要写入某个目录下的文件,在写入之前,一个特定的系统代码,将会依据进程的Context和资源的Context查询安全策略,并且根据安全策略决定是否允许写入文件。
Flask Security Architecture
SELinux的软件设计架构是参照Flask,Flask是一种灵活的操作系统安全架构,并且在Fluke research operating system中得到了实现。Flask的主要特点是把安全策略执行代码和安全策略决策代码,划分成了两个组件。安全策略决策代码在Flask架构中称作Security Server。除了这两个组件以外,另外一个组件Vector Cache(AVC), 主要提供策略决策结果的缓存,以此提高Security Server的性能。其具体执行流程为,安全策略执行代码通过AVC查询Security Server的安全策略决策结果,并将其缓存以备下次使用。