SELinux零知识学习二十三、SELinux策略语言之类型强制(8)

接前一篇文章:SELinux零知识学习二十二、SELinux策略语言之类型强制(7)

二、SELinux策略语言之类型强制

3. 访问向量规则

AV规则就是按照对客体类别的访问许可指定具体含义的规则,SELinux策略语言目前支持四类AV规则:

  • allow:表示允许主体对客体执行允许的操作。
  • neverallow:表示不允许主体对客体执行指定的操作。
  • auditallow:表示允许操作并记录访问决策信息。
  • dontaudit:表示不记录违反规则的决策信息,且违反规则不影响运行。

1)通用AV规则语法

虽然这些规则的用途不一样,但它们的基本语法是一样的,每个规则都包含了下面5个元素:

  • 规则名称

allow,dontaudit,auditallow和neverallow。

  • 源类型

授予访问的类型,通常是进程尝试访问的域类型。

  • 目标类型

客体的类型,其被授权可以访问源类型。

  • 客体类别

客体的类别。

  • 许可

表示主体对客体访问时允许的操作类型(也叫做访问向量)。
 

5)“非”特殊操作符

AV规则中最后一个类型语法是类型否定,它可以从一个类型列表中将某个类型移除,也可以用于在一个属性中移除某个类型。这通过在要移除的类型名称前面放一个非操作符(-)实现。例如:想让所有的域类型都可以访问所有属性为exec_type的文件,除了sbin_t类型以外,那么编写规则时就可以这样:

allow domain { exec_type -sbin_t } : file execute;

这个规则在展开时就好像属性exec_type没有包括类型sbin_t一样。

类型否定不依赖于顺序,即使要排除的类型位于属性列表的前面。例如下面的语句在语义上与前面的例子是等同的:

allow domain { -sbin_t exec_type } : file execute;

6)在AV规则中指定客体类别和许可

AV规则也可以包括客体类别和许可列表。语法和类型一致,使用空格进行分隔,并用大括号括起来。如:

allow user_t bin_t : { file dir } { read getattr };

这条规则将产生两个密钥,每个客体类别一个,这条规则等同于下面这两条规则:

allow user_t bin_t : file { read getattr };
allow user_t bin_t : dir { read getattr };

注意客体类别被展开了,但每条规则都有相同的许可列表,这意味着列表中的所有许可对所有客体类别都是有效的。有时不得不创建两个有相同的源和目标类型、但客体类别不一样的规则,因为许可列表不是每个类别都有效的。例如:如果查看一下file和dir客体类别的许可,你会发现他们大多数都是相同的,但也有部分是不同的(许可对两者都有效说明是使用了通用许可的结果)。

例如:假设我们想编写一条规则允许对这两个客体类别都能够“read”,下面的规则就是无效得了

# 无效的规则,因为search对于客体类别file是无效的
allow user_t bin_t : { file dir } { read getattr search };

即使read和getattr对于file和dir客体类别都是通用许可,但search许可只对dir客体类别有效,因为给file类别提供一个无效的许可seatrch,checkpolicy不能为其创建密钥,在编译策略时就会报错。唯一的解决方法就是创建两条规则,如:

# 当许可对两个客体类别不是都有效时,需要两条规则
allow user_t bin_t : file { read getattr };
allow user_t bin_t : dir { read getattr search };

你可能感兴趣的:(SELinux,SELinux)