• 首发公号: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. IOT设备连接上云

    如何让我的设备连接上云?参考如下路径. 云 [![](http://static-aliyun-doc.oss-cn-hangzhou.aliyuncs.com/assets/img/974556/1 ...

  2. 深入解析 Dubbo 3.0 服务端暴露全流程

    ​简介: 随着云原生时代的到来,Dubbo 3.0 的一个很重要的目标就是全面拥抱云原生.正因如此,Dubbo 3.0 为了能够更好的适配云原生,将原来的接口级服务发现机制演进为应用级服务发现机制. ...

  3. [TP5] 动态绑定指定默认模块, 解决: 控制器不存在:app\index\controller\Api

    当在 TP5 入口中简单使用 define('BIND_MODULE','index') 绑定默认模块后,访问 api 模块会提示: 控制器不存在:app\index\controller\Api 这 ...

  4. [ST] 音悦Tai 凉了,一段印记成为过去时

    互联网上依旧流传着音悦台的传说,过去十年间,你我也许都曾是音悦台的用户. 很多MV的右上角依然是 YinYueTai 的 Logo,比如 Siren-宣美,算是一个时代的印记吧. 互联网企业,即便是真 ...

  5. 记 dotnet 8.0.4 修复的 WPF 的触摸模块安全问题

    本文记录 dotnet 8.0.4 版本修复的 WPF 的触摸模块安全问题,此问题影响所有的 .NET 版本,修复方法是更新 SDK 和运行时 宣布安全漏洞地址: https://github.com ...

  6. 浅析mvvm模式和mvc模式的区别和联系

    三层架构与MVC模式 三层架构 三层架构是一种以实现"高内聚,底耦合"为目标,的代码架构方法,它将整个业务分为,表示层,业务层,数据访问层(Dao层). MVC模式 MVC模式是一 ...

  7. EFK+logstash构建日志收集平台

    一.环境 k8s集群: 控制节点:192.168.199.131  主机名:master  配置:4核6G 工作节点:192.168.199.128  主机名:monitor 配置:4核4G 1.1 ...

  8. 笔记06-第六讲 Cadence同一页面建立电气互连

    笔记06-第六讲 Cadence同一页面建立电气互连 内容: 90度和任意角度连线; 连线方式; 十字线添加/删除连接点; Net alias; 无连接的管脚处理; 注意事项. 连线有两种方式,右侧工 ...

  9. 三、Doris数据模型

    DorisDB根据摄入数据和实际存储数据之间的映射关系, 将数据表的明细表, 聚合表和更新表, 分别对应有明细模型, 聚合模型和更新模型. Aggregate (聚合模型) : 将表中的列分为了Key ...

  10. Threading Programming Guide:One

    苹果支持的产生线程的方式 Operation Object 使用OperationQueue,具体可以参考:Concurrency Programming Guide GCD 使用诸如dispatch ...