接前一篇文章:SELinux零知识学习二十三、SELinux策略语言之类型强制(8)
二、SELinux策略语言之类型强制
3. 访问向量规则
AV规则就是按照对客体类别的访问许可指定具体含义的规则,SELinux策略语言目前支持四类AV规则:
- allow:表示允许主体对客体执行允许的操作。
- neverallow:表示不允许主体对客体执行指定的操作。
- auditallow:表示允许操作并记录访问决策信息。
- dontaudit:表示不记录违反规则的决策信息,且违反规则不影响运行。
1)通用AV规则语法
虽然这些规则的用途不一样,但它们的基本语法是一样的,每个规则都包含了下面5个元素:
- 规则名称
allow,dontaudit,auditallow和neverallow。
- 源类型
授予访问的类型,通常是进程尝试访问的域类型。
- 目标类型
客体的类型,其被授权可以访问源类型。
- 客体类别
客体的类别。
- 许可
表示主体对客体访问时允许的操作类型(也叫做访问向量)。
7)AV规则中的特殊许可操作符
对于列在AV规则中的许可,可以使用两个特殊的操作符。
第一个特殊操作符是通配符(*),通配符包括了客体类别的所有许可:
allow user_t bin_t : { file dir } *;
这条规则扩大后将包括file和dir的所有许可。
通配符语法与列出所有的许可点有些不同。使用通配符时,许可包括每个客体类别的许可,此时不会考虑其中一个许可对另一个客体类别是否有效,这样就可以在规则中使用多个客体类别了,即使这些客体类别有不同的许可。因此,上面这条规则就安全地处理了许可。这里只对dir客体类别有效的规则不会影响到file客体类别。
第二个特殊操作符是求补操作符(~),即除了列出的许可外,其它的许可都包括,如:
allow user_t bin_t : file ~{ write setattr ioctl };
编译时,这条规则允许所有的许可,除了write、setattr和ioctl外。与通配符类似,求补运算操作符也扩大了客体类别的许可列表。
警告:建议正确地使用这些特殊操作符(非,通配符和求补操作符)。过去几年,它们也在不断向前发展,并且也发生了一些变化,checkpolicy版本不同,对这些特殊操作符的使用也不同。
最近对编译器的改进又严格限制了这些操作符的使用,主要的例外是允许在neverallow规则中使用通配符匹配所有类型,但其它TE规则中不能使用。
通用访问向量规则语法
再次回顾一下,完整的AV规则通用语法如下:
规则名称 (源)类型集 (目标)类型集 : 类别集 许可集
- 规则名称
访问向量规则的名称,有效的规则名称是allow、auditallow、auditdeny和neverallow。
- 类型集
一个或多个类型和(或)属性,规则中源和目标类型。规则中源和目标类型有其独立的类型集,多个类型集或属性使用空格进行分隔,并使用大括号将它们括起来,如{bin_t sbin_t}。可以使用(-)来排除类型,如{exec_type -sbin_t}。在目标类型区域也可以使用关键字self,但在源类型区域不能使用。neverallow规则也支持通配符来代表所有的类型,求补运算操作符(~)也表示所有的类型,除了明确列出的之外。
- 类别集
一个或多个客体类别,多个客体类别必须使用大括号括起来,如{file lnk_file}。
- 许可集
一个或多个许可,所有许可对类别集列出的所有客体都要有效,多个许可必须用大括号括起来,如{read create}。通配符(*)指出所有客体类别的所有许可,求补操作符(~)用于指出所有的许可,除了明确列出的之外。
所有AV规则在单个策略、基础载入模块和非基础载入模块中都有效。所有AV规则除了auditdeny、neverallow规则外,其它的在条件语句中也有效。