3.3.1 本地SELinux策略语言编译器
为内核构建一个策略文件最基本的方法就是从源策略文件中使用checkpolicy程序编译他.这个以很多步骤构建的源程序,被命名为”policy.conf”.CheckPolicy检查源策略文件在语法和语义上的正确性,并把结果以一定的形式(被乘坐二进制策略文件)写到文件中,该文件是能够被内核策略加载器(load_policy)读取的.被CheckPolicy所支持的语言语法是被SELinux所支持的本地的,原生的语言.你可以将checkpolicy 语言看做是和汇编语言相似的语言.高级语言和其他更加抽象的方式来创建策略也正在发展,后面将会讨论这种方式.对于现在来说,我们关注的是本地策略语言和用于内核强制执行的策略的构建.
我们来看一下下面这张阐述策略源文件的基本组成部分.
策略源文件的第一部分向安全服务器定义了客体类.这一部分也定义了其他客体类的权限.对于内核来说,这些类是和内核源文件直接相关的.通常来说,作为一个内核策略编写者,你尽量永远不要修改客体类和权限定义.在后面的章节中讨论指定的客体类和他们相关的权限.
下一部分包含了对TE的描述,这一部分是目前位置SELinux策略中最大的一部分.这一部分策略编写者将会花费大量的时间去编写.他包含了所有的标示(类型)声明和TE规则(包含所有的allow,type_transition和其他TE规则).在第五章详细讨论类型和核心的TE规则."Type Enforcement"这一部分通常包含着数以千计的类型声明和数以万计的TE规则.这一部分也会包含一些关于角色和用户的规则和声明.支持TE观念的用户和角色将在第6章中讨论.
策略源文件的下一部分包含了一些限制.约束提供了一种手段,进一步限制了超越TE规则允许的TE策略.举个例子,MLS策略,被实现为一系列的约束.在第七章和第八章讨论限制和MLS.
策略文件的最后一部分包含标签指定(labeling specification).所有的客体都要和安全上下文绑定.这一部分告诉SELinux如何对待对待文件系统,即如何对待在文件系统运行的过程中被创建的被标签标记的文件.一个分离的相关的机制,称为一个文件上下文文件,被用于初始化文件,目录和其他在永久性文件系统上的客体的安全上下文标签.这些和其他于课题标签相关的主题在第十章讨论.
检查policy.conf文件
随着二进制策略文件被checkpolicy创建,你可以使用Tresys apol工具来查看,查找和分析policy.conf文件的内容了.policy.conf文件比二进制文件形式更加抽象,这个文件将会使得策略分析和调试更加方便.同时,policy.conf文件在形式上于源文件是最相近的,因此这个文件也是跟踪源文件中的bug的最好的形式.在任何情况下,这两者都是非常重要的,并且应该反射出相同的安全策略.
3.3.2 在整体策略中的源策略模块
在今天SELinux策略一个常用的类型就是有一个整体策略.这个策略被checkpolicy构建成一个蛋一个二进制策略文件,该策略被直接加载到内核当中.由于SELinux策略通常是非常巨大和复杂的,例如软件,所以他们被构建成称为模块的小单元.有很多种方式来构建策略模块.最原始的也是最常用的方式称为源模块,支持整体策略的开发.源模块通过脚本,m4宏和Makefile文件与文本文件相结合,共同创建一个更加高级的语言.策略模块联系在一块变成一个单一的大型源文件(也就是policy.conf),然后被checkpolicy编译到一个能够被内核读取的二进制文件中.
3.3.3 可加载策略模块
创建一个模块策略的一个新的方法被称为可加载模块,该方法使用checkpolicy最近的扩展和一个模块编译器(checkmodule)来构建可加载策略模块,这些模块被单独编译.可加载模块也是策略服务器的基础.在科技在模块例子中,不再构建成一个整体二进制策略,相对应的是,一个策略的核心子集被构建,称为基本模块.你创建基础模块更像你创建整体策略.伴随着可加载模块,你可以组织基本模块,仅仅包含与核心操作系统相关的规则.策略的其他部分以分离的可加载模块被创建.当你安装他们相关的软件包的时候,你可以以模块化的方式来谈价其他所有的策略规则.
可加载模块引起了策略语法的改变,该语法被设计来将策略分离开来成为可分配的策略模块.这些改变和基础和费基础模块是不一样的.基础模块使用的是和整体策略语言一样的策略语言,仅仅是有一点点小小的附加.非基础模块(也就是可加载模块)使用了带有很多附加语言特征的标准策略语言的子集.这些策略语言的子集包含了很多TE,规则和用户描述.附加的语言特征被用来管理模块之间的以来.在后面讲解在可加载模块中语言的改变.
Fedora Core5(FC5)已经为未来版本采用了可加载模块的基础特征.在这本书中,我们只讨论整体策略方法及其但是在侧边栏中我们会讨论最新的可加载模块的特征.
3.3.4 构建和安装整体策略
当你阅读完这本书的剩余部分之后,你将很有可能会实验一下SELinux策略的编写.你将需要将你的修改编译进整体策略文件中,并且通过将新的策略加载到内核中来测试一下你的修改,并且在内核的访问控制强制下测试一下结果.在你做这些尝试之前,我们必须要先介绍一个构建和安装内核安全策略的基本方法.
技巧:
一定要记住,如果你要安装你的策略,内核就会基于策略中的规则立即开始强制访问.当拟正在学习SELinux和测试语言的时候,由于缺乏访问,你可能会导致程序崩溃.我们建议你在测试自己编写的策略的时候使用permissive模式(setenforce 0),直到你对策略语言以及其后果相当熟悉之后在改变模式.当然,你也可以一直以enforcing模式运行系统(setenforce 1).
下面的例子就是构建策略的一个典型的方法
从这张图片的左面开始,你有一个被分解成很多个源模块的策略文件.在后面这本书中,我们将会讨论各种各样的组织这些模块的方式.就现在来说,仅仅知道这些文件是通过脚本,宏处理器等将这些文件合并成了一个单一的策略文件policy.conf就行了,该文件是一个SELinux源策略的完整的,语法正确的描述.然后你使用checkpolicy将源策略编译成对内核合适的二进制策略文件(假设没有错误).然后load_policy程序被调用来将二进制策略文件加载到内核中,然后内核基于策略规则进行强制访问控制.
在这本书的这个地方,你可能会发现这个过程是非常让人迷惑的,特别是在我们讨论策略构建的方法而不是源模块来构建策略的时候.不要惊慌,我们仅仅是想要你对这个过程有一个整体的了解.策略源目录通常会有一个Makefile文件来为你自动构建这个过程.在策略中,我们使用的策略在part 2,如果安装成功之后应该在/ec/selinux/strict/src/policy/中,下面是一些有趣的make目标.
policy : 使得policy.conf和policy.[ver]本地测试编译和检查错误
install: 做一切可以是策略安装到系统中的一切事情,例如在内核启动阶段加载进入内核和策略配置文件等等
load: 做一些可以使二进制策略文件加载到内核中的事情,例如激活访问控制策略和安装file_context文件.
所以,可以安装上面图中的方式来构建策略(除了最后的安装和加载策略那一步).