原标题: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 模块内部函数调用关系

图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。

图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,这返回真。返回搜狐,查看更多

责任编辑:

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

  1. linux源码acl,Linux自主访问控制机制模块详细分析之posix_acl.c核心代码注释与acl.c文件介绍...

    原标题:Linux自主访问控制机制模块详细分析之posix_acl.c核心代码注释与acl.c文件介绍 2.4.4.6 核心代码注释 1 posix_acl_permission() int(stru ...

  2. 文本安装红旗Linux,红旗Linux桌面4.1正式版文本方式安装过程详细图解.doc

    红旗Linux桌面4.1正式版文本方式安装过程详细图解 很多用810或815集成显卡或者其它红旗Linux桌面4.1正式版不支持的显卡.显示器的用户,在取用图形界面方式安装过程或安装后进入系统时会出现 ...

  3. linux注册函数机制,Linux可信计算机制模块详细分析之函数实现机制(1)字符设备驱动...

    原标题:Linux可信计算机制模块详细分析之函数实现机制(1)字符设备驱动 2.3 函数实现机制 2.3.1 Linux 字符设备驱动 在linux 3.5.4中,用结构体cdev描述字符设备,cde ...

  4. linux桌面发展方向,观点|Linux 桌面的发展之路!

    Ken Starks 在 fossforce.com 网站上问 你们是如何优化 Linux 的?,我很高兴他问了这个问题,因为我有话要说!对我来说,Linux 桌面就是一连串的承诺,但是这些承诺却总是 ...

  5. linux桌面xfce美化_Xfce Linux桌面环境,Arduino机器人,热门DevOps书籍,FreeDOS,Python,Go等

    linux桌面xfce美化 让我们回顾一下6月25日至7月1日这一周Opensource.com读者最感兴趣的部分: 使用 David Xfce Linux桌面环境的8个理由 杰里米·库克(Jerem ...

  6. 远程链接linux桌面的软件,远程linux桌面软件

    Windows系统怎么远程登陆桌面Linux 用putty.xshell等软件远程linux的命令行模式大家应该都会了,假如需要远程linux的桌面要怎么办呢?下面本人就讲下在Windows系统平台下 ...

  7. linux桌面系统 9,红旗Linux系统RedFlag Linux Desktop 9.0安装教程

    以下分享红旗Linux操作系统RedFlag Linux Desktop 9.0安装教程,你可以用Vmware.VirtualBox虚拟机.硬盘.U盘.光盘的方式来安装.本文以光盘的方式来演示安装Re ...

  8. linux 桌面 性能,观点|六种 Linux 桌面的最佳特性和最差特性

    无论在哪一个星期,我都有可能使用两种或三种Linux桌面环境.我如此频繁地更换Linux桌面,一方面是为了跟上潮流,享用最新功能.不过最主要的原因还是,无论我使用哪种环境,很快就意识到该环境的种种不足 ...

  9. 中兴新支点Linux桌面操作系统,中兴新支点Linux桌面操作系统,小白也能轻松上手...

    小编作为一个电脑小白 还是第一次使用中兴新支点的Linux桌面操作系统呢 今天就带着大家一起 进行中兴新支点桌面操作系统的 初体验吧⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄ 简洁明了的桌面 A Clean An ...

最新文章

  1. python生成订单号或生成任意序列
  2. 改变电子商务行业业务的人工智能趋势
  3. Android各组件/控件间通信利器之EventBus
  4. linux中vi大括号enter缩进,格式 – 如何在vi中对齐代码(大括号,括号等)?
  5. HDU 6428 Problem C. Calculate(积性函数)
  6. sql 如何根据月份查询数据总数_什么是慢查询?如何通过慢查询日志优化?
  7. 【elasticsearch系列】安装elasticsearch-head插件
  8. WPF 与 摄像头资料
  9. python mockito arg_that_编程高阶用法–开发者高频词汇
  10. python水仙花数
  11. 发言倒计时器_演讲稿之演讲比赛专用倒计时器
  12. cholesky分解java代码_cholesky分解的实现
  13. 计算机组装与维修的前言,计算机组装与维修论文大纲模板 计算机组装与维修论文提纲如何写...
  14. Java Review(三十三、异常处理----补充:断言、日志、调试)
  15. 9个最适合Elementor的免费主题【官方推荐】
  16. Android使用高德地图实现轨迹播放和进度条控制
  17. 从1到无穷大—机器学习篇
  18. 我用最独特的方式为情人节准备了这些。。。
  19. CentOS 8配置静态IP地址
  20. 变频电源使用脉冲宽度调制方式会对周边设备造成什么影响,该如何去防护

热门文章

  1. 2021年中国服装行业经营现状及重点企业对比分析[图]
  2. 连接共享文件夹时报错:发生系统错误 1219:不允许一个用户使用一个以上用户名与服务器或共享资源的多重连接
  3. Qt Creator嵌入式python时报错error: ::hypot has not been declared
  4. 阿里云 mysql 100_MySQL服务进程占用系统CPU达100%-阿里云开发者社区
  5. python框架之flak学习笔记
  6. 墨水染色之广度优先搜索(C语言实现)
  7. 软件工程技术--第一章 概述
  8. 工作点滴1 - Cisco IOS ver12.4 dampening bug - 思科路由器端口抑制漏洞
  9. Nginx 踩坑之405 not allow
  10. 爬虫增加代理池:使用稳定第三方芝麻代理IP 教程(详细可用)