接前一篇文章:SELinux零知识学习十九、SELinux策略语言之类型强制(4)
二、SELinux策略语言之类型强制
3. 访问向量规则
AV规则就是按照对客体类别的访问许可指定具体含义的规则,SELinux策略语言目前支持四类AV规则:
- allow:表示允许主体对客体执行允许的操作。
- neverallow:表示不允许主体对客体执行指定的操作。
- auditallow:表示允许操作并记录访问决策信息。
- dontaudit:表示不记录违反规则的决策信息,且违反规则不影响运行。
(1)通用AV规则语法
虽然这些规则的用途不一样,但它们的基本语法是一样的,每个规则都包含了下面5个元素:
- 规则名称
allow,dontaudit,auditallow和neverallow。
- 源类型
授予访问的类型,通常是进程尝试访问的域类型。
- 目标类型
客体的类型,其被授权可以访问源类型。
- 客体类别
客体的类别。
- 许可
表示主体对客体访问时允许的操作类型(也叫做访问向量)。
一个简单的AV规则有一个源类型、目标类型、客体类别和许可。在前文的allow规则中可以看到许多AV规则,如:
allow user_t bin_t : file execute;
这个allow规则的源类型为user_t、目标类型为bin_t、客体类别为file、许可为execute,这个规则可以解读为:允许user_t执行类型为bin_t的文件。
这4个AV规则语法都一样,只是关键字(规则名称)不同。例如,可以将上面这个例子替换成auditallow规则,只需要替换掉规则名称即可:
auditallow user_t bin_t : file execute
1)AV规则的密钥
在Linux内核中,所有的AV规则都是通过一个组源类型、目标类型和许可进行唯一性标识的,这个三重组成为一个密钥,当作哈希表使用,缓存在策略数据结构中。当一个进程产生了一个访问请求时,SELinux LSM模块被要求允许基于这个密钥进行访问。
那么,如果不止一个规则使用同一密钥(即相同的源类型、目标类型和许可)时,会发生什么状况呢?如下面的规则:
allow user_t bin_t : file execute;
allow user_t bin_t : file read;
类型为user_t的进程对类型为bin_t的文件是可读还是可执行?答案是两者皆可。所有有相同密钥的规则通过checkpolicy进行组合,编译后的策略将只有一条规则,同时具有read和execute许可,它们都会被安全服务器接受。所有的AV都按照这种方式进行累加。
警告:策略中的每个子级AV规则与其上级AV规则具有相同的密钥,并将许可adds进最高级规则编译策略中,不存在removing授予其它角色的许可的概念。因此要当心,尽管你在策略中的某部分编写了良好的规则,但可能在策略的其它地方会授予额外的许可。