BLP 模型
- 公号:Rand_cs
BLP 模型
本篇文章是调研了许多资料后对 BLP 模型的一个总结
MLS,Multi-level Security,主要关心的是数据机密性
D. Elliott Bell 和 Leonard J. LaPadula 在 1996 年提出了基本的 BLP 模型,主要有两个性质:
- The Simple Security Property states that a subject at a given security level may not read an object at a higher security level.
即 no read up,主体不能够“读”比自己安全级别高的客体,可以向下读以及平级读
- The * (Star) Security Property states that a subject at a given security level may not write to any object at a lower security level.
即 no write down,主体不能够“写”比自己安全级别低的客体,可以向上写或平级写
(据说第二条性质叫做 *-property 是因为最开始不知道取什么名字,然后随手写下 *-property,后来也没找到更好的名字,于是这个名字就这样被草率的保留下来)

MIC,mandatory integrity control,关心的数据的完整性
相关理论模型为 Biba Model,一般来说写操作我们认为是可能会破坏数据的完整性,所以从数据完整性的角度来看,客体只信任级别比它高的主体对它进行写操作,模型中举了一个现实中的例子:将军可以给士兵下达命令,但是反过来不行。
Biba Model 同样也定义了两条规则,与 BLP 完全相反:
- The Simple Integrity Property states that a subject at a given level of integrity must not read data at a lower integrity level (no read down).
- The * (star) Integrity Property states that a subject at a given level of integrity must not write to data at a higher level of integrity (no write up).
对于 完整性级别和安全性级别的关系,在 PitBull 系统中,完整性级别 = 安全性级别

后来 BLP 模型也考虑一定的数据完整性,对 *-property 这条性质加强,提出 Strong Star Property:主体只能对同级别的客体进行写操作,不再允许向上写。

而 SELinux 里,没有实现 MIC,但是实现的 MLS 中满足此 Strong Star Property。
上述都是理论模型,想要落地到实践,具体在某个操作系统上实现,只有上述概念不够。最明显的一个例子就是调度器这样的主体,它的功能是分发调度进程,调度需要换出换进所有其他进程的上下文,相当于说调度器需要读写所有安全级别的进程,那么应该给调度器什么安全级别?如果只有上述的概念,给什么级别都不行,给高安全级别,但是它要写低安全级别信息,给低安全级别但它又要读取高安全级别的信息。再者,在现实的系统中,安全级别可能需要动态的变化来保证一定的灵活性,比如说不同级别的用户先后从同一个 tty 登录,那相应的 tty 文件的级别应该也是不一样的,这就需要 tty 的级别动态的变化。
为此,BLP 模型又做了改进,引入了可信主体的概念,就相当于给某个主体开个后门,开放所有权限。
但是又有问题,这个后门开的太大了,直接就放开所有权限,认为此主体完全可信,这是有悖于 principle of least privilege 最小特权原则。在 Linux 的 DAC 模型中,如果需要特权操作直接给 root 权限,也是有悖于最小特权原则,所以有了 capability 将能力细分,有了 MAC 更加精细的进行访问控制。
因此,现实中对一个实体的信任只能在一定范围内,一个可信实体能同时获取所有的特权是不合理的。所以后来对 BLP 模型再做改进,一些需要特权操作的主体只有在指定的范围内是可信的,这样可以把权利非常集中的可信主体变换成权利相对分散的多个部分可信主体,符合最小特权原理。
对于如何实现特权分散,一些官方(Bell 等人、SELinux 等等) 后来一直都没有提出明确公开的理论模型,至少从目前公开的资料来看是这样。但是有相应的概念提出,在 GEMSOS 和 DG/UX 系统的一些手册和论文当中,明确提出了单级实体,多级实体的概念。这里的单级实体就是说主体和客体就一个安全级别标签,多级实体表示主体和客体有多个安全级别标签,可以看做是安全级别范围。网上也有一部分人提出了有关多级实体的理论模型,并提供了相应的数学证明。
总的来说,提出的方案便是多级实体。每个实体的有一个安全级别范围,主体访问客体时安全级别比较有了更大的灵活性。比如说对于某些主体想要进行特权操作(违反 BLP 的两条规则),现在就可以不用给它完全可信主体的属性,放开所有权限。因为有了级别范围,可以在级别比较时多增加一些判断条件来达到 信任只保证在一定范围内的目的。
(另外使用安全级别范围的形式,还可以用来实现 MIC 来保证数据完整性,具体怎么操作待调研)
具体以 SELinux 中对 BLP 模型的实现来说明:
SELinux 中安全上下文的格式如下:

