您好,欢迎访问三七文档
当前位置:首页 > 法律文献 > 法律文书 > SELinuxTE规则
1.简介SELinux策略语言主要描述policy.conf的相关语法,其相关部分如下图所示:2.类型强制概念SELinux策略大部分内容都是由多条类型强制规则构成的,这些规则控制被允许的使用权,大多数默认转换标志,审核,以及固定部分的检查。SELinux策略大部分都是一套声明和规则一起定义的类型强制(TE:TypeEnforcement)策略,一个定义良好、严格的TE策略可能包括上千个TE规则,TE规则数量的巨大并不令人惊奇,因为它们表达了所有由内核暴露出的允许对资源的访问权,这就意味着每个进程对每个资源的访问尝试都必须至少要有一条允许的TE访问规则,如果我们仔细思考一下现代Linux操作系统中进程和资源的数量,就明白为什么在策略中有那么多的TE规则了。当我们添加由TE规则控制的审核配置和标志时,对于具有严格限制的SELinux策略,常常会见到它包含有上千条规则,在“创建和编写SELinux安全策略”中,我们将会讨论如何创建和管理这些大量的规则,本文旨在理解TE规则是如何工作的。TE规则的绝对数量对理解SELinux策略是一个大的挑战,但是规则本身并不复杂,它们的分类相对较少,所有的规则基本上都属于两类范畴:•访问向量(AV)规则•类型规则我们使用AV规则允许或审核两个类型之间的访问权,我们在某些情况下使用类型规则控制默认的标记决定。SELinux的一个重要概念是TE规则是将权限与程序的访问结合在一起,而不是结合用户。所有SELinux策略语言特性都是处理主体(正常的运行中的进程)对客体(文件、目录和套接字等)的访问权的,主要集中于程序访问控制决策,这也是SELinux的主要益处,它允许SELinux策略编写者基于程序的功能和安全属性,加上用户要完成任务需要的所有访问权做出访问决策,可以将程序限制到功能合适,权限最小化的程度,因此,即使它出了故障或被攻击破坏,但整个系统的安全并不会受到威胁。SELinux是不会管用户的,可以给同一个程序指定多个域类型(因此有不同的特权集),这样就允许引入角色的概念,尽管如此,访问控制的标准仍然是基于程序的域类型而不是用户的特权。焦点是程序的访问权,而不是用户的访问权。3.类型、属性和别名正如你从术语类型强制猜测的那样,类型是构成TE规则的最小单位,SELinux主要就是使用类型来确定什么访问是被允许的;属性和别名是为减轻管理和使用类型的策略特性,我们使用属性利用单个标识符来引用一组类型。通常,策略语言允许我们在TE规则中类型的适当位置使用属性,而别名允许我们为类型定义另一个名字,别名标识符和类型标识符做同等地位对待。3.1类型声明在使用类型前,必须使用type语句明确地声明一个类型标识符,SELinux没有预定义类型,我们必须自行声明,例如:假设我们想声明一个类型(httpd_t),并打算将其作为Web服务器的域类型,而另一个类型(http_user_content_t)准备应用于用户数据文件,即Web服务器显示内容的文件,我们使用type语句进行声明,如下:[cpp]viewplaincopy1.typehttpd_t;2.typehttp_user_content_t;声明了类型后就可以在安全上下文、TE规则和其它策略语句中使用它们了。类型声明的语法:•type类型名称[alias别名集][,属性集];1)别名集:如果指定的不止一个别名标识符,要在一对大括号中用空格将各个别名区别开来,如:alias{aliasa_taliasb_t}。2)属性集:是一个或多个预先声明的属性标识符,如果同时指定多个属性标识符,属性之间使用逗号进行分隔,如:typebin_t,file_type,exec_type;3)类型声明在整个策略中,以及基础载入模块和非基础载入模块中都是有效的。但在有条件的语句中无效。3.2类型和属性可能你已经想到,一个大型的,复杂的策略可能包括上万个代表系统上不同资源的类型,例如:FedoraCore4(FC4)的targeted策略相对较小,但也声明了超过800个类型。由于默认的规则是拒绝所有的访问,所以任何一个访问都需要明确地被允许,这就导致了类型注定会很冗长,这时策略语言的属性特性就派上用场了。属性可以理解为:1)类型的性质或属性,或二者兼得2)一组类型在任何一种情况下,原理都是相同的。假设我们想让一个备份程序可以访问所有的文件,首先我们创建一个备份应用程序的域类型(backup_t),并允许它访问与任何文件关联的类型:[cpp]viewplaincopy1.typebackup_t;2.allowbackup_thttpd_user_content_t:fileread;3.allowbackup_tshadow_t:fileread;为了完成这个例子,我们编写了一个用于其他所有文件类型的规则,依赖声明的类型数量,我们需要大量的allow规则授予备份程序足够的访问权(每个类型都要一个)。另外,每次向策略中增加一个文件类型时,同时要为backup_t增加一条allow规则,这是一个单调且错误频出的过程,属性使得这种组访问更容易指定,通过将所有关联的文件类型定义一个属性,然后授予该属性的访问权(而不是每个类型了),于是,我们可以使用一条规则授予backup_t必需的访问权。使用attribute语句进行属性声明,如:[cpp]viewplaincopy1.attributefile_type;这个语句声明一个叫做file_type的属性,类型和属性共享相同的命名空间,因此,类型和属性的名字不能雷同,假设我们将所有适当的类型都与属性file_type进行关联,然后就可以使用一条规则来指定backup_t读取这些文件,如:[cpp]viewplaincopy1.allowbackup_tfile_type:fileread;在我们使用了一条规则替代了上千条allow规则,而授予的访问权却是一样的,当这个策略编译好后,这条规则会自动扩展成上千条规则,分别控制不同文件类型的访问,更重要的是,当我们给文件定义了一个新类型时,我们需要做的仅仅是将这个新类型与file_type属性进行关联,域类型backup_t将会自动获得读取访问权。属性声明语法:•attribute属性名称;1)属性和类型,别名都在同一个命名空间,因此不能与其他类型或别名重名。2)属性声明在整个策略,基础载入模块和非基础载入模块中都有效,但在有条件的语句中无效。3.3关联类型和属性3.3.1在type中指定属性迄今为止,我们已经讨论了如何定义类型和属性,下面将要讲述的是如何将它们关联起来,最常见的关联方式是在用type语句声明类型时就指定其属性,例如:我们可以将声明http_user_content_t类型的语句修改为:[cpp]viewplaincopy1.typehttp_user_content_t,file_type;这个语句描述了声明类型http_user_content_t时,同时关联了file_type属性,它会自动向具有file_type属性的类型组中添加http_user_content_t类型,但从概念上将,它实质上已经改变了http_user_content_t类型的性质,因为它现在已经具有基于属性的访问许可了,而不只局限于类型本身了。一个类型可以有多个属性,例如:我们可以再为所有Web服务器要用的文件创建一个属性httpdcontent,拥有httpdcontent属性的类型可能是拥有file_type属性的类型的一个子集,下面的代码扩展了我们前面的例子:[cpp]viewplaincopy1.typehttpd_user_content_t,file_type,httpdcontent;2.typeshadow_t,file_type;3.4.allowbackup_tfile_type:fileread;5.allowhttpd_thttpdcontent:fileread;类型具有的属性数量没有限制,就和类型一样,我们可以合理定义相应的属性。3.3.2使用typeattribute指定属性除了使用type语句关联类型和属性外,还可以使用typeattribute语句,这个语句允许我们在声明类型时,单独关联属性,在策略中可能也就是一个单独的文件了,例如:将前面举的示例语句:[cpp]viewplaincopy1.typehttpd_user_content_t,file_type,httpdcontent;分成两条语句进行表述:[cpp]viewplaincopy1.typehttpd_user_content_t;2.typeattributehttpd_user_content_tfile_type,httpdcontent;typeattribute允许我们在一个地方定义类型,在另一个地方关联属性,增强了语言的灵活性,在设计策略源文件时,可以考虑进行模块化设计了。typeattribute语句语法:•typeattribute类型名属性名;1)一个或多个事先声明的属性标识符,如果指出多个属性标识符,属性标识符之间使用逗号分隔,如typeattributebin_tfile_type,exec_type;2)typeattribute语句在单个策略,基础载入模块和非基础载入模块中都是有效的,只有在条件语句中无效。3.4别名(为确保兼容性而存在)别名是引用类型时的一个备选的名字,能够使用类型名的地方就可以使用别名,包括TE规则,安全上下文和标记语句,别名通常用于策略改变时保证一致性,例如:一个旧策略可能引用了类型netscape_t,更新后的策略可能将类型名改为mozilla_t了,但同时提供了一个别名netscape_t以保证与旧模块能够正确兼容。3.4.1在type中声明别名[cpp]viewplaincopy1.typemozilla_taliasnetscape_t,domain;注意别名声明是放在属性的前面的。3.4.2使用typealias申明别名[cpp]viewplaincopy1.#这两条语句等同于2.typemozilla_t,domain;3.typealiasmozilla_taliasnetscape_t;4.5.#下面这一条语句6.typemozilla_taliasnetscape_t,domain;typealias语句语法•typealias类型名称alias别名名称1)类型名称:要添加别名的类型的名称,类型必须使用type语句单独声明,而且这里只能指定一个类型名称。2)别名名称:如果同时指定多个别名,别名之间用空格分开,并使用大括号将所有别名括起来,如{aliasa_taliasb_t}。3)typealias语句在单个策略,基础载入模块和非基础载入模块中都有效,只有在条件语句中无效。4.访问向量规则AV规则就是按照对客体类别的访问许可指定其具体含义的规则,SELinux策略语言目前支持四类AV规则:在代码中,客体类别的访问许可集是由一些叫做访问向量的掩码表现的,因此就有了术语访问向量。•allow:表示允许主体对客体执行允许的操作•dontaudit:表示不记录违反规则的决策信息,且违反规则不影响运行(允许操作且不记录)•auditallow:表示允许操作并记录访问决策信息(允许操作且记录)•neverallow:表示不允许主体对客体执行指定的操作本小节剩余部分将详细讨论这些规则的语法和语义,以及一些示例。4.1通用AV规则语法虽然这些规则的用途不一样,但它们的基本语法是一样的,每个规则都要包含下面五个元素:•规则名称:allow,dontaudit,auditallow和neverallow•源类型:授予访问的类型,通常是进程的域类型•目标类型:客体的类型,它被授权可以访问的类型•客体类别:客体的类别•许可:表示主体对客体访问时允许的操作类型(也叫做访问向量)。一个简单的AV规则有一个源类型,目标类型,客体类别和许可,在我们前面的a
本文标题:SELinuxTE规则
链接地址:https://www.777doc.com/doc-2858059 .html