selinux学习笔记
1、selinux两个强大的工具 semanger sealert
2、TE模型(Type Eforcement)
SELinux作为MAC的一种实现,通过中央规则库(policy.X 二进制数据文件)给所有进程、所有文件、内核数据结构定义各自的安全标识(标签,label/type),明确定义被访问对象所支持的访问方式,并规定进程标签对被访问对象的合法的访问方式。在配置SELinux时给整个文件系统上的所有文件设置标签,在系统启动过程中,init进程经由selinuxfs接口装载policy.X到内核空间,有内核中的security Server在处理用户态系统调用时实时查询(注,这里所说的Security Server,即为SELinux内核驱动中定义的各种数据结构,比如sidtab、policydb、AVC cache、以及在services.c文件中定义的各种以“security_”开头的函数)。
2.1类型强制概念
SELinux策略大部分内容都是由多条类型强制规则构成的,这些规则控制被允许的使用权,大多数默认转换标志、审核以及固定部分的检查。
SELinux策略大部分都是一套申明和规则一起定义的强制类型(TE:Type Enforcement)策略,一个定义良好,严格的TE策略可能包括上千个TE规则,TE规则数量的巨大并不令人惊奇,因为它们表达了所有由内核暴露出的允许对资源的访问权,这就意味着,每个进程对每个资源的访问尝试都必须至少要有一条允许的TE访问规则,如果我们仔细思考现在Linux操作系统中的进程和资源的数量,就明白为什么在策略中有那么多的TE规则了。
2.2 TE规则分类比较少,所有的规则基本上都属于两类范畴:
- 访问向量(AV)规则
- 类型规则
我们使用AV规则允许或审核两个类型之间的访问权限,我们在某些情况下使用类型规则控制默认的标记决定。
2.3 SELinux访问控制的标准是基于程序的域类型而不是用户的特权,焦点是程序的访问权而不是用户的访问权。
2.4 类型是构成TE规则的最小单位,SELinux主要就是使用类型来确定什么访问时被允许的;属性和别名时为减轻管理和使用类型的策略特习惯,我们使用属性利用单个标识符来引用一组类型。通常,策略语言允许我们在TE规则中类型的适当位置使用属性,而别名允许我们为类型定义另一个名字,别名标识符和类型标识符做同等地位对待。
3 类型声明
在使用类型前必须使用type语句明确地声明一个类型标识符,SELinux没有预定义类型,我们必须自行声明。
例如:type httpd_t; type http_user_content_t;
声明了类型之后,就可以在安全上下文、TE规则和其他策略语句中使用他们了。
类型声明的语法:
type 类型名称 [alias 别名集] [,属性集合];
1)alias {aliasa_t aliasb_t}
2)多个属性之间逗号隔开,如 type bin_t, file_type, exec_type;
类型声明在整个策略中,以及基础载入模块和基础载入模块中都是有效的。但在有条件的语句中无效。
4 属性
属性可以理解为1)类型的性质或属性,或二者兼得 2)一组类型
假设我们想让一个备份程序可以访问所有文件,首先我们创建一个备份应用程序的域类型(backup_t),并允许它访问任何文件关联的类型。
type backup_t;
allow backup_t httpd_user_content_t:file read;
allow backup_t shadow_t : file read;
......
我们需要大量的allow规则授予备份程序足够的访问权(每个类型都要一个),这是一个单调且错误频出的过程,属性使得这种“组访问”更容易指定。通过将所有关联的文件类型顶定义一个属性,然后授予该属性的访问权,于是,我们可以使用一条规则授予backup_t必须的访问权限。
attribute file_type;
allow backup_t file_type :file read;
4.1 类型与属性关联的两种方式
1) type httpd_user_content_t,file_type, httpdcontent;
2) type httpd_user_content_t;
typeattribuite httpd_user_content_t file_type, httpdcontent;
5 访问向量规则
通用AV规则语法,每个规则都要包含下面五个元素
- 规则名称:allow,dontaudit,auditallow,nerverallow
- 源类型
- 目标类型
- 客体类型
- 许可
例如:allow user_t bin_t : file execute;
5.1 AV规则的密钥(哈希Key)
在内核中,所有的AV规则都是通过一组【源类型+目标类型+类别】进行唯一性标识,整个三重组叫做一个密钥,当作哈希表使用,缓存在策略数据结构中,规则就是靠这个密钥存储和检索的,当一个进程产生了一个访问请求时,SELinux LSM模块被要求允许基于这个密钥进行访问。
6、类型规则
规则名称:type_transition或type_change
源类型:创建或拥有进程的类型
目标类型:包含新的或重新标记的课题的课题类型
客体类别:新创建的或重新标记的客体的类别
默认类型:新创建的或重新标记的客体的单个默认类型