4.13. 多级别安全(MLS)
多级安全技术指的是一种安全策略,它强制执行Bell-La Padula Mandatory Access Model。在 MLS 下,用户和进程称为 主体,而系统的文件、设备和其他被动组件称为 对象。主体和对象都标记为安全级别,该级别要求主体的授权或对象分类。每个安全级别都由一个 敏感度 组成 , 例如,内部发行时间表按照具有机密敏感度的内部文件类别提交。
图 4.1 “国家级别” 显示美国国防社区最初设计的许可级别。关于上述内部时间表示例,只有获得机密许可的用户才能查看机密类别中的文件。但是,只有保密许可的用户不得查看需要更高等级或资格的文件;只允许他们读取较低级别的文件,并且能够访问更高等级的文件。
图 4.1. 国家级别

[D]
图 4.2 “使用 MLS 允许的数据流” 显示在"Secret"安全级别下运行的对象和具有不同安全级别的各种对象之间的所有允许的数据流。简而言之,Bell-LaPadula 模型强制执行两种属性: 无读写 。
图 4.2. 使用 MLS 允许的数据流

[D]
4.13.1. MLS 和系统特权
MLS 访问规则始终与传统的访问权限(文件权限)结合使用。例如,如果具有安全等级为 "Secret" 的用户使用 Discretionary Access Control(DAC)来阻止其他用户对文件的访问,这也会阻止具有安全等级 "Top Secret" 的用户访问。务必要记住,在 DAC 规则 后 检查 SELinux MLS 策略规则。较高的安全许可不会自动授予任意浏览文件系统的权限。
拥有顶级别的用户不会自动获得多级系统的管理权限。虽然这些用户可能可以访问计算机上的所有信息,但是这与具有管理权是不同的。
4.13.2. 在 SELinux 中启用 MLS
注意
不建议在运行 X Window 系统的系统上使用 MLS 策略。
按照以下步骤在您的系统上启用 SELinux MLS 策略。
过程 4.19. 启用 SELinux MLS 策略
- 安装 selinux-policy-mls 软件包:
~]#
yum install selinux-policy-mls - 在启用 MLS 策略之前,必须使用 MLS 标签重新标记文件系统中的每个文件。重新标记文件系统时,可能会拒绝访问受限域,这可能会妨碍系统正确启动。要防止发生这种情况,请在
/etc/selinux/config
文件中配置SELINUX=permissive
。另外,通过配置SELINUXTYPE=mls
来启用 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
- 确保 SELinux 以 permissive 模式运行:
~]#
setenforce 0~]$
getenforce Permissive - 使用 fixfiles 脚本创建包含 the
-F
选项的/.autorelabel
文件,以确保在下次重启时重新标记文件:~]#
fixfiles -F onboot - 重启您的系统。在下一次启动期间,将根据 MLS 策略重新标记所有文件系统。标签进程使用适当的 SELinux 上下文标记所有文件:
*** 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 个文件。在上例中,eleven*
字符代表 11000 文件,它们已被标记。标记所有文件所需的时间取决于系统上的文件数量以及硬盘驱动器的速度。在现代系统中,此过程只需 10 分钟。标签过程完成后,系统将自动重新引导。 - 在 permissive 模式中,SELinux 策略不会被强制实施,但是仍会记录在 enforcing 模式运行时会被拒绝的操作。在更改为 enforcing 模式之前,以 root 身份输入以下命令,以确认 SELinux 在上一次启动期间没有拒绝操作。如果在上一次启动期间 SELinux 没有拒绝操作,这个命令不会返回任何输出。如果在引导过程中 SELinux 拒绝访问,请参阅 第 11 章 故障排除。
~]#
grep "SELinux is preventing" /var/log/messages - 如果
/var/log/messages
文件中没有拒绝信息,或者在/etc/selinux/config
文件中配置SELINUX=enforcing
:# 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=enforcing # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=mls
- 重启您的系统并确保 SELinux 以 enforcing 模式运行:
~]$
getenforce Enforcing启用了 MLS 策略:~]#
sestatus |grep mls Policy from config file: mls
4.13.3. 使用特定 MLS 范围创建用户
按照以下步骤创建具有特定 MLS 范围的新 Linux 用户:
过程 4.20. 使用特定 MLS 范围创建用户
- 使用 useradd 命令添加新 Linux 用户,并将新的 Linux 用户映射到现有的 SELinux 用户(本例中为
staff_u
):~]#
useradd -Z staff_u john - 为新创建的 Linux 用户分配密码:
prompt~]# passwd john
- 以 root 身份输入以下命令,以查看 SELinux 和 Linux 用户之间的映射。输出应如下:
~]#
semanage login -l Login Name SELinux User MLS/MCS Range Service __default__ user_u s0-s0 * john staff_u s0-s15:c0.c1023 * root root s0-s15:c0.c1023 * staff staff_u s0-s15:c0.c1023 * sysadm staff_u s0-s15:c0.c1023 * system_u system_u s0-s15:c0.c1023 * - 为用户
john
定义特定范围:~]#
semanage login --modify --range s2:c100 john - 再次查看 SELinux 和 Linux 用户之间的映射。请注意,用户
john
现在定义了一个特定的 MLS 范围:~]#
semanage login -l Login Name SELinux User MLS/MCS Range Service __default__ user_u s0-s0 * john staff_u s2:c100 * root root s0-s15:c0.c1023 * staff staff_u s0-s15:c0.c1023 * sysadm staff_u s0-s15:c0.c1023 * system_u system_u s0-s15:c0.c1023 * - 如果需要,请输入以下命令更正 john 主目录中的标签:
~]#
chcon -R -l s2:c100 /home/john
4.13.4. 设置 Polyinstantiated 目录
/tmp
和 /var/tmp/
目录通常由所有程序、服务和用户使用。但是,此类设置使得这些目录容易遭受竞争条件攻击,或者存在基于文件名的信息泄漏。SELinux 以 多形目录 的形式提供解决方案。这实际上意味着 /tmp
和 /var/tmp/
都被实例化,使它们对每个用户都会出现私有状态。启用目录实例化后,每个用户的 /tmp
和 /var/tmp/
目录都会自动挂载在 /tmp-inst
和 /var/tmp/tmp-inst
下。
按照以下步骤启用目录的多形化:
过程 4.21. 启用 Polyinstantiation 目录
- 取消注释
/etc/security/namespace.conf
文件中的最后三行,以启用对/tmp
、/var/tmp/
和用户主目录的实例化:~]$
tail -n 3 /etc/security/namespace.conf /tmp /tmp-inst/ level root,adm /var/tmp /var/tmp/tmp-inst/ level root,adm $HOME $HOME/$USER.inst/ level - 确保在
/etc/pam.d/login
文件中,为会话配置了pam_namespace.so
模块:~]$
grep namespace /etc/pam.d/login session required pam_namespace.so - 重启您的系统。