其中第四部分为安全级别范围,低安全级别表示当前有效的安全级别,高安全级别只有进行特权操作时才会用到。
SELinux 中使用 mlsconstrain 语句检查主体客体的安全级别是否符合 BLP 模型,语法格式如下:
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;
其中 l1 表示主体的低安全级别,h1 表示主体的高安全级别,l2 表示客体的低安全级别,h2 表示客体的高安全级别,t1、t2 分别为主体客体的类型,也可以看做是属性,给主体一个 “部分可信属性” 就是在此部分实现。
在 SELinux 当中,对于安全级别之间的比较有 4 情况,l1 dom l2,表示主体的安全级别大于等于客体的安全级别, l1 domby l2 表示小于等于,l1 eq l2 表示相等,l1 incom l2 表示不相关(本文不涉及)
SELinux 当中对于“读”操作的限制:
mlsconstrain { dir file lnk_file chr_file blk_file sock_file fifo_file } { read getattr execute }
(( l1 dom l2 ) or
(( t1 == mlsfilereadtoclr ) and ( h1 dom l2 )) or
( t1 == mlsfileread ) or
( t2 == mlstrustedobject ));
如果 l1 和 l2 表示主体和客体当前有效的安全级别,如果 l1 dom l2,说明主体安全级别高于或等于客体,可以读
否则说明主体安全级别小于客体,表明主体想要进行特权操作了,那么需要客体当前有效的安全级别落在主体的安全级别范围内,即 l1 <= l2 <= h1,另外这个主体还需要 “部分可信主体属性” t1 = mlsfilereadtoclr
上面两条都不满足,如果主体具有 “完整的可信主体读属性”,或者 客体具有 “可信客体属性”,那么也允许读。(可信客体这个概念应该是 SELinux 中使用的,其他地方暂时为看见)
SELinux 当中对 “写” 操作的限制:
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
(( t1 == mlsfilewritetoclr ) and ( h1 dom l2 ) and ( l1 domby l2 )) or
(( t2 == mlsfilewriteinrange ) and ( l1 dom l2 ) and ( h1 domby h2 )) or
( t1 == mlsfilewrite ) or
( t2 == mlstrustedobject ));
如果 l1 = l2,说明主体和客体的低安全级别相等,允许写。这里便是实现 strong *-property 的地方,按照最初的 BLP 模型,这里应该是 l1 domby l2 的时候都允许写,但现在加强了,只有主体和客体的安全级别相等的时候才允许写。
如果低安全级别主体想要往高安全级别客体写,即 l1 domby l2(这里其实就是 l1 < l2,没有等于,应为如果有等于,则在 l1 eq l2 的时候便会判断通过了),说明想要违反 strong *-property,违反完整性规则,那么需要额外条件 h1 dom l2,可以这样理解:因为在完整性规则描述中,高级别可以向低级别进行写操作,所以既然主体的低安全级别已经小于了客体的低安全级别,那么就必须要满足主体的高安全级别大于客体的低安全级别(主体的安全级别范围里至少有一个要大于等于客体的安全级别)。另外,该主体还需要有 “部分可信主体属性” t1=mlsfilewritetoclr
如果高级别主体想要往低级别客体进行写操作,即 l1 dom l2(这里其实就是 l1 > l2,没有等于,应为如果有等于,则在 l1 eq l2 的时候便会判断通过了),这是在最初的 BLP 模型中就是禁止的。想要进行此操作需要额外条件 h1 domby h2,可以这样理解:最初的 BLP 模型中所说 低级别主体可以向高级别主体写,所以虽然现在主体的低安全级别大于了客体的低安全级别,那么只要主体的高安全级别小于客体的高安全级别那也可以放行(客体的安全级别范围中至少有一个要大于等于主体的安全级别)。另外,该客体还需要有 “部分可信客体属性”,这里因为向下写是将信息泄露到下级客体,所以需要客体可信。
上面两条都不满足的话,如果主体具有 “完整的可信主体写属性”,或者客体具有 “可信客体属性”,那么也允许写。
从上面可以看出如果主体想要进行特权操作,仍然需要安全级别范围满足一定条件,并且具有“部分可信”的属性,满足最小特权原则。
相关文献:
Bell Padula 提出的 BLP 数学模型
https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.20.6361&rep=rep1&type=pdf
BLP Model Wiki
https://en.wikipedia.org/wiki/Bell–LaPadula_model
对 BLP 模型做了很好的阐释
https://www.acsac.org/2005/papers/Bell.pdf
Biba Model Wiki
https://en.wikipedia.org/wiki/Biba_Model
PitBull and SELinux Mandatory Access Control Systems
Bell 第一次在文献中提出安全级别范围,也是一堆数学证明
https://gfbix45521e79b0484907s5ukov9oqbb0065kvfiiz.eds.tju.edu.cn/stamp/stamp.jsp?tp=&arnumber=8113
DG/UX Unix 系统安全手册,它的 MAC 机制就是 MLS,其中用到的是多级实体
GEMSOS 系统安全方面的论文,明确提出了单级主体,多级主体,单级客体,多级客体的概念
https://www.nist.gov/system/files/documents/2016/09/15/aesec_rfi_mls-rtos.pdf
- 首发公号:Rand_cs
BLP 模型的更多相关文章
- BLP模型
编号:1002时间:2016年3月29日16:24:33功能:多级安全BLP模型 URL:http://blog.csdn.net/longronglin/article/details/150033 ...
- Biba模型(MAC)
毕巴模型用完整性级别来对完整性进行量化描述. 设i1和i2是任意两个完整性级别,如果完整性级别为i2的实体比完整性级别为i1的实体具有更高的完整性,则称完整性级别i2绝对支配完整性级别i1,记为:i ...
- 一种面向云服务的UCON多义务访问控制方法及系统
)设置每一云服务的义务项:建立每一云服务所包含的义务图:2)根据用户所请求的云服务查找该云服务的所有强制义务图和可选义务图,并提取该用户对该云服务的历史完成情况:3)对每一强制义务图,监控其每一义务项 ...
- BLP(Bell–LaPadula模型)(MAC)
Bell-LaPadula模型侧重于数据的保密性和对机密信息的受控访问 基于状态机,该状态机在一个计算机系统中具有一组允许的状态,并且从一个状态到另一种状态的转换由状态转移函数定义. 该模型定义了一个 ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库
在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...
- ASP.NET Core MVC/WebAPi 模型绑定探索
前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用 ...
- ASP.NET路由模型解析
大家好,我又来吹牛逼了 ~-_-~ 转载请注明出处:来自吹牛逼之<ASP.NET路由模型解析> 背景:很多人知道Asp.Net中路由怎么用的,却不知道路由模型内部的运行原理,今天我就给大家 ...
- 高性能IO模型浅析
高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking ...
- 探索ASP.NET MVC5系列之~~~4.模型篇---包含模型常用特性和过度提交防御
其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...
- 隐马尔科夫模型python实现简单拼音输入法
在网上看到一篇关于隐马尔科夫模型的介绍,觉得简直不能再神奇,又在网上找到大神的一篇关于如何用隐马尔可夫模型实现中文拼音输入的博客,无奈大神没给可以运行的代码,只能纯手动网上找到了结巴分词的词库,根据此 ...
随机推荐
- Exception in thread "main" java.util.NoSuchElementException
Exception in thread "main" java.util.NoSuchElementException 用了两个scanner的时候,执行程序发生报错:Except ...
- 面试题 02.07(Java). 链表相交(简单)
题目: 本题与:力扣160相交链表 一致 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点.如果两个链表没有交点,返回 null . 图示两个链表在节点 c ...
- 力扣1077(MySQL)-项目员工Ⅲ(中等)
题目: 写 一个 SQL 查询语句,报告在每一个项目中经验最丰富的雇员是谁.如果出现经验年数相同的情况,请报告所有具有最大经验年数的员工. 查询结果格式在以下示例中: employee_id 为 1 ...
- 力扣28(java)-实现 strStr()(简单)
题目: 实现 strStr() 函数. 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始).如果不存 ...
- HarmonyOS NEXT应用开发案例——全屏登录页面
全屏登录页面 介绍 本例介绍各种应用登录页面. 全屏登录页面:在主页面点击跳转到全屏登录页后,显示全屏模态页面,全屏模态页面从下方滑出并覆盖整个屏幕,模态页面内容自定义,此处分为默认一键登录方式和其他 ...
- OpenKruise v0.8.0 核心能力解读:管理 Sidecar 容器的利器
简介: OpenKruise 是阿里云开源的云原生应用自动化管理套件,也是当前托管在 Cloud Native Computing Foundation (CNCF) 下的 Sandbox 项目.它来 ...
- 基于WASM的无侵入式全链路A/B Test实践
简介: 我们都知道,服务网格(ServiceMesh)可以为运行其上的微服务提供无侵入式的流量治理能力.通过配置VirtualService和DestinationRule,即可实现流量管理.超时重试 ...
- 如何高效完成ECS多环境部署?
简介:通过本文,你可以了解到,如何通过云效流水线有效拉通开发与运维,打破二者之间的壁垒墙,让开发与运维高效联动.在软件开发和部署过程中,我们的软件往往需要在不同的运行环境中运行,例如:开发人员本地开 ...
- NopCommerce 多数据库方案
本文转自:http://www.cnblogs.com/YUTOUYUWEI/p/5538200.html 有时候一个项目需要连接多个数据库,以实现不同数据库的数据在同个项目的共享. 如果已经安装了n ...
- 习题8 #第8章 Verilog有限状态机设计-3 #Verilog #Quartus #modelsim
3. 编写一个8路彩灯控制程序,要求彩灯有以下3种演示花型. (1) 8路彩灯同时亮灭: (2) 从左至右逐个亮(每次只有1路亮): (3) 8路彩灯每次4路灯亮,4路灯灭,且亮灭相间,交替亮灭. 在 ...