Linux桌面需要强制访问控制,Linux强制访问控制机制模块详细描述(1)

本文详细分析了Linux SELinux中MLS(多级安全)机制的实现,包括安全级别比较、支配关系判断等功能。核心函数如mls_level_eq()、mls_level_dom()用于判断安全级别的相等性和支配关系,而mls_level_incomp()则用于确定两个级别是否不具有可比性。这些函数在主体访问客体时的权限决策过程中起关键作用。
摘要由CSDN通过智能技术生成

原标题:Linux强制访问控制机制模块详细描述(1)

2 详细分析

2.1模块功能描述

对于SELinux中实现的MLS,其主要通过安全级别对系统资源的访问进行限制,相关操作定义在security/selinux/ss/mls.c、security/selinux/ss/context.h及security/selinux/ss/mls_types.h中,对于这些操作下面会进行详细介绍,这里不再赘述。

2.2 模块内部函数调用关系

83f50b7bb5857391a0bc51028183b6bf.png

图2-1 决策检索时MLS相关函数调用过程图

如图2-1所示,当主体对客体进行访问时,最终都会调用avc_has_perm_noaudit()函数来检查主体是否具有相应的权限,如果访问向量缓存中没有对应的访问向量,则该函数会调用avc_compute_av()函数来计算相应的访问向量决策。avc_compute_av()函数实际上是对安全服务器中security_compute_av()函数的封装,后者根据主体和客体的安全上下文及客体类别来计算相应的访问向量,在计算访问向量时,该函数首先根据TE规则获取主体对客体的访问权限,然后根据相应的约束删除被禁止的权限,其中MLS就在此处用于权限的限制。对于图2-1中涉及的函数,这里只对MLS相关的函数进行介绍,其功能如表2-1所示,其他函数参见“Linux多安全策略和动态安全策略框架模块代码分析报告”一文,这里不再赘述。

表2-1 安全级别间关系实现的相关函数说明

函数名称

函数功能

mls_level_eq()

判断安全级别是否相等,若相等则返回真

mls_level_dom()

判断两个安全级别之间的支配关系,即若参数l1的敏感属性大于参数l2的敏感属性并且l1的分类集合时l2的超集,则l1支配l2,此时函数返回真

mls_level_incomp()

判断两个安全级别是否不具有可比性,若是则返回真。该宏实际上只是简单的调用了mls_level_dom()函数

2.3 函数实现机制

对于SELinux中实现的MLS,其主要函数包括mls_level_isvalid()、mls_context_to_sid()、mls_level_eq()、mls_level_dom()及mls_level_incomp(),下面分别对其进行介绍。

(1) mls_level_isvalid()

mls_level_isvalid()函数用于根据指定的安全策略判断安全级别是否有效,若有效,返回真。该函数定义在security/selinux/ss/mls.c中,其函数头如下所示:

intmls_level_isvalid(structpolicydb*p, structmls_level*l)

该函数包含两个参数:p表示SELinux所使用的安全策略;l表示待检查的安全级别。对于

该函数,其函数调用流程图如图2-2所示,下面结合源码对该函数的主要执行步骤进行说明:

①对参数指定的安全级别的有效性进行检查,若无效,则函数直接返回0。

②调用hashtab_search()函数从策略中定义的敏感属性表中查找指定的安全属性对应的敏感属性,若失败,则直接返回0。

③调用ebitmap_for_each_positive_bit()宏遍历待检查的安全级别中每一个置位的敏感属性,如果存在,首先判断该敏感属性是否有效,如果其大于p->p_cats.nprim(该变量代表策略中定义的类别的数量),则函数直接返回0;然后调用ebitmap_get_bit()函数判断待验证的安全级别中指定的分类是否在策略定义的敏感属性分类中,若没有则函数直接返回0。

④结束并返回1。

bc2213bcf8a0ce3b16dfa94ac0d3999a.png

图2-2 mls_level_isvalid()函数调用流程图

(2) mls_context_to_sid()

mls_context_to_sid()函数用于根据scontext字符串设置参数context指定的安全上下文结构体中的MLS域,并让参数scontext指向代表MLS域的字符串的末尾。对于该函数,其函数头如下所示:

intmls_context_to_sid(structpolicydb*pol,charoldc,char **scontext, structcontext*context,structsidtab*s,u32def_sid)

由于该函数只是对代表上下文的字符串进行处理,处理过程比较简单,因此这里直接结合源码对其主要执行步骤进行说明:

①判断SELinux是否启用了MLS策略,若没有,则根据参数对scontext进行修改,然后直接返回0。

②根据参数oldc判断安全上下文是否提供了MLS相关内容,若没有,则调用mls_context_cpy()函数将默认的安全上下文中的安全界别拷贝到context中。

③提取低安全级别中的敏感属性,并让指针p指向该位置。

④通过for循环分别对低安全级别和高安全级别的进行处理。对于每一个安全级别,其分别按下述步骤进行处理:

a.首先调用hashtab_search()函数从策略库定义的安全级别中查找参数对应的安全级别的相关信息,并将其存放到levdatum中;

b.根据levdatum中的敏感属性设置context中的相应安全级别的敏感属性;

c.根据表示安全级别的字符串通过while循环来提取类别属性集,并将其拷贝到context中;

d.根据安全上下文中安全级别的表示方法进行判断,如果正在处理低安全级别,则提取高安全级别,并进入下次循环;否则跳出循环。

⑤若没有设置低安全级别,则令context中的高安全级别与其低安全级别相等。

⑥结束并返回。

(3) mls_level_eq()

mls_level_eq()函数用于判断两个函数的安全级别是否相等,若相等则返回真。对于该函数,其代码如下所示:

staticinlineintmls_level_eq(structmls_level*l1, structmls_level*l2)

{

return ((l1->sens==l2->sens) &&ebitmap_cmp(&l1->cat, &l2->cat));

}

该函数分别对两个安全级别的敏感属性及类别属性进行判断,如果安全级别l1的敏感属性等于安全级别l2的敏感属性并且l1的类别集合等于l2的类别集合,则返回真。

(4) mls_level_dom()

mls_level_dom()函数用于判断两个安全级别之间的支配关系,若l1支配l2,则函数返回真。其代码如下所示:

staticinlineintmls_level_dom(structmls_level*l1, structmls_level*l2)

{

return ((l1->sens>=l2->sens) &&ebitmap_contains(&l1->cat, &l2->cat));

}

该函数分别对两个安全级别的敏感属性及类别属性进行判断,如果安全级别l1的敏感属性大于等于安全级别l2的敏感属性并且l1的类别集合包含l2的类别集合,则返回真。

(5) mls_level_incomp()

mls_level_incomp()宏用于判断两个安全级别是否不具有可比性,若是则返回真。其代码如下所示:

#definemls_level_incomp(l1,l2)(!mls_level_dom((l1), (l2)) && !mls_level_dom((l2), (l1)))

如上所示,该宏实际上只是简单的调用了mls_level_dom()函数,即如果安全级别l1不能支配安全级别l2并且l2不能支配l1,这返回真。返回搜狐,查看更多

责任编辑:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值