3.1. 内核体系结构
SELinux对所有的内核资源都提供了强制访问控制。在他当前的格式下,SELinux是通过LSM框架合并到内核中的。
3.1.1. LSM框架
LSM框架背后的思想是允许安全模块插入到内核中以便能够更好的控制Linux默认的基于身份的任意访问控制安全模式。在内核系统调用逻辑中,LSM提供了一系列的钩子(hooks)。这些钩子通常被放置在标准Linux访问检查之后,在内核调用访问真实资源之前。下面的图阐释了基本的LSM框架。
SELinux作为一个LSM模块被加载到内核当中,并且在访问尝试被允许之前,作为一个附加的访问验证。
LSM框架的一个分支就是只有标准Linux访问检查通过之后,SELinux才会被询问。实际上,在访问控制策略上,这没有消极的影响,因为SELinux的访问控制相比于标准Linux的DAC来说要更严格,并且不会覆盖DAC的决定。然而,LSM框架能够影响被SELinux收集的统计数据。例如,如果你想要使用SELinux的审计数据来观察所有的访问拒绝,要意识到,在大多数情况下,SELinux是不会被询问的,因此如果拒绝是标准Linux安全模式的结果,是不会被SELinux统计的。
LSM框架是全面的,并且钩子是被分散在整个内核中的。每一个LSM钩子都会为一个或多个客体类转换为一个或多个访问权限。理解在SELinux中的客体访问是和理解LSM的钩子大部分相关的。在第四章中,“客体类和权限”,在细节上讨论了客体类和权限。
3.1.2. SELinux LSM模块
SELinux内核体系结构反映了Flask架构,该架构是为微内核环境设计的。Flask架构有三个主要部分,正如下面的图阐述的那样:安全服务器,客体管理器,和访问向量缓存。
Flask的设计在安全策略决定和强制执行函数中造成了很大的区别。策略决策是安全服务器(security server)的工作。安全服务器反射出SELinux的微内核的根,策略决定角色被封装在一个用户空间服务器中。在Linux中,内核客体的安全服务器放置在SELinux LSM模块中。被用于安全服务器的策略是潜入于规则集合中,通过策略管理接口载入。系统和系统之间这些规则可以不同,这就使得SELinux能够满足不同组织的安全目标。该架构如此设计,是的安全服务器能够完全由逻辑替代,该逻辑能够在不改变其他架构的情况下实现一个完整的新的访问控制策略。实际上,
新的安全服务器是不需要的,因为标识符强制策略为几乎任何访问控制安全策略提供了充足的灵活性。
客体管理器是用于对他们所管理的资源强制执行安全服务器的决定。对于内核来说,你可以把客体管理器看作内核子系统,该系统能够创建和管理内核层的客体。内核客体管理器的例子包括文件系统,进程管理,和IPC。在LSM架构中,客体管理器是有LSM的钩子所表现的;这些钩子被分散在整个内核子系统中,并且为访问决定调用SELinux LSM模块。LSM钩子通过允许或拒绝对内核资源的访问来强制执行决策。
SELinux架构的第三个组件就是访问向量缓存(AVC)。AVC缓存由安全服务器制定的决策用于后来的访问检查,为访问验证提供有效的性能提升。AVC还为LSM的钩子和内核客体管理器提供了SELinux的接口。
当一个策略被载入的时候,AVC就无效了,因此要保持缓存的连续性。然而,在策略改变的时候,SELinux并没有完全实现访问撤销。相比标准linux来说,这并不坏,因为在标准linux中,完全没有实现访问撤销。在标准linux中,如果你有一个文件描述符,不管在文件访问模式如何改变,你都可以使用他。在SELinux 中,像文件这样的客体是,对于任何对他尝试的访问都是需要验证的(例如,每一个与策略有关的读系统调用都要被检查,并且不仅仅是打开调用),这样的访问撤销工作的很好。仅仅有一个文件描述符并不意味着对文件的访问被同意了。对于一些资源,例如内存映射文件和连接导向的套接字,仅仅当资源首次被访问的时候,访问才会被验证。在这些情况下,存在的访问是不会被取消的。我们期望,将来会有更加深入的研究来提高SELinux中的访问撤销。