接前一篇文章:SELinux零知识学习二十、SELinux策略语言之类型强制(5)
二、SELinux策略语言之类型强制
3. 访问向量规则
AV规则就是按照对客体类别的访问许可指定具体含义的规则,SELinux策略语言目前支持四类AV规则:
- allow:表示允许主体对客体执行允许的操作。
- neverallow:表示不允许主体对客体执行指定的操作。
- auditallow:表示允许操作并记录访问决策信息。
- dontaudit:表示不记录违反规则的决策信息,且违反规则不影响运行。
(1)通用AV规则语法
虽然这些规则的用途不一样,但它们的基本语法是一样的,每个规则都包含了下面5个元素:
- 规则名称
allow,dontaudit,auditallow和neverallow。
- 源类型
授予访问的类型,通常是进程尝试访问的域类型。
- 目标类型
客体的类型,其被授权可以访问源类型。
- 客体类别
客体的类别。
- 许可
表示主体对客体访问时允许的操作类型(也叫做访问向量)。
2)使用AV规则中的属性
虽然到目前为止看到的AV规则都很简单,但语法支持多种方法列出类型、客体类别和许可,使我们可以灵活地利用,并使规则语句更简单。
在前面的简单样式的规则示例中,直接引用了源类型(user_t)和目标类型(bin_t),这样在源类型或目标类型中要引用多个类型也是很方便的,其中一个方法就是使用属性,在AV规则中能使用类型的地方都可以使用属性。
例如,假设定义了一个属性(exec_type),我们打算将其与所有的普通用户程序(通过域类型user_t标记)都可以执行的文件类型关联,那么我们可以将上面的例子改为引用属性exec_type,而不用再明确地指定类型bin_t了,如:
allow user_t exec_type : file execute;
与前面的例子有点不同,这里的规则没有反映出什么将被内核执行,包括属性的规则将在内核中进行扩展,与属性关联的每个类型都有一个独立的密钥,如果有20个文件类型与exec_type属性关联,内核AVC可能在20个密钥结束,每个都授予对类型为user_t的file客体类别execute访问权。
我们也可以在AV的源类型位置处使用属性,或者干脆在源类型和目标类型处都使用属性。例如:假设我们创建了一个属性(domain),并将所有的域类型(包括user_t)都与其关联,我们想要所有的域类型都可以执行属性为file_type的文件类型,使用一条规则就实现这个目标:
allow domain exec_type : file execute;
为了更好地解释规则扩展的原理,假设我们的策略关联了类型为user_t和staff_t的属性domain,以及文件类型为bin_t、local_bin_t和sbin_t的属性exec_type,那么上面规则的效果就等同于如下这些规则:
allow user_t bin_t : file execute;
allow user_t local_bin_t : file execute;
allow user_t sbin_t : file execute;allow staff_t bin_t : file execute;
allow staff_t local_bin_t : file execute;
allow staff_t sbin_t : file execute;