NSA:Configuring the SELinux Policy

 

http://www.nsa.gov/research/_files/selinux/papers/policy2/t1.shtml

配置SELinux策略

策略语言和策略示例(Example Policy)配置

策略配置文件使用的是简单声明语言。策略示例采用这种语言,来示范SELinux如何达到某种安全目的,这给了用户一个起点。
本节使用示例配置来告诉你什么是策略语言。同时告诉你如何逻辑地分离上下文配置。关于MLS、附加的策略声明支持本节当中没有涉及。

策略语言的完整语法明确规定于policy_parse.y yacc文件中(包含在checkpolicy命令的源码包中)。本节包含了这一语法的摘要,旨在其可读性,并忽略了一些过时了的元素。策略配置的源文件位于/etc/selinux/(targeted|strict)/src/policy目录。由于m4宏在策略示例中广泛的使用,本节会描述一些通用的宏。这些宏定义可以在policy/macros/global_macros.te或者policy/macros/core_macros.te文件中找到,除非特别说明。

一个策略配置文件包含了以下几个顶级组成部分:Flask定义, TE、RBAC的声明和规则, 用户声明, 约束定义, 以及安全上下文的规范。
Flask的定义在Flask Definitions这节中已做过讨论。
TE、RBAC的声明和规则指明了TE、RBAC模型的策略逻辑。
用户声明定义了用户,为特定的角色认证用户。
约束定义指明了权限的附加约束,可以将用户标识、TE、RBAC模型联系起来。
安全上下文规范为某些实体提供安全上下文,如初始化SID、未标签的文件系统、网络对象。
一个策略的顶级:
policy -> flask te_rbac users opt_constraints contexts

TE和RBAC配置一览

TE和RBAC配置文件声明了角色、域、类型,为TE和RBAC模型定义了标签、访问向量(Access Vector)规则。策略语言允许TE和RBAC配置自由地混合编写。TE和RBAC声明和规则如下所示:
te_rbac -> te_rbac_statement | te_rbac te_rbac_statement
te_rbac_statement -> te_statement | rbac_statement
te_statement -> attrib_decl |
                type_decl |
                type_transition_rule |
                type_change_rule |
                te_av_rule |
                te_assertion
rbac_statement -> role_decl |
                  role_dominance |
                  role_allow_rule
TE声明可以是一个属性声明、类型声明、类型过渡规则、类型变化规则、访问向量规则,或者是一个命题。
RBAC声明可以是一个角色声明、role dominance声明,或者是一个角色允许规则。

TE声明

属性声明

类型属性是一个标识符,用于标识一组具有相似属性的类型。每个类型可以有多个属性,每个属性可以和多个类型关联。在类型声明中定义了属性与类型的联系,这将在下节探讨。若在类型定义中使用了某个属性,该属性应该明确的声明过。属性定义的语法如下:
attrib_decl -> ATTRIBUTE identifier ';'
一些属性声明的例子如下所示:
attribute domain;
attribute privuser;
attribute privrole;

类型声明

TE配置语言要求定义每个类型。每个类型声明为类型指明了一个Primary Name,和可选的别名、属性。类型声明的预防如下:
type_decl -> TYPE identifier opt_alias_def opt_attr_list ';'
opt_alias_def -> ALIAS aliases | empty
aliases -> identifier | '{' identifier_list '}'
identifier_list -> identifier | identifier_list identifier
opt_attr_list -> ',' attr_list | empty
attr_list -> identifier | attr_list ',' identifier
在TE配置中,可以使用别名替换Primary Name。运行期间,策略示例总是在返回SID给安全上下文时,使用Primary Name来表示类型。一个应用程序可以在需要一个上下文的SID时,使用Primary Name或者其别名来标识类型。Primary Name和别名存在于同一个名字空间中,且必须各自唯一。
也可以使用typealias和typeattribute关键字来在单独的一行声明别名。语法如下:
typealias_decl -> TYPEALIAS identifier ALIAS aliases ';'
typeattribute_decl -> TYPEATTRIBUTE identifier attr_list ';'
一些在策略示例中与shell守护进程相关的类型声明如下:
type sshd_t, domain, privuser, privrole, privlog, privowner;
type sshd_exec_t, file_type, exec_type, sysadmfile;
type sshd_tmp_t, file_type, sysadmfile, tmpfile;
type sshd_var_run_t, file_type, sysadmfile, pidfile;
sshd_t类型是一个守护进程的域。sshd_exec_t类型是sshd可执行文件的类型。sshd_tmp_t类型是临时文件及PID文件的类型,它由守护进程分别生成。每个类型都有一些关联的属性在TE配置文件的规则中使用。

