接前一篇文章:SELinux零知识学习八、SELinux策略语言之客体类别和许可(2)
一、SELinux策略语言之客体类别和许可
2. 在SELinux策略中定义客体类别
(2)声明并连接客体类别许可
声明许可有两种方法,第一种叫做通用许可,它允许我们创建与客体类别一起作为一个组的许可。通用许可在类似的客体类别(如文件和符号链接)共享一套访问许可时很有用;第二种方法叫做特定类别许可,它允许我们单独为客体类别声明特定的许可。正如将会看到的,有一些客体类别只有特定的许可、有一些只有通用许可、还有一些这两者都有。
1)通用许可
通用许可语句允许创建一套与两个或更多客体类别一起构成组的许可。
通用许可语句允许你声明一个通用许可名字,许可可以与客体类别一起组成一个组。通用许可可以与多个客体类别进行联合,完整的通用许可语句语法如下:
common 通用名 {许可集}
- 通用名
通用许可标识符,该标识符长度不限,可以包括ASCII字母、数字、破折号(-)和句号(.)。
- 许可集
在一个独立空间列表中的一个或多个许可标识符,标识符长度不限,可以包括ASCII字母、数字、破折号(-)和句号(.)。
通用许可集与客体类别一起使用访问向量语句。
通用许可集只在单个策略和基础载入模块中有效,在条件语句和非基础载入模块中无效。
举例:
UNIX基本原理“一切皆文件”意味着许多与文件有关的客体类别都有一套通用许可。在SELinux中,通用许可声明这些与文件有关的许可语句如下:
common file
{
ioctl
read
write
create
getattr
setattr
lock
relabelfrom
relabelto
append
unlink
link
rename
execute
swapon
quotaon
mounton
}
以上语句声明了一套叫做file的通用许可集,并定义了一套许可,如ioctl、read、write、create等。通用许可语句本身没什么用,仅当与客体类别联合在一起时才有用。
与客体类别一样,通用许可名字是在它们自己的命名空间中声明的,如果不注意,可能会引起某些混淆。如前面所举的例子,客体类别和通用醋可名都是file。虽然名字是相同的,但事实上在策略中,它们非常明显是不同的组件。
2)联合许可和客体类别
我们使用访问向量语句将许可和客体类别联合起来了。联合许可及之前声明的客体类别的访问向量语句的完整语法如下:
class 类别名 [inherits 通用许可集名] [{许可集}]
- 类别名
前面声明的客体类别名。
- 通用许可集名
前面声明的通用许可集名。
- 许可集
在一个独立空间列表中的一个或多个许可标识符,标识符的长度不受限制,包括ASCII字母、数字、或句号(.)。
最低情况下,至少要指定一个通用许可集名或一个许可集,但这两者是可以同时提供的,最后所得到的许可是联合了通用许可和许可集的并集。
访问向量语句只在单个策略和基础载入模块中有效,在条件语句和非基础载入模块中是无效的。
举例:
使用访问向量语句联合通用和特定类别许可。下面的语句将一个特定类别许可和客体类别dir联合起来了:
class dir { search }
从这个例子看起来,表面上访问向量语句与类别声明语句非常类似,都使用了关键词class。但实际上,类别声明语句与访问向量语句是截然不同的。即使都是以class开头,访问向量语句必须提供一个事先声明的客体类别名(本例中是dir),然后再提供一个或多个许可。在这个例子中,我们只定义了一个特定类别的许可search。注意:这个语句的结尾也是没有分号的。
前例的访问向量语句将使dir客体类别产生一个特定类别的许可search。通常,客体类别的许可应该有多个,如:
class dir { search add_name remove_name }
这个例子将三个特定类别许可与dir客体类别联合到一起了。
在访问向量语句中,也可以使用关键词inherits来联合通用许可。例如:dir客体类别是多个文件类似的客体类别与其它文件类似的客体类别之间共享通用许可的客体链表之一,下面的访问向量语句是dir与通用许可file联合的完整语句。除了前面显示的内容外,还增加了几个与目录有关的特定类别和许可。
class dir
inherits file
{
add_name
remove_name
reparent
search
rmdir
}
在这个例子中,我们使用了关键词inherits,后面跟之前声明的许可集名字,并联合了所有的通用文件许可。这个语句的结果是客体类别dir的有效许可是前面定义的通用许可file,以及5个为dir指定的许可。
只有通用许可的客体类别是可以存在的。如:客体类别符号链接文件(lnk_file)的访问向量语句是:
class lnk_file inherits file
这个语句导致类别lnk_file只有通用许可file中定义的那些许可。
同样,只有特定类别许可的客体类别也是可能的(即没有通用许可)。如:代表文件描述符(fd)的客体类别访问向量语句只有一个特定类别的许可,该许可允许使用一个文件描述符。
class fd { use }