SELinux 安全模型——MLS

首发公号:Rand_cs
BLP 模型:于1973年被提出,是一种模拟军事安全策略的计算机访问控制模型,它是最早也是最常用的一种多级访问控制模型,主要用于保证系统信息的机密性,是第一个严格形式化的安全模型

暂时无法在飞书文档外展示此内容

在这里插入图片描述

多层安全的核心:“数据流向只能是由低到高(或者平级流动)”,所以只能向上写数据,从下层读数据,或者同级之间读写数据。

此图有四个安全级别,由低到高分别为:unclassified → restricted → confidential → secret

进程和4个文件的安全级别如上图所示:

  • 进程只能写文件A,不能读。因为文件A的安全级别程度高于进程,所以进程不能读。但是数据流向可以由低到高,所以进程可以向文件A进行写操作
  • 进程和文件B是同级,所以数据流向可以双向流通,即进程可以读写文件B
  • 文件C的安全级别低于进程,所以数据流向只能是文件到进程,即进程只能读取文件数据,不能写。假如进程可以写文件C,那么confidential的数据流向了restrict类型的文件,则该confidential数据可能被其他的restrict级别的进程读取,造成机密信息泄露,所以高级别进程只能对低级别文件进行读操作。

Context

MLS 模式在 SELinux 中是可选的,在编译时期开启,SELinux 的编译工具有 checkpolicy 或者 checkmodule,当使用这两个命令时加上选项 -M 便可以开启多层安全模式。这时你的策略应该也要支持 MLS,也就是定义某个文件的安全上下文的时候应该带上它的 mls/mcs

开启多层安全后安全上下文扩展最后一个字段 “安全级别(Security Level or Level)”,安全上下文完整形式如下所示:

安全级别分为两个部分,敏感度和类别,敏感度可以对文件分级,类别对文件分类,具体如下所示:

在这里插入图片描述

sensitivity

敏感度,必须要有

定义方式:

sensitivity s0;
sensitivity s1;
sensitivity s2;
sensitivity s3 alias secret;  //给s3定义个别名secret

优先级高低定义:

dominance { s0 s1 s2 s3 }   #优先级从低到高,即s0最低,s3最高

category

类别,可选

定义方式:

category c0 alias blue;
category c1 alias red;
category c2 alias green;
category c3 alias orange;
category c4 alias white;

level

安全级别:一个敏感度和零个或多个类别的组合,即 sensitivity[:category...] 这个整体就是安全级别

有两个安全级别:低安全级别-高安全级别,高安全级别可选。

定义方式:

level  s0:c0.c2;      #此安全级别的敏感度为s0,类别为c0 c1 c2,即 . 表示范围
level  s1:c0.c2,c4;   #此安全级别的敏感度为s1,类别为c0 c1 c2 c4,没有c3,即,表示分开的两段类别 
安全级别之间的关系
  • l1 dominates l2
    • l 1. s e n s i t i v i t y ≥ l 2. s e n s i t i v i t y l1.sensitivity \ge l2.sensitivity l1.sensitivityl2.sensitivity l1的敏感度高于或等于l2
    • l 2. c a t e g o r y ⊆ l 1. c a t e g o r y l2.category \subseteq l1.category l2.categoryl1.category l1的类别是l2超集或等于l2
  • l1 is dominated by l2:
    • l 1. s e n s i t i v i t y ≤ l 2. s e n s i t i v i t y l1.sensitivity \le l2.sensitivity l1.sensitivityl2.sensitivity
    • l 1. c a t e g o r y ⊆ l 2. c a t e g o r y l1.category \subseteq l2.category l1.categoryl2.category
  • l1 equals l2:
    • l 1. s e n s i t i v i t y = l 2. s e n s i t i v i t y l1.sensitivity = l2.sensitivity l1.sensitivity=l2.sensitivity
    • l 1. c a t e g o r y = l 2. c a t e g o r y l1.category = l2.category l1.category=l2.category
  • l1 is incomparable to l2
    • !(l1 dom l2) && !(l2 dom l1)

具体代码:

struct mls_level {
    u32 sens;       /* sensitivity */ //敏感度,一个整数
    struct ebitmap cat; /* category set */  //类别,一个位图
};
//range:低安全级别-高安全级别
struct mls_range {
    struct mls_level level[2]; /* low == level[0], high == level[1] */
};

static inline int mls_level_eq(struct mls_level *l1, struct mls_level *l2)
{
    
    return ((l1->sens == l2->sens) &&    //敏感度相同
        ebitmap_cmp(&l1->cat, &l2->cat));  //类别集合也相同
}

static inline int mls_level_dom(struct mls_level *l1, struct mls_level *l2)
{
    return ((l1->sens >= l2->sens) &&   //敏感度大于等于
        ebitmap_contains(&l1->cat, &l2->cat));  //类别集合要包含
}

//两个安全级别不相关
#define mls_level_incomp(l1, l2) \
(!mls_level_dom((l1), (l2)) && !mls_level_dom((l2), (l1)))