TE过渡规则
TE过渡规则指明了进程新的域和新的文件类型。换句话说,定义TE过渡规则需要指明一对类型及一个类。对一个进程来说,作为第一个类型,也被称为源类型;第二个类型,即可执行文件的类型,也被称为目标类型。对于一个对象来说,源类型是创建对象本身进程的域,目标类型是对象本身的类,这就好像目录对于目录中文件的关系。一个进程或对象的TE过渡规则语法如下:
type_transition_rule -> TYPE_TRANSITION source_types target_types ':' classes new_type ';'
source_types -> set
target_types -> set
classes -> set
new_type -> identifier
set -> '*' | identifier | '{' identifier_list '}' | '~' identifier | '~' '{' identifier_list '}'
TE过渡规则的源/目标类型可以是一组的类型。波浪号(~)可以表示一个补集。*号可以代表所有的类型或类。如果多条规则需要给出一对类型和类,编译器将给出一个警告,并且使用最后一条规则。
一些来自策略示范中的TE过渡规则如下,它们与shell的守护进程相关:
type_transition initrc_t sshd_exec_t:process sshd_t;
type_transition sshd_t tmp_t:{ dir file lnk_file
                               sock_file fifo_file } sshd_tmp_t;
type_transition sshd_t shell_exec_t:process user_t;
initrc_t类型是init进程运行/etc/rc.d脚本时进入的域。
第一条规则指明了该域在执行类型为sshd_exec_t的程序时,应该过渡成sshd_t域。tmp_t类型是/tmp目录的类型。
第二条规则指明了当sshd_t域在tmp_t类型的目录中创建了一个文件,这个新文件应被标记为sshd_tmp_t类型。
shell_exec_t类型是shell程序的类型。最后一条规则指明了sshd_t域应该在执行shell_exec_t类型的程序时过渡到user_t域。
TE过渡规则在定义一个新类型时,通常需要一组关联的类,例如所有文件的类。表2中是一组为关联类预定义的宏,可以如下使用它们:
type_transition sshd_t tmp_t:notdevfile_class_set sshd_tmp_t;
type_transition cardmgr_t tmp_t:devfile_class_set cardmgr_dev_t;

表二:类的宏(Class Macros)
dir_file_class_set      所有目录及文件的类
file_class_set          所有文件的类,不包括目录
notdevfile_class_set    非设备文件的类
devfile_class_set       设备文件的类
socket_class_set        所有套接字的类
dgram_socket_class_set  数据报套接字的类
stream_socket_class_set 流套接字的类
unpriv_socket_class_set 无特权套接字的类,不包括rawip、netlink、packet、key

由于每个过渡规则需要一组相应的访问向量规则来认证操作,宏支持自动将TE标记规则和TE访问规则展开来,代替直接定义TE过渡规则。domain_auto_trans宏定了域的过渡,file_type_auto_trans宏为文件定义过渡。
domain_auto_trans宏将当前域、程序的域、新的域作为其参数。
file_type_auto_trans宏将父目录类型,新文件类型,以及可选的一组类(默认为非设备文件类)作为其参数。
在之前小节中展示过一组初始化过渡类型使用了这些宏,它们在示例策略中定义,如下:
domain_auto_trans(initrc_t, sshd_exec_t, sshd_t)
file_type_auto_trans(sshd_t, tmp_t, sshd_tmp_t)
domain_auto_trans(sshd_t, shell_exec_t, user_t)

TE变化规则

除了支持TE过渡规则,TE配置语言也允许TE变化规则。这些规则不被内核使用,但是security-aware applications可以通过调用security_compute_relabel函数使用这些规则。一个TE变化规则定义了用于重标记进程安全上下文操作新的类型、对象的当前类型、对象的类。在示例策略中,这些规则定义了当系统的守护进程为用户会话重标记终端设备时的使用类型。其语法同TE过渡规则相似,除了使用type_change关键字。一些TE变化的示例如下:
type_change user_t tty_device_t:chr_file user_tty_device_t;
type_change sysadm_t tty_device_t:chr_file sysadm_tty_device_t;
type_change user_t sshd_devpts_t:chr_file user_devpts_t;
type_change sysadm_t sshd_devpts_t:chr_file sysadm_devpts_t;
前两条规则定义了用户和管理员使用常规终端设备登录时的类型。当创建一个本地用户会话时,登录进程使用前两条规则。
后两条规则定义了用户和管理员使用由sshd最初分配的远程登录设备登录时的类型。

