3.2 SELinux策略配置语言
策略是一套指导SELinux安全引擎计算安全决策的规则,它定义了文件客体的类型、进程的域、使用限制进入域的角色及访问许可的规则表达式等。策略的源代码用SELinux配置语言进行描述。
3.2.1 基本概念
1.主体和客体
主体(subject)和客体(object)是指系统中的元素,主体是访问客体的进程,客体是系统中的一类实体,在系统中定义好了30种不同的客体类别(class),每个class有定义好的许可。
在/etc/security/selinux/src/policy/flask/security_classes中有class的定义,SELinux定义了30个class,列出如下:
security process system capability filesystem
file dir fd lnk_file chr_file blk_file sock_file
fifo_file socket tcp_socke tudp_socket msgq semmsg
shm ipcnode netif netlink_socket packet_socket
key_socket rawip_socket unix_stream_socket
unix_dgram_socket passwd
每个class都定义了操作许可,如:客体file有19个操作许可,列出如下:
ioctl read write create getattr setattr lock relabelfrom
relabelto append unlink link rename execute swapon
quotaon mounton execute_no_trans entrypoint
2.安全上下文与安全标识符
SELinux给每个主体和客体定义了一个安全上下文(security context)。安全上下文是对主体或客体安全的描述,其格式为:user:role:type,如:root:sysadm_r:sysadm_t,其中root为用户ID(user),sysadm_r为角色ID(role),sysadm_t为类型(type)ID。安全上下文代表了SELinux的访问控制属性。安全标识符(security identifier,简称SID)是内核中激活的安全上下文的序号。
一般情况下,多个属性的组合形成类型,多个类型的组合形成角色,多个角色的组合形成用户。有的属性也可能覆盖多个类型的范围,在安全上下文中最重要的是类型。
在文件系统中的每个文件或目录、网络的端口等都指定了一个安全上下文,安全策略则给出了各个安全上下文之间作用的规则。
例如:在policy/file_contexts/program/chroot.fc中,文件chroot的安全上下文被定义如下:
/usr/sbin/chroot system_u:object_r:chroot_exec_t
3.类型和类型属性
一个进程的类型(type)又称为域dormain,客体的角色常称为object_r。类型在策略管理中是用得最多的部分,特别是在类型增强(TE)中。用户、角色、域类型和客体类型的关系图如图3-3所示,每个用户有相配的角色,角色有与用户组相关的域类型,而域类型又指定了对客体类型的访问控制权限。
图3-3 用户、角色、域类型和客体类型的关系图
类型的属性(Type Attributes)是与一组类型相关的概念。它在TE规则里可代替类型,类型、别名、类型的属性共享同一个名字空间。类型属性定义的语法如下:
type type_name[aliasalias_name(s)] [,attrib1, …, attribn];
例如:type passwd_exec_t, file_type, sysadmfile, exec_type;
其含义是:将属性file_type、sysadmfile和exec_type定义给类型passwd_exec_t。
4.TE模型和RBAC模型
TE模型给进程和客体提供了良好的颗粒控制。RBAC提供了高层次的简化用户管理。SELinux安全模型是TE模型和RBAC模型的联合体。
TE模型是支持程序运行和域转移的强大类型控制,主体为运行的进程,进程为域类型。TE访问矩阵定义了域可以访问什么类型的客体,还定义了域类型转移。SELinux类型转移或访问控制基于一对安全上下文和类型的class。
RBAC是基于角色的访问控制(Role-based Access Control)模型,传统的RBAC模型是对角色进行授权,然后将一个或多个角色分配给一个授权用户。SELinux的RBAC模型是:给一个域类型指定授权,然后将域类型指定给角色,将一个或多个角色指定给一个授权用户。
例如:root:sysadm_r:sysadm_t中的sysadm_r就是角色。在每个安全上下文中有一个角色ID,对主体来说,它代表了主体当前的角色,对客体来说,角色典型值为object_r,角色对客体来说没意义。
3.2.2 TE规则的描述
主体对客体的访问在规则中需要有四个要素,分别说明如下:
源类型(source type):它是主体或者域(一个进程)的类型。
目标类型(target type):它是客体的类型。
对象类别(class):它是访问申请的某一类别资源,如:file。
许可(permission):表示主体对客体访问时允许的操作类型。如:read。
TE规则是策略中的主要部分,它包括
1.属性的定义
属性(Attribute)是具有相似特征的安全类型的组,它是一项工作(如:privmodule)的域类型或者系统中一类客体的所有类型(如:proc_fs),属性是从使用者角度考虑的一项特性。
属性名可在策略配置中一直使用,属性名与类型在同一个名字空间中存在。但一个属性名不能放在安全上下文的类型的位置上。属性对可选的MLS策略来说很重要,它的定义样例如下:
attribute domain; #这个属性代表了能指定给进程的每种类型
attribute privuser; #代表能改变它的selinux用户ID
attribute privrole; #代表能改变它的selinux角色ID
attribute privmodule; #代表能运行modprobe
attribute privmem; #代表能访问内核内存设备
attribute proc_fs; #能指定给/proc下文件的所有类型
下面说明一些非常有用的属性:
1)httpdcontent
属性httpdcontent将与Apache HTTP的策略相关的各种类型组合在一起。它帮助Apache HTTP的PHP脚本等使用httpd的带有content字符的类型。httpdcontent定义如下:
# This is an aliasing relationship
httpd_sys_content_t: httpd_sysadm_content_t, /
httpd_user_content_t
# These types handle different permissions sets for scripts
httpd_sys_script_ro_t
httpd_sys_script_rw_t
httpd_sys_script_ra_t
httpd_sys_content_t是httpd_sysadm_content_t和httpd_user_content_t类型的别名。
2)file_type
属性file_type用于指定给文件的所有类型,当域访问所有的文件类型时,使用它是方便的。属性file_type包括超过170种类型,其部分类型列出如下:
...
device_t
xconsole_device_t
file_t
default_t
root_t
mnt_t
home_root_t
...
3)属性netif_type, port_type和node_type
这些属性与域的网络活动有关。netif_type表示与网络接口相关的类型,允许策略控制在一个接口的发送、接收和其他操作。它包括下面这些类型:
netif_t
netif_eth0_t
netif_eth1_t
netif_eth2_t
netif_lo_t
netif_ippp0_t
netif_ipsec0_t
netif_ipsec1_t
netif_ipsec2_t
port_type与指定给端口号的所有类型相关,它允许SELinux控制端口绑定,它包括下面类型:
dns_port_t
dhcpd_port_t
http_cache_port_t
port_t
reserved_port_t
http_port_t
pxe_port_t
smtp_port_t
mysqld_port_t
rndc_port_t
ntp_port_t
portmap_port_t
postgresql_port_t
snmp_port_t
syslogd_port_t
node_type是指定给网络节点或主机的类型,允许SELinux控制来往于这个节点的交通。它包括下面的类型:
node_t
node_lo_t
node_internal_t
node_inaddr_any_t
node_unspec_t
node_link_local_t
node_site_local_t
node_multicast_t
node_mapped_ipv4_t
node_compat_ipv4_t
4)fs_type
属性fs_type标识指定给文件系统的所有类型,它允许大多数域获得全部文件系统的统计信息,一些特殊的域可以挂接任何文件系统。下面是它的部分文件类型:
devpts_t: sysadm_devpts_t, staff_devpts_t, user_devpts_t
fs_t
eventpollfs_t
futexfs_t
bdev_t
usbfs_t
nfsd_fs_t
rpc_pipefs_t
binfmt_misc_fs_t
tmpfs_t
autofs_t
usbdevfs_t
sysfs_t
iso9660_t
romfs_t
ramfs_t
dosfs_t
cifs_t: sambafs_t
nfs_t
proc_t
security_t
5)exec_type
属性exec_type是指定给可执行条目的所有类型的集合。这个属性中的域列出如下:
ls_exec_t
shell_exec_t
httpd_exec_t
httpd_suexec_exec_t
httpd_php_exec_t
httpd_helper_exec_t
dhcpd_exec_t
hotplug_exec_t
initrc_exec_t
run_init_exec_t
init_exec_t
ldconfig_exec_t
mailman_queue_exec_t
mailman_mail_exec_t
mailman_cgi_exec_t
depmod_exec_t
insmod_exec_t
update_modules_exec_t
sendmail_exec_t
mysqld_exec_t
named_exec_t
ndc_exec_t
nscd_exec_t
ntpd_exec_t
ntpdate_exec_t
portmap_exec_t
postgresql_exec_t
rpm_exec_t
snmpd_exec_t
squid_exec_t
syslogd_exec_t
udev_exec_t
udev_helper_exec_t
winbind_exec_t
ypbind_exec_t
6)domain
属性domain用于进程的所有类型,用来识别SELinux的域,在其他类型的强制系统中,域可能与类型分开使用,在SELinux中,域是具有domain属性的基本类型。这个属性允许规则应用到所有的域。如:init发送信号到所有的进程。
domain属性覆盖下面的属性:
unconfined_t: kernel_t, init_t, initrc_t, sysadm_t, rpm_t, /
rpm_script_t, logrotate_t
mount_t
httpd_t
httpd_sys_script_t
httpd_suexec_t
httpd_php_t
httpd_helper_t
dhcpd_t
ldconfig_t
mailman_queue_t
mailman_mail_t
mailman_cgi_t
system_mail_t
mysqld_t
named_t
ndc_t
nscd_t
ntpd_t
portmap_t
postgresql_t
snmpd_t
squid_t
syslogd_t
winbind_t
ypbind_t
7)reserved_port_type
属性reserved_port_type 标识任何一个保留网络商品的所有类型。保留端口的编号小于1024,它包括下面的类型:
# The allow rule permits the domain portmap_t to bind to a
# port with a type of portmap_port_t, which is one of the
# types identified by the reserved_port_type attribute. The
# dontaudit rule tells SELinux to never audit the access of
# portmap_t to a reserved_port_type.
allow portmap_t portmap_port_t:{ udp_socket tcp_socket } /
name_bind;
dontaudit portmap_t reserved_port_type:tcp_socket name_bind;
# Types associated with the reserved_port_type attribute
http_port_t
smtp_port_t
rndc_port_t
ntp_port_t
portmap_port_t
snmp_port_t
syslogd_port_t
2.类型的定义
类型在它使用之前必须定义,定义的语法如下:
type <typename> [aliases] [attributes];
类型定义的样例如下:
# httpd_config_t 是一个系统管理文件的类型
type httpd_config_t, file_type, sysadmfile;
# httpd_port_t是保留的端口,端口号小于1024
type http_port_t, port_type, reserved_port_type;
域是用于进程的类型,由它的domain属性决定类型。同一类型可以用于进程本身和与之相关的/proc文件系统中文件。通常,域用作操作的源上下文,域是操作者。域还可用作客体上下文,如:当init给一个域发送信号时,域作为客体。
域的数量和种类决定了安全策略的复杂性。更多的域意味着更好的安全控制,也意味着配置和维护的困难。
3.TE访问向量规则(TE Access Vector Rules)
访问向量(Access vectors,AVs)规则允许域访问各种系统客体,一个AV是一套许可。一个基本的AV规则是主体和客体的类型对,AV规则的语法如下:
<av_kind> <source_type(s)> <target_type(s)>:<class(es)> <permission(s)>
策略强制引擎认为所有的AV规则由两个类型、一个类别(class)和一个访问许可集组成。AV有以下四种规则类型,即<av_kind>在以下四种设置:
allow 表示允许主体对客体执行允许的操作。
neverallow 表示不允许主体对客体执行指定的操作。
auditallow 表示允许操作并记录访问决策信息。
dontaudit 表示不记录违反规则的决策信息,且违反规则不影响运行。
一些AV规则样例及说明列出如下:
#允许域user_t对bin_t类型客体进行类别为file的read等操作
allow user_t bin_t:file{read getattr lock execute ioctl execute_no_trans};
#允许域user_t对它自己类型的客体进行process类别的所有操作
allow user_t self: process*;
#允许域userdomain对shell_exec_t类型客体进行file类别的read等操作
allow userdomain shell_exec_t: file{ read getattr lock execute ioctl};
# 不允许域passwd_t对非bin_t等类型的客体进行file类别的execute_no_trans操作
neverallow passwd_t ~{ bin_t sbin_t ld_so_t} : file execute_no_trans;
#不允许域domain对非domain类型的客体进行process类别的类型转移操作
neverallow domain ~domain: process transition;
4.log消息格式
当SELinux不允许一个操作时,将产生一个给审核log的否决消息,log消息一般记录在文件/var/log/messages中。
示例:一条规则的否决消息格式
下面是一条规则的否决消息格式,显示了当用户在home目录~/public_html的网页内容没有得到访问许可时生成的AVC否决消息:
Jan 14 19:10:04 hostname kernel: audit(1105758604.519:420): /
avc: denied { getattr } for pid=5962 exe=/usr/sbin/httpd /
path=/home/auser/public_html dev=hdb2 ino=921135 /
scontext=root:system_r:httpd_t /
tcontext=user_u:object_r:user_home_t tclass=dir
这个AVC否决消息说明如下:
时间戳为Jan 14 19:10:04,主机名为hostname,
kernel: audit(1105758604.519:420):它是内核审计log消息的指针,()中第一个数字1105758604是时间戳组成的当前时间的未格式化长整数,第二个数字519是毫秒的短整数,第三个数字420是序列数,帮助从多个消息进行审核跟踪。
avc: denied 表示操作被否决,如果一些操作用规则auditallow设置,则它们产生授权的消息。
{ getattr } 表示否决或授权的操作,{}中含有实际尝试的操作。
for pid=5962 操作的源应用程序的进程ID。
exe=/usr/sbin/httpd 表示被否决的应用程序。
path=/home/auser/public_html 操作尝试的目标文件或目录的路径。
dev=hdb2 含有这个文件系统的设备切点。否决操作的客体在这个文件系统中。
ino=921135 目标文件或目录的节点号。
scontext=root:system_r:httpd_t 源的安全上下文,即被否决访问的进程。
tcontext=user_u:object_r:user_home_t 目标上下文,即被否决的文件或目录。
tclass=dir 目标的类别,指示被阻塞的目录是/home/auser/public_html/。
5.TE转移规则(TE Transition Rules)
域转移运行一个文件,产生一个运行在新域的新进程,类型转移将一个新客体标识为不同于源类型的类型。
类型转移的语法如下:
type_transition <source_type(s)> <target_type(s)> : /
<class(es)> <new_type>
域转移语法如下:
type_transition <current_domain> <type_of_program> : /
process <new_domain>
类型转移规则定义了不同域文件的类型转移。如果进程显式请求一个特殊上下文,域转移默认时能被覆盖。
文件的类型转移默认时实际上从父亲继承,即新的文件从它的父目录继承上下文,除非有一个明确的规则指明它从创建者继承。例如:目录~/类型为user_home_dir_t,策略定义了在带有这个类型的目录中创建的文件用user_home_t标识。
两个域转移的规则样例列出如下:
type_transition httpd_t httpd_sys_script_exec_t:process /
httpd_sys_script_t;
上面的规则表示:当后台进程httpd以域httpd_t运行类型为httpd_sys_script_exec_t的文件,如:CGI脚本文件,新的进程(如:CGI脚本进程)将赋为httpd_sys_script_t域。
type_transition initrc_t squid_exec_t:process squid_t;
上面的规则表示:当域为initrc_t的init进程执行squid_exec_t类型的文件时,新进程将赋为squid_t域。
type_transition <creating_domain> <parent_object_type> : /
<class(es)> <new_type>
一个新客体标识样例规则列出如下:
type_transition named_t var_run_t:sock_file named_var_run_t;
上面的规则表示:当在域named_t的一个进程在类型为var_run_t的目录创建一个socket文件时,该socket文件被赋予named_var_run_t类型。
6.m4宏定义
SELinux使用m4宏语言写可重用的策略规则。m4宏定义提供了易用的操作组合,它本身不属于SELinux策略语言的。m4宏语言的用法可查找m4宏语言用户手册http://cm.bell-labs.com/ 7thEdMan/vol2/m4。
下面列出Apache HTTP 宏定义文件$SELINUX_SRC/macros/program/apache_macros.te的前面一些内容:
define(`apache_domain', ` #定义宏apache_domain,后面从符号“`”到“’”是它的定义内容
undefine(`apache_single_user') #取消宏定义apache_single_user
ifdef(`single_userdomain', ` #如果定义了宏single_userdomain
ifelse($1, sys, `', ` #如果参数$1为sys,则返回空,否则定义宏apache_single_user
define(`apache_single_user')
')dnl end if # dnl表示它之后的字符为注释
')dnl end ifdef single_userdomain
ifdef(`apache_single_user', ` #如果定义了apache_single_user
typealias $1_home_t alias httpd_$1_content_t; #定义类型别名
typealias $1_home_t alias httpd_$1_htaccess_t;
typealias $1_home_t alias httpd_$1_script_exec_t;
typealias $1_home_t alias httpd_$1_script_ro_t;
typealias $1_home_t alias httpd_$1_script_rw_t;
typealias $1_home_t alias httpd_$1_script_ra_t;
file_type_auto_trans(httpd_$1_script_t, tmp_t, $1_tmp_t) #调用类型转换宏
', `
#这是网页的类型
type httpd_$1_content_t, file_type, homedirfile, sysadmfile;
ifelse($1, sys, ` #如果参数$1为sys,则进行类型别名定义
typealias httpd_sys_content_t alias httpd_sysadm_content_t;
')
...... #省略了其他规则的定义
')
宏定义apache_domain的使用方法如下:
apache_domain(sys)
宏定义apache_domain调用时,其内容中的$1将用sys替换,例如:
type httpd_$1_htaccess_t, file_type, sysadmfile;
上面一行语句将变为下面一行语句:
type httpd_sys_htaccess_t, file_type, sysadmfile;
3.2.3 RBAC规则的描述
在target策略中,每个域运行在单个角色,target策略没有使用用户和角色,但strict策略中使用了用户和角色。
1.角色的定义
角色的定义语法如下:
role <rolename> types <domain(s)>;
角色定义样例如下:
#允许管理者角色访问域ldconfig_t
role sysadm_r types ldconfig_t;
角色能包含其他角色,继承包含的角色的权限,这种继承称为角色域化。角色域化没有用在targted策略中。角色域化的样例如下:
# master_r继承sysadm_r和user_r角色的权限
dominance {role master_r {role sysadm_r; role user_r;} }
2.角色转移
多个域组成一个角色,每个进程有一个角色,它用系统角色system_r启动。用户在注册时获得一个角色,使用su时用户在获得新的UID同时,还获得新的角色。当然,还可以保持UID不变而改变角色,这种做法较少见。一般域经常变化但角色很少变化,特别是在targeted策略中。改变角色的另一个方法是角色转移(role_transition),角色转移用得较少,当前仅用在stricter策略中管理者角色以不同的角色启动后台,角色转移样例如下:
#当一个管理者执行一个$1_exec_t类型的进程时,进程从sysadm_r转移到system_r
role_transition sysadm_r $1_exec_t system_r;
角色允许的语法如下:
allow <current_role(s)> <new_role(s)>;
角色允许的样例列出如下:
#允许角色user_r转移到新角色
allow user_r sysadm_r;
3.用户定义
SELinux用户身份不同于UNIX身份,它用于安全标签的一部分,在限定条件下可实时切换。SELinux用户身份主要不用在targeted策略中。在targeted策略中,进程与客体的身份都是system_u,Linux默认用户是user_u。当用户身份是策略的一部分时,它们通常与Linux账户名(UID)是一致的。在strict策略中,一些系统账户能运行在通用的非特权的user_u身份,其他账户在策略库中有直接的用户身份。
Linux的UID和SELinux用户身份应该匹配,因为注册或类似的应用程序将查找这种匹配,如果无法匹配将使用user_u身份。
用户定义的语法如下:
user <user_identifier> <roles>{role_list};
一个用户定义的样例如下:
user root { user_r sysadm_r } ;
一些特殊的用户说明如下:
system_u 系统进程和资源的用户,linux用户不能创建它,也不能删除它。
user_u linux普通用户,在策略中没定义,没定义的普通用户是不能登录机器的。
login, sshd, 和 crond命令运行登录时设置安全上下文,默认的安全上下文由下面文件决定:
policy/contexts/users/username (per-user defaults)
policy/contexts/default_contexts (system defaults)
3.2.4 限制规则
限制规则给操作许可提供了最终的跨层次的限制。限制规则用Boolean表达式表示。限制的定义语法为:
constrain <class_set> <perm_set> <expression>;
其中表达式<expression>列出如下:
u1 op u2 #u1和u2分别表示操作前后的用户身份
r1 role_op r2 #r1和r2分别表示操作前后的角色
t1 op t2 #t1和t2分别表示操作前后的类型
u1 op user_set # user_set表示用户身份集
u2 op user_set
r1 op role_set
r2 op role_set
t1 op type_set
t2 op type_set
表示式中的操作符有not、and、or、=、!=等,role_op还包括dominance(域化)操作符。
下面是限制的样例:
例1:限制进程域转移
下面语句限制进程域转移的能力,类型转移前后进程的角色一致,或者,进程有类型为privrole。
constrain process transition( r1 == r2 or t1 == privrole);
例2:限制标识客体
下面的语句限制标识客体的能力,即标识客体时,标识前后客体的用户身份一致或者标识前进程的域为privowner。
constrain dir_file_class_set { create relabelto relabelfrom }
( u1 == u2 or t1 == privowner );
constrain socket_class_set { create relabelto relabelfrom }
( u1 == u2 or t1 == privowner );
3.2.5 标识安全上下文
1.给SID定义上下文
语法:sid sid_identifiers ecurity_context
sid_identifier是以前申明的 SID名,security_context为 user:role:type。
一些策略库预定义的SID在policy/initial_sid_contexts中,下面列出几个例子:
sid kernel system_u: system_r: kernel_t
sid security system_u: object_r: security_t
sid unlabeled system_u: object_r: unlabeled_t
2.文件系统的标识行为
当文件系统被SELinux内核挂接(mount)上时,安全服务器决定给基于filesystem类型的文件系统里的节点合适的标识行为。一个filesystem类型的标识行为可以用fs_use配置或用genfs_contexts进行配置。如果在策略里没有给filesystem类型指定标识行为,文件系统的所有节点将用unlabeled初始化的SID的安全上下文标识。
对于有唯一且永久的节点号的传统文件系统来说,SELinux用一个永久的标识映射来决定文件系统内的节点的安全上下文和文件系统本身的安全上下文。这个行为用fs_use_psid来标明,如下面几个例子:
fs_use_psid ext2;
fs_use_psid ext3;
fs_use_psid reiserfs;
对于代表管道和socket对象的伪文件系统,SE Linux常指定创建进程的上下文给代表对象的节点。这个行为用fs_use_task来声明。如下面几个例子:
fs_use_task pipefs system_u:object_r:fs_t;
fs_use_task sockfs system:object_r:fs_t;
其中安全上下文是文件系统本身用到的。pipefs和sockfs是指哪一种文件系统。
对于代表伪终端和共享内存对象的伪文件系统,SE Linux常指定从创建进程的上下文和与文件系统类型相关的上下文中派生出上下文。派生出的上下文由配置中的类型转移来决定。行为由fs_use_trans来声明。如下面几个例子:
fs_use_trans devpts system_u:object_r;devpts_t;
fs_use_trans tmpfs system_u:object_r:temfs_t;
3.指定文件系统上下文
对于不支持永久标识映射的文件系统,或不能用一个固定的由fs_use定义的标识的文件系统,genfscon配置可用来指定文件系统或文件路径或文件的安全上下文。文件系统对象上下文与文件系统的根目录一致。在policy/genfs_contexts中有使用genfscon的例子。
genfscon的语法是:
genfscon fs_type pathprefix [-file_type] context
其中,pathprefix是对象名字的部分路径名,file_type是可选的文件类型定义b, c, d, p, l, s, 或 –(看shell命令“ls”的选项)。
下面列出几个例子:
genfscon proc / system_u:object_r:proc_t
genfscon proc /kmsg system_u:object_r;proc_kmsg-t;
genfscon /kcore system_u:object-r:proc_kcore_t;
这几个例子给proc文件系统中几个目录中的文件指定不同的上下文。但/proc/PID目录和/proc/sys树不用这个配置。
例:
genfscon devfs / system_u:object_r;devfs_t;
genfscon devfs /null system_u:object_r:null_device_t
genfscon devfs /scsi –c system_u:object_r:fixed_disk_device_t
genfscon devfs /scsi –b system_u:object_r:fixed_disk_device_t
4.网络对象上下文
网络对象上下文配置允许为端口、接口和节点定义安全上下文。其中网络接口有两个相关的安全上下文:接口的上下文和接口上接收到的没标识包的默认上下文。下面是几个例子。
例1:定义端口的上下文
portcon tcp 80 system_u:object_r:http_port_t
portcon tcp 8080 system_u:object_r:http_port_t
例2:定义网络接口的上下文:
netifcon eth0 system_u:object_r:netif_eth0_t system_u:object_r:netmsg_eth0_t
例3:定义节点的上下文
nodecon 10.33.10.66 255.255.255.255 system_u:object_r:node_zeus_t;
nodecon 10.33.10.0 255.255.255.0 system_u:object_r:node_any_t
5.文件上下文配置
文件上下文配置位于policy/file_contexts目录下,用来做永久的标识映射,可以在policy目录运行make relabel可更新或创建标识映射。下面是几个文件上下文定义的例子,定义中用到了正则表达式。
/bin(|/.*) system_u:object_r:bin_t
/bin/login system_u:object_r:login_exec_t
/bin/bash system_u:object_r:shell_exec_t
/dev/[^/]*tty[^/]* system_u:object_r:tty_device_t
.*/lost/+found(|/.*) system_u:object_r:lost_found_t
3.2.6 boolean及条件描述语句
1.booleans是策略中声明的参数,值是true或false,在运行时可以改变的。
语法:bool name default_value;
例:bool user_ping false;
2.条件描述语句:
if (conditional expression) {
#有效的策略描述
} else {
#有效的策略描述
}
例:允许用户使用ping
bool user_ping false;
if (user_ping) {
domain_auto_trans(unpriv_userdomain, ping_exec_t, ping_t)
# allow access to the terminal
allow ping_t { ttyfileptyfile} : chr_file rw_file_perms;
}
3.查看和设置boolean
通过selinuxfs文件系统在/selinux/booleans和 /selinux/commit_pending_bools中人工设置。
用show_bools命令显示策略boolean的当前值。
用set_bools命令设置boolean的值。