• 首发公号:Rand_cs

SELinux 安全模型——MLS

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

    • $$l1.sensitivity \ge l2.sensitivity$$ l1的敏感度高于或等于l2
    • $$l2.category \subseteq l1.category$$ l1的类别是l2超集或等于l2
  • l1 is dominated by l2:
    • $$l1.sensitivity \le l2.sensitivity$$
    • $$l1.category \subseteq l2.category$$
  • l1 equals l2:
    • $$l1.sensitivity = l2.sensitivity$$
    • $$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

SELinux 安全模型——MLS的更多相关文章

  1. SELinux 与强制访问控制系统

    SELinux 全称 Security Enhanced Linux (安全强化 Linux),是 MAC (Mandatory Access Control,强制访问控制系统)的一个实现,目的在于明 ...

  2. centos:开启和关闭selinux

    5.4. Enabling and Disabling SELinux Use the /usr/sbin/getenforce or /usr/sbin/sestatus commands to c ...

  3. SELinux 和 iptables 开启关闭

    SELinux 是 2.6 版本的 Linux 内核中提供的强制访问控制(MAC)系统.对于目前可用的 Linux安全模块来说,SELinux 是功能最全面,而且测试最充分的,它是在 20 年的 MA ...

  4. Crontab定时任务配置

    CRONTAB概念/介绍 crontab命令用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行. cron 系统调度进程. 可以使用它在 ...

  5. Linux crontab 定时任务详解

    1.每小时执行一次脚本 * */1 * * * /etc/init.d/smb restart #不是所有的系统都支持“*/1”这种写法可以试试: 0 * * * * /etc/init.d/smb  ...

  6. Linux就这个范儿 第14章 身在江湖

    Linux就这个范儿 第14章 身在江湖 “有人的地方就有江湖”,如今的计算机世界就像一个“江湖”.且不说冠希哥有多么无奈,把微博当QQ的局长有多么失败,就说如此平凡的你我什么时候就成了任人摆布的羔羊 ...

  7. Linux实践篇--crontab定时任务

    原文出处:http://www.cnblogs.com/tracy/archive/2011/12/27/2303788.html.感谢作者的无私分享 一.  Crontab 介绍           ...

  8. crontab命令详解

    一. Crontab 介绍 1.crontab命令的功能是在一定的时间间隔调度一些命令的执行,我理解为windows下的任务计划. 2./etc/crontab 文件 在/etc目录下有一个cront ...

  9. [转] Linux Crontab 定时任务 命令详解

    一.  Crontab 介绍 crontab命令的功能是在一定的时间间隔调度一些命令的执行. 1.1 /etc/crontab 文件 在/etc目录下有一个crontab文件,这里存放有系统运行的一些 ...

  10. permission denied make_sock could not bind to address 81问题解决

    在apache中绑定非http标准端口时,一直出现如下的错误提示: [root@localhost ~]# /etc/init.d/httpd start Starting httpd: (13)Pe ...

随机推荐

  1. 函数模板 及显式具体化(C++)

    函数模板 将同一种算法应用与不同类型的函数时 #include<iostream> #include<string> template <typename T> v ...

  2. 力扣92(java&python)-反转链表Ⅱ(中等)

    题目: 给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right .请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 . ...

  3. 龙蜥社区开源 coolbpf,BPF 程序开发效率提升百倍 | 龙蜥技术

    简介: coolbpf,可以酷玩的BPF!来看看让BPF加了双翅膀的它究竟有多硬核? 文/系统运维 SIG(Special Interest Group) 引言 BPF 是一个新的动态跟踪技术,目前这 ...

  4. Flink 1.13,面向流批一体的运行时与 DataStream API 优化

    简介: 在 1.13 中,针对流批一体的目标,Flink 优化了大规模作业调度以及批执行模式下网络 Shuffle 的性能,以及在 DataStream API 方面完善有限流作业的退出语义. 本文由 ...

  5. 浅谈 Linux 高负载的系统化分析

    ​简介: 浅谈 Linux 高负载的系统化分析,阿里云系统组工程师杨勇通过对线上各种问题的系统化分析. 讲解 Linux Load 高如何排查的话题属于老生常谈了,但多数文章只是聚焦了几个点,缺少整体 ...

  6. Morphling:云原生部署 AI , 如何把降本做到极致?

    ​简介: Morphling 本意是游戏 Dota 中的英雄"水人",他可以根据环境要求,通过灵活改变自身形态,优化战斗表现.我们希望通过 Morphling 项目,实现针对机器学 ...

  7. 基于 MaxCompute + Hologres 的人群圈选和数据服务实践

    ​简介: 本文主要介绍如何通过 MaxCompute 进行海量人群的标签加工,通过 Hologres 进行分析建模,从而支持大规模人群复杂圈选场景下的交互式体验,以及基于API的数据服务最佳实践. 本 ...

  8. [FAQ] Cannot use object of type MongoInt64 as array

    此类情况出现在 需要使用字符串/数组,实际却使用了对象. 解决方式是调试数据,对数据类型进行转换即可. MongoInt64 对象提供 __toString 方法,那么可以强转成 64 位 integ ...

  9. [FAQ] 腾讯企业邮箱成员的名字如何多次更改 ?

    可以通过给成员的邮箱增加别名,先点击成员信息最右侧的 "编辑",在编辑页面顶部的 "更多操作" 这个按钮中,比较隐蔽. Refer:腾讯邮箱成员名字更改 Lin ...

  10. 用 SetWindowPos 方法设置一个停止响应的窗口将卡调用方

    我使用 User32 的 SetWindowPos 方法去设置一个跨进程的窗口,这个窗口是停止响应的,将让调用的 SetWindowPos 方法卡住,不继续执行逻辑.通过堆栈分析是卡在 NtUserS ...