TE访问向量规则

TE访问向量规则定义了一组基于一对类型和类的权限。这些规则定义了TE访问矩阵。规则可以定义各种访问向量,包括allowed、auditallow、auditdeny向量。访问向量规则的语法为:
te_av_rule -> av_kind source_types target_types ':' classes permissions ';'
av_kind -> ALLOW | AUDITALLOW | DONTAUDIT
source_types -> set
target_types -> set
classes -> set
permissions -> set
set -> '*' | identifier | nested_id_set | '~' identifier | '~' nested_id_set | identifier '-' identifier
nested_id_set -> '{' nested_id_list '}'
nested_id_list -> nested_id_element | nested_id_list nested_id_element
nested_id_element -> identifier | '-' identifier | nested_id_set
比较TE过渡规则,该语法是允许多条TE访问向量规则的简洁规范,通过几组可选的源类型、目标类型、类、权限。类属性名可以在任何类型字段使用。波浪号字符和型号字符可以用在任何字段。也可以使用减号字符表示在某个集合中去掉某个类型或类型的属性。例如file_type - shadow_t将通配所有含file_type属性的类型,除了shadow_t。self标识符可以用在目标类型的字段,表明规则应该被应用在每个源类型和本身之间。
一些在策略示例中和shell守护进程相关的访问向量规则如下:
allow sshd_t sshd_exec_t:file { read execute entrypoint };
allow sshd_t sshd_tmp_t:file { create read write getattr setattr link unlink rename };
allow sshd_t user_t:process transition;
第一条规则定义了sshd_t域可以读、执行、进入(entrypoint)sshd_exec_t类型的文件。
第二条规则定义了域可以创建和访问sshd_tmp_t类型的文件;
第三条规则定义了域可以过渡到user_t域;
比较TE过渡规则,类的宏可以用在TE访问向量的类字段。使用这个宏来屏蔽非计划的访问时需要注意,例如在规则中使用file_class_set宏而不是notdevfile_class_set宏将会允许所有文件的类,包括设备文件。SELinux为每个类定义了大量细粒化的权限,宏也定义了通用的权限的组织。一些宏列在了表三表四表五里。
在TE过渡规则中使用权限字段:
allow sshd_t sshd_tmp_t:notdevfile_class_set create_file_perms;
allow sshd_t sshd_tmp_t:dir create_dir_perms;

表三:文件权限宏
stat_file_perms调用stat函数或访问文件
x_file_perms执行文件
r_file_perms读文件
rx_file_perms读和执行文件
rw_file_perms读和写文件
ra_file_perms读和插入文件
link_file_perms链接、取消链接或重命名文件
create_file_perms创建、访问、删除文件
r_dir_perms读和搜索目录
rw_dir_perms读和修改目录
ra_dir_perms读和增加入口给目录
create_dir_perms创建、访问、删除目录
mount_fs_perms挂载和卸载文件系统

表四:套接字权限的宏
rw_socket_perms使用套接字
create_socket_perms创建和使用套接字
rw_stream_socket_perms使用流套接字
create_stream_socket_perms创建和使用流套接字

表五:IPC权限宏
r_sem_perms读信号量
rw_sem_perms创建和使用信号量
r_msgq_perms读消息队列
rw_msgq_perms创建和使用消息队列
r_shm_perms读共享内存
rw_shm_perms Permissions创建和使用共享内存
使用宏还能自动展开:
domain_auto_trans(sshd_t, shell_exec_t, user_t)
domain_trans(sshd_t, shell_exec_t, sysadm_t)

表六:宏接口
general_domain_access
general_proc_read_access
base_file_read_access
uses_shlib
can_network
domain_trans and domain_auto_trans
file_type_trans and file_type_auto_trans
can_exec
can_exec_any
can_unix_connect
can_unix_send
can_sysctl
can_create_pty
can_create_other_pty

TE访问向量命题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值