接前一篇文章:SELinux零知识学习二十一、SELinux策略语言之类型强制(6)
二、SELinux策略语言之类型强制
3. 访问向量规则
AV规则就是按照对客体类别的访问许可指定具体含义的规则,SELinux策略语言目前支持四类AV规则:
- allow:表示允许主体对客体执行允许的操作。
- neverallow:表示不允许主体对客体执行指定的操作。
- auditallow:表示允许操作并记录访问决策信息。
- dontaudit:表示不记录违反规则的决策信息,且违反规则不影响运行。
(1)通用AV规则语法
虽然这些规则的用途不一样,但它们的基本语法是一样的,每个规则都包含了下面5个元素:
- 规则名称
allow,dontaudit,auditallow和neverallow。
- 源类型
授予访问的类型,通常是进程尝试访问的域类型。
- 目标类型
客体的类型,其被授权可以访问源类型。
- 客体类别
客体的类别。
- 许可
表示主体对客体访问时允许的操作类型(也叫做访问向量)。
3)使用AV规则中的多类型和属性
在AV规则中的源和目标区域,都没有限制类型和属性的数量,相反,可以在源和目标字段处列出多个类型和属性。如果有多个类型或属性时,它们之间是用空格进行分隔,并使用大括号将它们括起来,如:
allow user_t { bin_t sbin_t } : file execute;
在这个规则中,目标是bin_t和sbin_t,在源和目标区域有多个类型或属性时,展开方法同单个属性一样。在前面的例子中,内核包括两个密钥,每个目标类型都有一个。
还可以在源或目标区域混合类型的属性,也可以在这两个位置都使用混合的形式。如:
allow {user_t domain} {bin_t file_type sbin_t} : file execute;
如果明确地列出了类型以及类型具有的属性,这是可以的。既然这样,我们实际上列出了两次类型,内核会自动处理这个冗余,只会处理一个实例规则。
4)特殊类型self
策略语言保留了一个关键字self,其用于AV规则中的目标区域,可以当做一个类型使用。如下面这两条规则是等价的:
# 这两条规则是相等的
allow user_t user_t : process signal;
allow user_t self : process signal;
关键字self说明目标类型使用源类型自身,即目标类型等于源类型。前面的例子中,第二条规则只是用关键字创建了一条规则,表明源类型和目标类型都是user_t。
下面来看一个稍微复杂一点的例子:
allow { user_t staff_t } self : process signal;
在这个例子中,实际上创建了两条规则,每条规则的源类型和目标类型都是相同的,完全等同于下面这两条规则:
allow user_t user_t : process signal;
allow staff_t staff_t : process signal;
注意在使用self时,每个类型都创建了等同的规则。需要指出的是user_t不能访问staff_t,反之亦然。
注意:你可能只会在AV规则的目标区域使用特殊类型self,特别要注意的是不能在AV规则的源区域使用self类型。另外,也不能声明一个类型或属性标识符叫做self。
当AV规则的源类型为属性或一大串类型时,self作为目标类型显得非常有用。例如:假设我们想让每一个域都可以向自己发送信号,那么可以编写如下规则:
allow domain domain : process signal; # 这不是我们真正想要的
尽管这条规则实现了预期的目标(每个域都可以向它自己发送信号),但也将允许每个域类型向其它域类型发送信号,这个非预期的结果可能成为一个安全灾难。通过self关键字,可以确保每个域类型都只能访问它自身,如:
allow domain self : process signal; # 这才是我们真正想要的