//l2安全级别在 l1 l3 之间
#define mls_level_between(l1, l2, l3) \
(mls_level_dom((l1), (l2)) && mls_level_dom((l3), (l1)))

//l1-h1 包含 l2-h2
#define mls_range_contains(r1, r2) \
(mls_level_dom(&(r2).level[0], &(r1).level[0]) && \
 mls_level_dom(&(r1).level[1], &(r2).level[1]))

通过 mlsconstrain 实现 BLP 模型:

mlsconstrain 又是另外一个策略语法,直接来看例子:

mlsconstrain  class_set  perm_set  expression ;
#expression部分为u r t l h的布尔表达式
#u1, r1, t1, l1, h1 – source user, role and type, low security level, high security level; 
#u2, r2, t2, l2, h2 – target user, role and type, low security level, high security level;

举例说明:mlscontrain file read (l1 dom l2); 此语句说明当源进程想要读取目标文件时,需要源进程的安全级别 l1 高于或等于目标文件的安全级别 l2

实现 no read up,即只能读取同级别或者低级别的数据

mlsconstrain { dir file lnk_file chr_file blk_file sock_file fifo_file } { read getattr execute } ((l1 eq l2) or ( l1 dom l2 ) or (t1 == mlsfileread));
  • l1 eq l2 表示 源和目标的安全级别相同,所以对于 dir file 等类型文件的 read getattr execute 操作可以执行
  • l1 dom l2,表示源的安全级别高于目标的安全级别,高级别可以读取低级别,所以此情况下 dir file 等类型文件的 read getattr execute 操作也允许执行
  • 再或者我们可以特殊定义一个类型,只要源类型是 mlsfileread,那么就可以执行读取操作

实现 no write down,即只能写同级别或者高级别的数据:

mlsconstrain { file lnk_file fifo_file dir chr_file blk_file sock_file } { write create setattr relabelfrom append unlink link rename mounton }  (( l1 eq l2 ) or (l1 domby l2) or (t1 == mlsfilewrite)); 

含义基本同上,只不过是反着来。上述就是 SELinux 中实现 BLP 的两个例子,想要完整的实现,还有其他的策略,有兴趣的可以去看 refpolicy 的源码

好了,本文先到这里,有什么问题欢迎来讨论交流
首发公号:Rand_cs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/285439.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

盾构机数据可视化监控平台 | 图扑数字孪生

2002 年,中国 863 计划把盾构机列为国家关键技术,以国家力量为主导,集中力量进行盾构机专项研究。在 2008 年,中国成功研制出属于自己的国产盾构机——中国中铁一号,同时还打通了天津地铁 1500m 的隧道。此举更彻底地打破了国内盾…

【Java基础篇】While(true) 和 for(;;)哪个性能更好呢

