基本介绍
MLS&MCS(Multi-Level Security and Multi-Category Security)
多层安全技术是指强制实施Bell-La Padula
强制访问模型的安全方案。在MLS下,用户和进程称为Subject(主体)
,文件、设备和系统的其他组件称为Object(对象)
。主体和对象都标有安全级别,每个安全级别都由一个敏感度和一个类别组成。在SELinux
的情况下,一个进程(以“机密”级别运行)可以按当前级别进行读/写,但只能读取低级别的文件,或者写更高级别的文件(在被许可的情况下)。一个进程访问不同安全等级文件的示意图如下:
安全等级的组成部分
MLS / MCS 表示格式
以下是SELinux
中MLS/MCS等级表示的示意图:
其中各字段含义如下:
sensitivity
- 敏感度级别是分级的,一般来说s0最低。这些值是使用敏感性声明定义的。传统上,MLS系统的最大值是s15(尽管“参考策略”的最大值是构建时间选项)。对于MCS系统,仅定义了一个灵敏度,即s0。category
- 类别是可选的(即可以有零个或多个类别),并且它们将构成无序且不相关的列表。这些值是使用category语句定义的。C1,C3表示无序列表,而C1.C3则表示C1、C2、C3连续的列表。传统上,该值在C0和C255之间(尽管参考策略的最大值是构建时间选项),不过在我试验的Centos 7
已经达到了C1023。level
- 等级就是由敏感度和类别组成的
安全等级的构成
一个安全等级是由两个安全级别构成的范围标识的,就像下面这张图描述的那样:
对于等级下限表示的是当前进程或主体的等级,而上限则是表示能被许可访问的最高等级。对于SELinux
来说一般下限被设置为s0,而上限则被设置为s0:c0.c1023.用一下命令就能看到相关进程的安全等级范围:
[root@localhost /]# ps -Z
LABEL PID TTY TIME CMD
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 11360 pts/0 00:00:00 bash
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 13783 pts/0 00:00:00 man
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 13794 pts/0 00:00:00 less
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 14908 pts/0 00:00:00 ps
不同等级之间的访问控制
上面这张图中灰色的区域即表示了s0 - s3:c1.c5
安全等级进程所能访问的文件的等级标签。
虽然在模型中规定是可以往高等级文件写入的,不过实际情况中
SELinux
是不允许往高等级文件写入数据的,除非有特别许可。
在SELinux中使用MLS/MCS
本次实验的平台的是Centos7
,请在进行本次试验时,务必对系统进行快照备份,以便恢复。
由于MLS并不是很支持
X window
系统(图形界面),所以在开始下面操作之前,请永久切换为字符界面。
- 首先需要安装
selinux-policy-mls
包
[root@localhost /]# yum install -y selinux-policy-mls
- 修改配置文件
/etc/selinux/config
,以启用MLS
功能
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=permissive
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# mls - Multi Level Security protection.
SELINUXTYPE=mls
请务必将运行模式设置为
permissive
,否则可能重启后无法开机
- 使用
fixfiles
脚本在下一次重启后,重新标记系统文件
# 该命令会创建/.autorelabel文件
[root@localhost /]# fixfiles -F onboot
- 然后重启系统,将会看到如下输出,重新标记的时间取决于你的电脑性能,大概会持续8分钟。
*** Warning -- SELinux mls policy relabel is required.
*** Relabeling could take a very long time, depending on file
*** system size and speed of hard drives.
***********
最下面的星号*
,每一个即表示已经标记完了1000个文件。
- 在开机之后,由于我们运行在许可模式下,
SELinux
并不会阻止文件的访问,而只是单纯的记录不符合规则的访问。
使用如下指令查看,有哪些文件访问被记录了下来,需要对文件的等级进行修改,或者修改访问进程的等级已符合规则。如果为空(刚装的虚拟机
),就说明系统当前所有的进程的访问都是符合规则的,这时才能修改运行模式为enforce
,否则可能会出现系统运行异常崩溃的问题。
[root@localhost /]# grep "SELinux is preventing" /var/log/messages
修改MLS等级
- 修改
SELinux
用户的MLS等级标签
# 例如:semanage login --modify --range s3:c123 dask
# 可以不用设置MLS范围,而是直接设置当前的MLS等级,即只设置下限
[root@localhost /]# semanage login --modify --range (level) (selinux_user)
进程的上下文标识是继承自运行的用户的
- 修改文件的MLS等级标签
[root@localhost /]# chcon -R -l s2 /home/dask