接前一篇文章:SELinux零知识学习十八、SELinux策略语言之类型强制(3)
二、SELinux策略语言之类型强制
2. 类型、属性和别名
(4)别名
别名是引用类型时的一个备选的名字,能够使用类型名的地方就可以使用别名,包括TE规则、安全上下文和标记语句。别名通常用于策略改变时保持一致性,例如:一个旧策略可能引用了类型netscape_t,更新后的策略可能将类型名改为mozilla_t了,因此同时提供了一个别名netscape_t以保证与旧模块能够正常兼容。
有两种方式 进行别名声明。第一种方式是在使用type语句声明类型的同时就声明别名。因此在type语句中,声明mozilla_t类型时,可以使用关键字alias声明一个别名netscape_t,如:
cpp
type mozilla_t alias netscape_t, domain;
注意:别名声明是放在属性的前面的。
第二种方式是使用typealias语句独立于type语句单独声明别名。下面的语句等同于单条type语句:
cpp
# 下边这两条语句等同于
type mozilla_t, domain;
typealias mozilla_t alias netscape_t;
# 下边这一条语句
type mozilla_t alias netscape_t, domain;
当策略的结构难以在声明类型时同时声明别名的时候,typealias语句很有用。完整的typealias语句语法如下:
typealias 类型名称 alias 别名名称
- 类型名称
要添加别名的类型的名称,类型必须使用type语句单独声明,并且此处只能指定一个类型名称。
- 别名名称
一个或多个别名标识符,其命名约束与类型一样。如果同时指定多个别名,别名之间用空格分开,并使用大括号将所有别名括起来,如{aliasa_t aliasb_t}。
域类型和其他类型
我们在"类型"这个词之前加上其它形容词,如:"文件类型"、"目录类型",这些形容词只是为了描述出类型的用途方向,并没有其它含义,例如文件类型指的是安全上下文中引用的类型与文件有关。事实上,类型也可以用于其它客体类别,在策略语言中对这些类型的用途并没有做限制,SELinux中的所有类型地位相同,都可以用于标记任何客体类别实例,只要授予了适当的访问权。
例如httpd_t域类型可以同时用于进程和文件,再加上一些额外的规则。按照惯例,这在SELinux策略中是要避免出现的,主要是为了使策略更清晰,但在某些情况下,我们需要将同一个类型既用作域类型又要用作文件类型,这完全取决于策略编写者的爱好了。
然而,就域类型而言,出于一些技术上的原因,也最好不要在文件和目录上使用它们。在Linux中,每个进程和文件都会在/proc/文件系统中由内核创建一个,这些客体用于获取和设置这些进程的属性。在SELinux中,进程的类型自动用于这些文件和目录。对于类型为httpd_t的进程而言,如果进程ID是1000,目录/proc/1000/和它下面包括的所有文件及子目录都自动具有httpd_t类型。如果httpd_t也用于普通文件,这就意味着授予其它普通文件访问权时,可能同时也授予了/proc/目录下的文件和目录同等的访问权,这可能并不是所希望的。