接前一篇文章: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;
11-21 03:46