两个无限循环的性能分析 ✔️两者反编译比较 ✔️两者反编译比较 While(true) 和 for(; 😉 都是做无限循环的代码,他们两个有什么区别呢? 关于这个问题,网上有很多的讨论,今天我收到私信,所以凑着假期&…

【C++】Ubuntu编译filezilla client

在新版Ubuntu 22.04.3 LTS上编译filezilla client成功,shell命令如下: sudo apt-get install libfilezilla-dev libwxbase3.0-dev gnutls-dev libdbus-1-dev sudo apt-get install libwxgtk3.0-gtk3-dev sudo apt-get install libgtk-3-dev sudo apt-ge…

【力扣100】78.子集

添加链接描述 class Solution:def subsets(self, nums: List[int]) -> List[List[int]]:# 思路是回溯,这道题和【全排列】不一样的地方是出递归(收获)的判断条件不一样def dfs(path,index,res):res.append(path[:])for i in range(index,…

【C++杂货铺】C++11新特性——可变参数模板

文章目录 一、可变模板参数相关概念的引入二、获取参数包中参数的个数三、递归函数方式展开参数包四、逗号表达式展开参数包五、可变模板参数的实际应用——emplace相关接口5.1 回顾一下 push_back 的三种用法5.2 emplace_back 使用方法介绍5.3 听说 emplace_back 可以提高效率…

三菱人机交互GT Designer的使用(三,指示灯,数值显示与输入,字符串显示与输入,日期|时间的显示)

今天继续对GT进行学习,如有不妥,欢迎指正!!! 目录 指示灯设置 设置指示灯 位指示灯 字指示灯 数值输入,输出(二者差距不大) 数值显示与输出 数值显示(只能显示&…

Spring-JdbcTemplate

1.什么是JdbcTemplate (1)spring框架对JDBC进行封装,使用JdbcTemplate方便实现对数据库操作 2.准备工作 (1) 引入相关jar druid.jar ,mysql.jar , spring-jdbc.jar,spring-tx.jar,spring-orm.jar (2)在spring配置 连接池 <!--数据源--><bean id"ds" class&q…

【GitHub】ssh: connect to host github.com port 22: Connection refused

本地使用git上传GitHub仓库时发现的一个报错&#xff0c;以为是本机连不上github了&#xff0c;ping过后发现能够正常访问&#xff0c;于是上网找到了一个很完美的解决方案 原因&#xff1a;22端口被占用或被防火墙屏蔽 解决方法&#xff1a;切换GitHub的443端口 1.首先找到…

普中STM32-PZ6806L开发板(HAL库函数实现-PWM呼吸灯)

简介 实现PWM呼吸灯。 主芯片 STM32F103ZET6呼吸灯引脚 : PC7电路原理图 LED8 电路图 LED8 与 主芯片连接图 其他知识 公式 PWM周期公式: Tpwm ( (ARR 1) * (PSC 1) ) / Tclk Tclk为定时器的输入时钟频率 Tout则为定时器溢出时间 ARR为计数周期 PSC为预分频器的值…

undefined reference to `pthread_create‘的另外一种解法

背景 编译带有thread的程序人&#xff0c;如果忘记-lpthread&#xff0c;那么就会报错 解决办法一&#xff1a;添加-lpthread 很简单添加-lpthread就行了 解决办法二&#xff1a;升级glibc 在高版本的glibc上&#xff0c;可能无需增加-lpthread Why glibc 2.34 removed li…

数字图像处理(3)——频域图像增强

&#x1f525;博客主页&#xff1a;是dream &#x1f680;系列专栏&#xff1a;深度学习环境搭建、环境配置问题解决、自然语言处理、语音信号处理、项目开发 &#x1f498;每日语录&#xff1a;贤才&#xff0c;难进易出&#xff1b;庸才&#xff0c;易进易初出&#xff1b;…

区块链复习

文章目录 考试重点哈希碰撞哈希函数的应用哈希算法对称加密密钥解决方法 椭圆曲线加密算法数字签名国密算法第一章第二章比特币比特币公钥 区块比特币的信息查询去中心化与分布式BIP治理结构 第三章 比特币区块结构头哈希值的作用&#xff1a;防篡改自然分叉&#xff1a; 交易数…

MySQL数据库学习一

1 什么是数据库的事务&#xff1f; 1.1 事务的典型场景 在项目里面&#xff0c;什么地方会开启事务&#xff0c;或者配置了事务&#xff1f;无论是在方法上加注解&#xff0c;还 是配置切面。 <tx:advice id"txAdvice" transaction-manager"transactionMa…

CodeWave 3.4版本新特性AI智能助手功能的革新与实践

目录 1 前言2 CodeWave 3.4版本&#xff1a;AI智能助手功能的新特性2.1 逻辑生成2.2 逻辑解读 3 CodeWave提供了全方位的逻辑组件4 AI智能助手功能的实践案例4.1 生成逻辑的实践4.2 解读逻辑的实践4.3 CodeWave的解读描述和逻辑的对比 5 结语 1 前言 在数字化时代&#xff0c;…

【ModelScope】从入门到进阶

计算机视觉任务 任务&#xff08;Task&#xff09;中文任务&#xff08;Task&#xff09;英文任务说明单标签图像分类image-classification对图像中的不同特征根据类别进行区分通用图像分割image-segmentation识别图像主体与图像背景进行分离文字检测ocr-detection将图像中的文…

Ansible自动化运维(一)简介及部署、清单

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

python设计模式:模板方法模式

更多Python学习内容&#xff1a;ipengtao.com 软件设计和编程中&#xff0c;设计模式是一种有助于解决常见问题的强大工具。其中之一是"模板方法模式"&#xff0c;它是一种行为型设计模式&#xff0c;允许你定义一个算法的骨架&#xff0c;但将一些步骤的具体实现延迟…

微功遥测终端机RTU:守护城市生命线的智能卫士

在城市的繁华背后&#xff0c;隐藏着一套高效运转的“生命线”——排水系统。而在这条生命线上&#xff0c;微功遥测终端机RTU(MGTR-W4131U)发挥着不可或缺的作用&#xff0c;为城市的正常运转提供了坚实保障。 微功遥测终端机RTU(MGTR-W4131U)&#xff0c;顾名思义&#xff0…

Redis双写一致性

文章目录 Redis双写一致性1. 延迟双删&#xff08;有脏数据风险&#xff09;2. 异步通知&#xff08;保证数据最终一致性&#xff09;3. 分布式锁&#xff08;数据的强一致&#xff0c;性能低&#xff09; Redis双写一致性 当修改了数据库的数据也要同时更新缓存的数据&#xf…

云计算:OpenStack 分布式架构添加NFS存储(单控制节点与多计算节点)

目录 一、实验 1.环境 2.安装并配置NFS节点 3.安装并配置存储节点storage02 4.使用NFS存储 一、实验 1.环境 (1) 主机 表1 主机 主机架构IP备注controller控制节点192.168.204.210已部署compute01计算节点1192.168.204.211 已部署compute02计算节点2192.168.204.212已部…
最新文章