在SELinux里,除了使用TE(type enforcement)来实现强制访问控制,还可以使用MLS机制的MCS或MLS。 MCS是single-sensitivity的安全机制,通过不同的categories来实现控制效果。 MCS的控制规则只能在base策略里面实现,如果想要修改refpolicy里的默认控制规则,可以修改策略里的mcs文件。MCS的基础内容如下:
mlsconstrain dir { search read ioctl lock } (( h1 dom h2 ) or ( t1 != mcs_constrained_type )); mlsconstrain dir { write setattr append unlink link rename add_name remove_name } (( h1 dom h2 ) or ( t1 != mcs_constrained_type ));
里面的mlsconstrain是约束语法,dir{search ….}是对应的客体类和权限集。后面的就是MCS约束的定义。分为T、L、H{1/2},分别表示类型(type),低安全集(L)和高安全集(H),之后的1,或2描述该表达式所限定的主体与客体,即L1表示主体的低安全级,如果上下文system_u:system_r:httpd_t:s0-s0:c0.c1024中,L1就是s0。 在selinux里面,看上面MCS对dir的约束定义,大家可能会有一个疑虑,selinux都是默认对当前级别(low level)进行判断,策略里面怎么是对high level进行判断。 看了下selinux的内核代码才知道缘由。 在selinux进行inode_doinit_with_dentry的时候,security_context_to_sid_default会到用到mls_context_to_sid对mls部分的上下文进行处理。该函数后部分有如下代码
if (l == 0) { context->range.level[1].sens = context->range.level[0].sens; rc = ebitmap_cpy(&context->range.level[1].cat, &context->range.level[0].cat); if (rc) goto out; }
即,如果只有low level的时候,high level的值按照low level的进行处理。 以上就是SELinux里面对MCS部分的控制。