接前一篇文章:SELinux零知识学习七、SELinux策略语言之客体类别和许可(1)
一、SELinux策略语言之客体类别和许可
2. 在SELinux策略中定义客体类别
SELinux策略中必须包括所有SELinux内核支持的客体类别和许可 的声明 ,以及其它客体管理器 。通常,对于策略开发者而言,其并不关系创建一个全新的客体类别,但要想写出高效的SELinux策略,对客体类别是如何定义的 必须要理解透彻。理解客体类别和许可声明的语法是非常有用的,因为它让我们有机会理解当前使用的策略版本中支持的客体类别和许可。
添加新的客体类别和许可
添加新的客体类别和修改现有客体类别的许可是一项复杂的任务,仅当修改真实系统代码本身时应该这样做,与SELinux策略语言的其它方面不同 ,客体类别和许可依赖于Linux的实现细节 ,特别是内核。实际上,客体类别和许可被设计为尽可能准确地代表系统执行的资源,正是由于这个原因,改变客体类别或在系统中改变相应的许可才变得有意义。
保证客体类别和许可中类型改变的一个实例是一种新形势的进程间通信(IPC),在这个例子中,一个全新范畴的资源被添加,一个新的客体类别也将会是必须的,它准确地代表了这个资源的语义。
添加或修改客体类别或许可 需要同时修改策略 和基于新的客体类别或许可的强制访问控制系统代码 。如果只添加了一个客体类别 ,但没有修改系统代码 ,除了浪费核心内存外,可能没有什么作用。
基本上,除了SELinux策略编者和系统管理员外,其他人应该永远都不会改变客体类别和许可的定义。
(1)声明客体类别
客体类别 是使用声明语句声明 的,类别声明语句只是简单地声明了一个客体类别名字,无其它内容了。例如:我们使用下面的指令为目录声明了一个客体类别(名叫dir)。
cpp
class dir
类别声明语句是由关键词class后跟类别名字组成的。注意类别声明语句与其它策略语言的区别,在声明语句的末尾是没有分号的 。客体类别名字具有独立的命名空间,但实际编写策略时,客体类别、许可、类型等通常都是使用的相同的名字。
客体类别声明语法
客体类别声明语句允许你声明客体类别名字,完整的类别声明语句语法如下:
class 类别名字
- 类别名(字)
客体类别的标识符,其长度不定,可以包括ASCII字母或数字。
类别声明只在一个策略 和基础载入模块中有效 ,在有条件限制的语句 和非基础载入模块中 都是无效的。