第 18 章 强制访问控制

如果发现翻译错误,请直接 发起PR修改

18.1. 简介

FreeBSD 支持基于 POSIX®.1e 草案的安全扩展。这些安全机制包括文件系统访问控制列表(“访问控制列表”)和强制访问控制(MAC)。MAC 允许加载访问控制模块以实施安全策略。一些模块为系统的一小部分提供保护,加固特定服务。其他模块提供全面的标记安全性,涵盖所有主体和对象。定义中的强制部分表示控制的执行由管理员和操作系统执行。这与默认的自主访问控制(DAC)安全机制形成对比,后者将执行权留给用户自行决定。

本章重点介绍 MAC 框架以及 FreeBSD 提供的一组可插拔安全策略模块,用于启用各种安全机制。

阅读完本章后,你将会了解:

  • 与 MAC 框架相关的术语。

  • MAC 安全策略模块的功能以及标记和非标记策略之间的区别。

  • 在配置系统使用 MAC 框架之前需要考虑的因素。

  • FreeBSD 中包含哪些 MAC 安全策略模块以及如何配置它们。

  • 如何使用 MAC 框架实现更安全的环境。

  • 如何测试 MAC 配置以确保框架已经正确实施。

在阅读本章之前,你应该:

不正确的 MAC 配置可能导致系统访问丢失,用户受到困扰,或无法访问 Xorg 提供的功能。更重要的是,不能仅依赖 MAC 来完全保护系统。 MAC 框架只是增强现有安全策略。如果没有健全的安全实践和定期的安全检查,系统将永远无法完全安全。

本章中包含的示例仅用于演示目的,示例设置 不应 在生产系统上实施。实施任何安全策略都需要充分理解、正确设计和彻底测试。

尽管本章涵盖了与 MAC 框架相关的广泛安全问题,但不包括开发新的 MAC 安全策略模块。 MAC 框架附带的一些安全策略模块具有特定特性,既用于测试,也用于新模块的开发。有关这些安全策略模块及其提供的各种机制的更多信息,请参阅 mac_test(4)mac_stub(4)mac_none(4)

18.2. 关键术语

在提到 MAC 框架时,使用以下关键术语:

  • 隔离区(compartment):一组要进行分区或分离的程序和数据,用户被授予对系统特定组件的明确访问权限。隔离区表示一种分组,例如工作组、部门、项目或主题。隔离区使得实施需要知道的安全策略成为可能。

  • 完整性(integrity):可以对数据放置的信任级别。随着数据的完整性提高,对该数据的信任能力也随之增强。

  • 级别(level): 安全属性的增加或减少设置。随着级别的提高,其安全性也被认为提升。

  • 标签(label):一个可以应用于系统中的文件、目录或其他项目的安全属性。它可以被视为一个机密性标记。当一个标签被放置在一个文件上时,它描述了该文件的安全属性,并且只允许具有相似安全设置的文件、用户和资源访问。标签值的含义和解释取决于策略配置。一些策略将标签视为表示对象的完整性或保密性,而其他策略可能使用标签来保存访问规则。

  • 多标签(multilabel):这个属性是一个文件系统选项,可以在单用户模式下使用 tunefs(8) 设置,在启动时使用 fstab(5) 设置,或在创建新文件系统时设置。此选项允许管理员在不同的对象上应用不同的 MAC 标签。此选项仅适用于支持标签的安全策略模块。

  • 单标签(single label):一种策略,整个文件系统使用一个标签来强制对数据流进行访问控制。只要未设置 多标签,所有文件都将符合相同的标签设置。

  • 对象(object):在 主体 的指导下,信息流经过的实体。这包括目录、文件、字段、屏幕、键盘、内存、磁存储、打印机或任何其他数据存储或移动设备。对象是一个数据容器或系统资源。访问对象实际上意味着访问其数据。

  • 主体(subject): 任何能够在对象之间传递信息的活动实体,例如用户、用户进程或系统进程。在 FreeBSD 上,这几乎总是一个代表用户的进程中的线程。

  • 策略(policy):一系列规则的集合,定义了如何实现目标。策略通常记录了如何处理特定事项。本章将策略视为一系列控制数据和信息流动并定义谁可以访问这些数据和信息的规则。

  • 高水位线(high-watermark):这种策略允许提高安全级别以访问更高级别的信息。在大多数情况下,完成进程后会恢复原始级别。目前,FreeBSD MAC 框架不包括这种类型的策略。

  • 低水位线(low-watermark):这种类型的策略允许降低安全级别以访问较不安全的信息。在大多数情况下,完成过程后,用户的原始安全级别将恢复。在 FreeBSD 中,唯一使用此策略的安全策略模块是 mac_lomac(4)

  • 敏感性(sensitivity):通常在讨论多级安全性(MLS)时使用。敏感性级别描述了数据的重要性或机密性。随着敏感性级别的提高,数据的保密性或机密性的重要性也增加。

18.3. 理解 MAC 标签

MAC 标签是一种安全属性,可以应用于系统中的主体和对象。在设置标签时,管理员必须理解其影响,以防止系统出现意外或不希望的行为。对象上可用的属性取决于加载的策略模块,因为策略模块以不同的方式解释其属性。

对象上的安全标签是安全访问控制决策中的一部分。在某些策略中,标签包含了做出决策所需的所有信息。在其他策略中,标签可能作为一个更大的规则集的一部分进行处理。

有两种类型的标签策略:单标签和多标签。默认情况下,系统将使用单标签。管理员应该了解每种类型的优缺点,以便实施符合系统安全模型要求的策略。

单标签安全策略只允许每个主体或对象使用一个标签。由于单标签策略在整个系统上强制执行一组访问权限,因此它提供了较低的管理开销,但降低了支持标记的策略的灵活性。然而,在许多环境中,单标签策略可能就是所需的全部。

单标签策略在某种程度上类似于 DAC,因为 root 配置策略以便将用户放置在适当的类别和访问级别中。一个显著的区别是许多策略模块也可以限制 root。然后,对对象的基本控制将释放给组,但 root 可以随时撤销或修改设置。

在适当的情况下,可以通过将 multilabel 传递给 tunefs[8] 在 UFS 文件系统上设置多标签策略。多标签策略允许每个主体或对象拥有自己独立的 MAC 标签。对于实现标签功能的策略(如 bibalomacmls),只有在使用多标签或单标签策略时才需要做出决策。一些策略,如 seeotheruidsportacl 和 `partition ,根本不使用标签。

在分区上使用多标签策略并建立多标签安全模型可能会增加管理开销,因为文件系统中的所有内容都有标签,包括目录、文件甚至设备节点。

以下命令将在指定的 UFS 文件系统上设置 multilabel。这只能在单用户模式下执行,并且对于交换文件系统来说并不是必需的。

# tunefs -l enable /

一些用户在设置根分区的 multilabel 标志时遇到了问题。如果是这种情况,请参考 解决 MAC 框架的问题 进行排查。

由于多标签策略是基于每个文件系统的设置,如果文件系统布局设计良好,则可能不需要多标签策略。以 FreeBSD Web 服务器为例,考虑一个安全的 MAC 模型。该机器在默认文件系统中使用单个标签 biba/high。如果 Web 服务器需要以 biba/low 运行以防止写入权限,可以将其安装到一个单独的 UFS /usr/local 文件系统,设置为 biba/low

18.3.1. 标签配置

几乎所有标签策略模块配置的方面都可以使用基本系统工具来完成。这些命令提供了一个简单的界面,用于对象或主体的配置,或者用于配置的操作和验证。

所有的配置都可以使用 setfmac 来完成, setfmac 用于在系统对象上设置 MAC 标签,而 setpmac 用于在系统主体上设置标签。例如,要在 test 上将 biba MAC 标签设置为 high,可以使用以下命令:

# setfmac biba/high test

如果配置成功,将返回无错误的提示。常见的错误是 Permission denied,通常发生在对受限对象设置或修改标签时。其他情况可能导致不同的失败。例如,文件可能不是尝试重新标记对象的用户拥有的,对象可能不存在,或者对象可能是只读的。强制策略将不允许进程重新标记文件,可能是因为文件的属性、进程的属性或建议的新标签值的属性。例如,如果以低完整性运行的用户尝试更改高完整性文件的标签,或者以低完整性运行的用户尝试将低完整性文件的标签更改为高完整性标签,这些操作将失败。

系统管理员可以使用 setpmac 命令通过为调用的进程分配不同的标签来覆盖策略模块的设置:

# setfmac biba/high test
Permission denied
# setpmac biba/low setfmac biba/high test
# getfmac test
test: biba/high

对于当前正在运行的进程,例如 sendmail ,通常使用 getpmac 命令。该命令使用进程 ID(PID)代替命令名称。如果用户尝试操作不在其访问权限范围内的文件,根据加载的策略模块的规则,将显示 操作不允许(Operation not permitted) 的错误。

18.3.2. 预定义标签

一些支持标签功能的 FreeBSD 策略模块提供了三个预定义标签:lowequalhigh,其中:

  • low 被认为是对象或主体可能具有的最低标签设置。将其设置在对象或主体上会阻止它们访问被标记为高的对象或主体。

  • equal 将主题或对象设置为禁用或不受影响,并且只应放置在被视为豁免政策的对象上。

  • high 在 Biba 和 MLS 策略模块中为对象或主体授予最高的设置。

这些策略模块包括 mac_biba(4)mac_mls(4)mac_lomac(4)。每个预定义标签都建立了不同的信息流指令。请参考模块的手册页面以确定通用标签配置的特性。

18.3.3. 数字标签

Biba 和 MLS 策略模块支持一个数字标签,可以设置为指示精确的层次控制级别。这个数字级别用于将信息分区或分类到不同的分类组中,只允许访问该组或更高级别的组。例如:

biba/10:2+3+6(5:2+3-20:2+3+4+5+6)

可以解释为 “Biba 策略标签/等级 10:隔间 2,3 和 6:(等级 5 …​ )”

在这个例子中,第一等级被认为是具有有效隔间的有效等级,第二等级是低等级,最后一个是高等级。在大多数配置中,这样细粒度的设置是不需要的,因为它们被认为是高级配置。

系统对象只有当前等级和隔间。系统主体反映了系统中可用权限的范围,以及网络接口,它们用于访问控制。

在一个主体和对象对中,等级和隔间被用来构建一种被称为“优势”的关系,其中主体优势于对象,对象优势于主体,两者互不优势,或者两者互相优势。当两个标签相等时,会出现“两者互相优势”的情况。由于 Biba 的信息流特性,用户对一组可能对应于项目的隔间拥有权限,但对象也有一组隔间。用户可能需要使用 susetpmac 来对其权限进行子集化,以便从受限制的隔间中访问对象。

18.3.4. 用户标签

用户需要具有标签,以便他们的文件和进程能够与系统上定义的安全策略正确交互。这是通过在 /etc/login.conf 中使用登录类进行配置的。每个使用标签的策略模块都会实现用户类设置。

要设置用户类的默认标签,该标签将由 MAC 强制执行,请添加一个 label 条目。下面显示了一个包含每个策略模块的示例 label 条目。请注意,在实际配置中,管理员永远不会启用每个策略模块。建议在实施任何配置之前先阅读本章的其余部分。

default:\
	:copyright=/etc/COPYRIGHT:\
	:welcome=/etc/motd:\
	:setenv=MAIL=/var/mail/$,BLOCKSIZE=K:\
	:path=~/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:\
	:manpath=/usr/share/man /usr/local/man:\
	:nologin=/usr/sbin/nologin:\
	:cputime=1h30m:\
	:datasize=8M:\
	:vmemoryuse=100M:\
	:stacksize=2M:\
	:memorylocked=4M:\
	:memoryuse=8M:\
	:filesize=8M:\
	:coredumpsize=8M:\
	:openfiles=24:\
	:maxproc=32:\
	:priority=0:\
	:requirehome:\
	:passwordtime=91d:\
	:umask=022:\
	:ignoretime@:\
	:label=partition/13,mls/5,biba/10(5-15),lomac/10[2]:

用户无法修改默认值,但他们可以在登录后更改标签,但必须符合策略的限制。上面的示例告诉 Biba 策略,进程的最小完整性为 5,最大完整性为 15,默认有效标签为 10。进程将在 10 上运行,直到它选择更改标签,可能是由于用户使用 setpmac,该操作将受到 Biba 配置范围的限制。

对于 login.conf 的任何更改,必须使用 cap_mkdb 重新构建登录类能力数据库。

许多网站拥有大量用户,需要多个不同的用户类别。这需要进行深入的规划,因为这可能变得难以管理。

18.3.5. 网络接口标签

可以在网络接口上设置标签来帮助控制数据在网络中的流动。使用网络接口标签的策略与对象相关的策略的功能相同。例如,在 Biba 中设置为高级别的用户将不被允许访问标签为 低(low) 的网络接口。

在设置网络接口的 MAC 标签时,可以通过 ifconfig 传递 maclabel 参数:

# ifconfig bge0 maclabel biba/equal

这个示例将在 bge0 接口上设置 biba/equal 的 MAC 标签。当使用类似于 biba/high(low-high) 的设置时,应该将整个标签用引号括起来,以防止返回错误。

每个支持标签的策略模块都有一个可调节项,可以用来禁用网络接口上的 MAC 标签。将标签设置为 equal 将产生类似的效果。请查看 sysctl 的输出、策略手册页面以及本章节中的其他信息,以获取有关这些可调节项的更多信息。

18.4. 规划安全配置

在实施任何 MAC 策略之前,建议先进行规划。在规划阶段,管理员应考虑实施要求和目标,例如:

  • 如何对目标系统上的信息和资源进行分类。

  • 应限制访问的信息或资源以及应该应用的限制类型。

  • 为实现这个目标,将需要哪些 MAC 模块?

在将 MAC 实施到生产系统 之前,应进行可信系统及其配置的试运行。由于不同的环境具有不同的需求和要求,建立完整的安全配置文件将减少系统投入使用后的更改需求。

考虑 MAC 框架如何增强整个系统的安全性。MAC 框架提供的各种安全策略模块可以用于保护网络和文件系统,或者阻止用户访问特定的端口和套接字。也许最好的使用策略模块的方式是同时加载多个安全策略模块,以提供 MLS 环境。这种方法与硬化策略不同,硬化策略通常只针对系统中仅用于特定目的的元素进行硬化。 MLS 的缺点是增加了管理开销。

与提供选择特定配置所需的策略并降低性能开销的框架相比,开销是最小的。减少对不需要的策略的支持可以提高系统的整体性能,并提供选择的灵活性。一个良好的实现应该考虑整体安全要求,并有效地实施框架提供的各种安全策略模块。

使用 MAC 的系统可以确保用户不能随意更改安全属性。所有用户工具、程序和脚本必须在所选安全策略模块提供的访问规则约束下运行,而 MAC 访问规则的控制则由系统管理员负责。

系统管理员有责任仔细选择正确的安全策略模块。对于需要限制网络访问控制的环境,mac_portacl(4)mac_ifoff(4)mac_biba(4) 策略模块是很好的起点。对于需要严格保密文件系统对象的环境,可以考虑使用 mac_bsdextended(4)mac_mls(4) 策略模块。

基于网络配置可以做出政策决策。如果只允许特定用户访问 ssh(1) ,那么 mac_portacl(4) 策略模块是一个不错的选择。在文件系统的情况下,对于某些用户来说,对对象的访问可能被视为机密,而对其他用户来说则不是。例如,一个大型开发团队可能会被分成较小的项目,项目 A 的开发人员可能不被允许访问项目 B 的开发人员编写的对象。然而,这两个项目可能需要访问项目 C 的开发人员创建的对象。使用 MAC 框架提供的不同安全策略模块,可以将用户分成这些组,并为其提供对应对象的访问权限。

每个安全策略模块都有一种独特的处理系统整体安全的方式。模块的选择应该基于经过深思熟虑的安全策略,可能需要进行修订和重新实施。了解 MAC 框架提供的不同安全策略模块将帮助管理员为他们的情况选择最佳策略。

本章的其余部分介绍了可用的模块,描述了它们的使用和配置,并在某些情况下提供了适用情况的见解。

实施 MAC 与实施防火墙非常相似,因为必须小心防止完全被系统锁定。应考虑能够恢复到先前的配置,并且在远程连接上实施 MAC 时应极度谨慎。

18.5. 可用的 MAC 策略

默认的 FreeBSD 内核包含 options MAC。这意味着 MAC 框架中包含的每个模块都可以作为运行时内核模块使用 kldload 加载。在测试完模块后,将模块名称添加到 /boot/loader.conf ,以便在启动时加载。对于那些选择编译自定义内核的管理员,每个模块还提供了一个内核选项。

FreeBSD 包含一组策略,可以满足大多数安全需求。下面对每个策略进行了总结。最后三个策略支持使用整数设置替代三个默认标签。

18.5.1. MAC 查看其他 UID 策略

模块名称:mac_seeotheruids.ko

内核配置行:options MAC_SEEOTHERUIDS

启动选项:mac_seeotheruids_load ="YES"

mac_seeotheruids(4) 模块扩展了 security.bsd.see_other_uidssecurity.bsd.see_other_gids sysctl 可调整参数。该选项在配置之前不需要设置任何标签,并且可以与其他模块透明地协同工作。

加载模块后,可以使用以下 sysctl 可调整项来控制其功能:

  • security.mac.seeotheruids.enabled 启用该模块并实现默认设置,禁止用户查看其他用户拥有的进程和套接字。

  • security.mac.seeotheruids.specificgid_enabled 允许指定的组免除此策略。要免除特定的组,请使用 security.mac.seeotheruids.specificgid =XXX sysctl 可调节参数,将 XXX 替换为要免除的数字组 ID。

  • security.mac.seeotheruids.primarygroup_enabled 用于免除特定的主要组免受此策略的影响。当使用此可调整项时,不得设置 security.mac.seeotheruids.specificgid_enabled

18.5.2. MAC BSD 扩展策略

模块名称:mac_bsdextended.ko

内核配置行:options MAC_BSDEXTENDED

启动选项:mac_bsdextended_load ="YES"

mac_bsdextended(4) 模块实施了一个文件系统防火墙。它为标准文件系统权限模型提供了扩展,允许管理员创建类似防火墙的规则集来保护文件系统层次结构中的文件、实用程序和目录。当尝试访问文件系统对象时,将迭代规则列表,直到找到匹配的规则或到达末尾为止。可以使用 security.mac.bsdextended.firstmatch_enabled 来更改此行为。与 FreeBSD 中的其他防火墙模块类似,可以使用 rc.conf(5) 变量在系统启动时创建和读取包含访问控制规则的文件。

规则列表可以使用 ugidfw(8) 输入,其语法类似于 ipfw(8)。通过使用 libugidfw(3) 库中的函数,可以编写更多的工具。

在加载了 mac_bsdextended(4) 模块之后,可以使用以下命令列出当前的规则配置:

# ugidfw list
0 slots, 0 rules

默认情况下,没有定义任何规则,所有内容都是完全可访问的。要创建一个规则,阻止用户的所有访问,但不影响 root 用户:

# ugidfw add subject not uid root new object not uid root mode n

虽然这个规则很容易实现,但它是一个非常糟糕的想法,因为它会阻止所有用户发出任何命令。一个更现实的例子是阻止 user1 访问 user2 的主目录,包括目录列表。

# ugidfw set 2 subject uid user1 object uid user2 mode n
# ugidfw set 3 subject uid user1 object gid user2 mode n

可以使用 not uid user2 来代替 user1,以便为所有用户强制相同的访问限制。然而,这些规则对 root 用户无效。

在使用该模块时应极度谨慎,因为错误的使用可能会阻止对文件系统的某些部分的访问。

18.5.3. MAC 接口禁止策略

模块名称:mac_ifoff.ko

内核配置行:options MAC_IFOFF

启动选项:mac_ifoff_load ="YES"

mac_ifoff(4) 模块用于动态禁用网络接口,并防止在系统启动期间启用网络接口。它不使用标签,也不依赖于任何其他 MAC 模块。

大部分该模块的控制是通过这些 sysctl 可调参数进行的:

  • security.mac.ifoff.lo_enabled 用于启用或禁用回环(loopback)接口上的所有流量,参考:lo(4)

  • security.mac.ifoff.bpfrecv_enabled 用于启用或禁用 Berkeley 数据包过滤器接口上的所有流量,参见 bpf(4)

  • security.mac.ifoff.other_enabled 用于启用或禁用所有其他接口上的流量。

mac_ifoff(4) 的最常见用途之一是在启动序列期间不允许网络流量的环境中进行网络监控。另一个用途是编写一个脚本,使用类似 security/aide 的应用程序,在受保护的目录中发现新文件或更改文件时自动阻止网络流量。

18.5.4. MAC 端口访问控制列表策略

模块名称:mac_portacl.ko

内核配置行:MAC_PORTACL

引导选项:mac_portacl_load ="YES"

mac_portacl(4) 模块用于限制绑定到本地 TCP 和 UDP 端口,使非 root 用户能够绑定到指定的特权端口(低于 1024)。

一旦加载,该模块将在所有套接字上启用 MAC 策略。以下可调整项可用:

  • security.mac.portacl.enabled 用于启用或禁用该策略。

  • security.mac.portacl.port_high 设置了 mac_portacl(4) 保护的最高端口号。

  • security.mac.portacl.suser_exempt 设置为非零值时,免除 root 用户遵守此策略。

  • security.mac.portacl.rules 指定了策略,其格式为 rule[,rule,…​] 的文本字符串,可以包含多个规则,每个规则的格式为 idtype:id:protocol:portidtype 可以是 uidgidprotocol 参数可以是 tcpudpport 参数是允许指定的用户或组绑定的端口号。用户 ID、组 ID 和端口参数只能使用数字值。

默认情况下,只有以 root 身份运行的特权进程才能使用小于 1024 的端口。要允许非特权进程绑定到小于 1024 的端口,可以按照以下方式设置 mac_portacl(4) 中的可调整参数:

# sysctl security.mac.portacl.port_high=1023
# sysctl net.inet.ip.portrange.reservedlow=0
# sysctl net.inet.ip.portrange.reservedhigh=0

为了防止 root 用户受到此策略的影响,请将 security.mac.portacl.suser_exempt 设置为非零值。

# sysctl security.mac.portacl.suser_exempt=1

为了允许 UID 为 80 的 www 用户在不需要 root 权限的情况下绑定到端口 80:

# sysctl security.mac.portacl.rules=uid:80:tcp:80

下面的示例允许具有 UID 为 1001 的用户绑定到 TCP 端口 110(POP3)和 995(POP3s):

# sysctl security.mac.portacl.rules=uid:1001:tcp:110,uid:1001:tcp:995

18.5.5. MAC 分区策略

模块名称:mac_partition.ko

内核配置行:options MAC_PARTITION

启动选项:mac_partition_load ="YES"

mac_partition(4) 策略根据进程的 MAC 标签将其分配到特定的“分区”中。大部分该策略的配置都是使用 setpmac(8) 完成的。该策略有一个可调整的 sysctl 参数。

  • security.mac.partition.enabled 启用了 MAC 进程分区的强制执行。

当启用此策略时,用户只能查看他们自己的进程以及其所在分区的其他进程,但不允许使用超出该分区范围的实用工具。例如,属于 不安全(insecure) 类别的用户将无法访问 top 以及许多其他需要生成进程的命令。

这个例子将 top 添加到 insecure 类别中的用户标签集合中。所有由 insecure 类别中的用户生成的进程都将保持在 partition/13 标签中。

# setpmac partition/13 top

该命令显示分区标签和进程列表:

# ps Zax

该命令显示另一个用户的进程分区标签以及该用户当前正在运行的进程:

# ps -ZU trhodes

除非加载了 mac_seeotheruids(4) 策略,否则用户可以看到 root 标签下的进程。

18.5.6. MAC 多级安全模块

模块名称:mac_mls.ko

内核配置行:options MAC_MLS

启动选项:mac_mls_load ="YES"

mac_mls(4) 策略通过执行严格的信息流策略来控制系统中主体和对象之间的访问。

在 MLS 环境中,每个主体或对象的标签中都设置了一个“许可(clearance)”级别,以及隔间。由于这些许可级别可以达到几千以上的数字,彻底配置每个主体或对象将是一项艰巨的任务。为了减轻这种管理负担,该策略中包括了三个标签: mls/lowmls/equalmls/high,其中:

  • 任何标记为 mls/low 的内容都具有低许可级别,不允许访问更高级别的信息。该标签还阻止高许可级别的对象向低级别写入或传递信息。

  • mls/equal 应该被放置在应该被豁免政策的对象上。

  • mls/high 是最高级别的许可级别。被分配此标签的对象将在系统中具有最高权限;然而,它们不会允许信息泄漏给较低级别的对象。

MLS 提供以下功能:

  • 一个具有一组非层次化类别的分层安全级别。

  • 固定的规则是 不可向上读取,不可向下写入。这意味着一个主体可以对其自身级别或以下级别的对象具有读取访问权限,但不能对以上级别的对象具有读取访问权限。同样地,一个主体可以对其自身级别或以上级别的对象具有写入访问权限,但不能对以下级别的对象具有写入访问权限。

  • 保密性,或者说是防止数据不适当披露的措施。

  • 设计能够同时处理多个敏感级别数据的系统基础,而不会在秘密和机密之间泄露信息。

以下是可用的 sysctl 可调整参数:

  • security.mac.mls.enabled 用于启用或禁用 MLS 策略。

  • security.mac.mls.ptys_equal 在创建过程中将所有 pty(4) 设备标记为 mls/equal

  • security.mac.mls.revocation_enabled 在对象的标签变为较低等级的标签后,撤销对该对象的访问权限。

  • security.mac.mls.max_compartments 设置系统允许的最大隔离级别数量。

要操作 MLS 标签,请使用 setfmac(8)。要为对象分配一个标签:

# setfmac mls/5 test

获取文件 test 的 MLS 标签:

# getfmac test

另一种方法是在 /etc/ 目录下创建一个主策略文件,该文件指定了 MLS 策略信息,并将该文件提供给 setfmac 命令。

当使用 MLS 策略模块时,管理员计划控制敏感信息的流动。默认的 block read up block write down 将所有内容设置为低状态。所有内容都是可访问的,管理员会逐渐增加信息的机密性。

除了三种基本的标签选项之外,管理员还可以根据需要将用户和组进行分组,以阻止它们之间的信息流动。使用描述性词语,如 机密秘密绝密 来查看清除级别的信息可能更容易。一些管理员根据项目级别创建不同的组。无论分类方法如何,都必须在实施限制性政策之前制定一个经过深思熟虑的计划。

MLS 策略模块的一些示例情况包括电子商务网站服务器、存储关键公司信息的文件服务器和金融机构环境。

18.5.7. MAC Biba 模块

模块名称:mac_biba.ko

内核配置行:options MAC_BIBA

启动选项:mac_biba_load ="YES"

mac_biba(4) 模块加载了 MAC Biba 策略。该策略与 MLS 策略类似,但信息流动规则略有不同。这是为了防止敏感信息的向下流动,而 MLS 策略则防止敏感信息的向上流动。

在 Biba 环境中,每个主体或对象都会设置一个“完整性(integrity)”标签。这些标签由层次等级和非层次组成。随着等级的提升,完整性也会提高。

支持的标签有 biba/lowbiba/equalbiba/high,其中:

  • biba/low 被认为是对象或主体可能具有的最低完整性。将其设置在对象或主体上会阻止它们对标记为 biba/high 的对象或主体的写访问,但不会阻止读访问。

  • biba/equal 应该只被应用于被认为符合政策的对象上。

  • biba/high 允许对设置在较低标签的对象进行写操作,但不允许读取该对象。建议将此标签放置在影响整个系统完整性的对象上。

Biba 提供:

  • 具有一组非层次化完整性类别的层次完整性级别。

  • 固定规则是 不可向上写入,不可向下读取,与 MLS 相反。主体可以对其自身级别或以下的对象具有写入访问权限,但不能对其以上的对象具有写入访问权限。同样地,主体可以对其自身级别或以上的对象具有读取访问权限,但不能对其以下的对象具有读取访问权限。

  • 通过防止数据的不适当修改来保持完整性。

  • 完整性级别而不是 MLS 敏感级别。

以下可调整项可用于操作 Biba 策略:

  • security.mac.biba.enabled 用于在目标机器上启用或禁用 Biba 策略的执行。

  • security.mac.biba.ptys_equal 用于禁用 Biba 策略对 pty(4) 设备的应用。

  • 如果标签被更改为支配主体,则 security.mac.biba.revocation_enabled 强制撤销对对象的访问权限。

要访问系统对象上的 Biba 策略设置,请使用 setfmacgetfmac 命令:

# setfmac biba/low test
# getfmac test
test: biba/low

完整性与敏感性不同,用于确保信息不被不受信任的方进行篡改。这包括主体和对象之间传递的信息。它确保用户只能修改或访问他们被明确授权的信息。 mac_biba(4) 安全策略模块允许管理员配置用户可以查看和调用哪些文件和程序,同时确保这些程序和文件对该用户是可信的。

在初始规划阶段,管理员必须准备好将用户分成等级、级别和领域。一旦启用了该策略模块,系统将默认为高级别,并由管理员配置用户的不同等级和级别。与使用许可级别不同,一个好的规划方法可以包括主题。例如,只允许开发人员对源代码仓库、源代码编译器和其他开发工具进行修改访问。其他用户将被分组到其他类别,如测试人员、设计师或最终用户,并且只允许读取访问权限。

较低完整性的主体无法向较高完整性的主体写入,而较高完整性的主体无法列出或读取较低完整性的对象。将标签设置为最低等级可能会使主体无法访问。此安全策略模块的一些潜在环境包括受限的 Web 服务器、开发和测试机器以及源代码存储库。较少有用的实现可能是个人工作站、用作路由器的机器或网络防火墙。

18.5.8. MAC 低水位标记模块

模块名称:mac_lomac.ko

内核配置行:options MAC_LOMAC

启动选项:mac_lomac_load ="YES"

与 MAC Biba 策略不同, mac_lomac(4) 策略允许在降低完整性级别以不破坏任何完整性规则的情况下访问较低完整性对象。

低水位完整性策略与 Biba 几乎完全相同,唯一的区别是使用浮动标签来支持通过辅助等级隔离主体。这个辅助等级隔离采用 [auxgrade] 的形式。当分配一个带有辅助等级的策略时,使用语法 lomac/10[2],其中 2 是辅助等级。

该策略依赖于对所有系统对象进行普遍标记的完整性标签,允许主体从低完整性对象读取,并通过 [auxgrade] 将主体的标签降级,以防止将来对高完整性对象进行写入。与 Biba 相比,该策略可能提供更高的兼容性,并且需要较少的初始配置。

与 Biba 和 MLS 策略类似,setfmacsetpmac 用于给系统对象打上标签:

# setfmac /usr/home/trhodes lomac/high[low]
# getfmac /usr/home/trhodes lomac/high[low]

辅助等级 low 是仅由 MACLOMAC 策略提供的一个特性。

18.6. 用户锁定

这个例子考虑了一个相对较小的存储系统,用户数量少于 50 人。用户将具有登录功能,并被允许存储数据和访问资源。

对于这种情况,mac_bsdextended(4)mac_seeotheruids(4) 策略模块可以共存,并且可以阻止对系统对象的访问,同时隐藏用户进程。

首先,在 /boot/loader.conf 文件中添加以下行:

mac_seeotheruids_load="YES"

通过将以下行添加到 /etc/rc.conf,可以激活 mac_bsdextended(4) 安全策略模块:

ugidfw_enable="YES"

系统初始化时将加载存储在 /etc/rc.bsdextended 文件中的默认规则。然而,默认条目可能需要修改。由于此机器预计只为用户提供服务,因此除了最后两行外,可以将所有内容都注释掉,以便默认情况下强制加载用户拥有的系统对象。

将所需的用户添加到该机器并重新启动。为了测试目的,尝试在两个控制台上使用不同的用户登录。运行 ps aux 命令查看其他用户的进程是否可见。验证在另一个用户的主目录上运行 ls(1) 命令是否失败。

除非特定的 sysctl 已被修改以阻止超级用户访问,否则不要尝试使用 root 用户进行测试。

当添加一个新用户时,他们的 mac_bsdextended(4) 规则将不会出现在规则集列表中。为了快速更新规则集,可以使用 kldunload(8)kldload(8) 命令卸载和重新加载安全策略模块。

18.7. 在 MAC Jail 中的 Nagios

本节演示了在 MAC 环境中实施 Nagios 网络监控系统所需的步骤。这仅作为一个示例,管理员在将该策略应用于生产环境之前需要测试其是否符合网络的安全要求。

在进行此示例之前,需要在每个文件系统上设置 multilabel。同时,还假设在将其集成到 MAC 框架之前,已经安装、配置并正确运行了 net-mgmt/nagios-pluginsnet-mgmt/nagioswww/apache22

18.7.1. 创建一个不安全的用户类

/etc/login.conf 中添加以下用户类别,开始该过程:

insecure:\
:copyright=/etc/COPYRIGHT:\
:welcome=/etc/motd:\
:setenv=MAIL=/var/mail/$,BLOCKSIZE=K:\
:path=~/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
:manpath=/usr/share/man /usr/local/man:\
:nologin=/usr/sbin/nologin:\
:cputime=1h30m:\
:datasize=8M:\
:vmemoryuse=100M:\
:stacksize=2M:\
:memorylocked=4M:\
:memoryuse=8M:\
:filesize=8M:\
:coredumpsize=8M:\
:openfiles=24:\
:maxproc=32:\
:priority=0:\
:requirehome:\
:passwordtime=91d:\
:umask=022:\
:ignoretime@:\
:label=biba/10(10-10):

然后,在默认用户类部分添加以下行:

:label=biba/high:

保存修改并执行以下命令以重建数据库:

# cap_mkdb /etc/login.conf

18.7.2. 配置用户

使用以下命令将 root 用户设置为默认类:

# pw usermod root -L default

所有不是 root 的用户帐户现在都需要一个登录类。否则,用户将被拒绝访问常用命令。下面的 sh 脚本应该能解决问题:

# for x in `awk -F: '($3 >= 1001) && ($3 != 65534) { print $1 }' \
	/etc/passwd`; do pw usermod $x -L default; done;

接下来,将 nagioswww 账户添加到不安全类别中:

# pw usermod nagios -L insecure
# pw usermod www -L insecure

18.7.3. 创建上下文文件

现在应该创建一个上下文文件,路径为 /etc/policy.contexts

# This is the default BIBA policy for this system.

# System:
/var/run(/.*)?			biba/equal

/dev/(/.*)?			biba/equal

/var				biba/equal
/var/spool(/.*)?		biba/equal

/var/log(/.*)?			biba/equal

/tmp(/.*)?			biba/equal
/var/tmp(/.*)?			biba/equal

/var/spool/mqueue		biba/equal
/var/spool/clientmqueue		biba/equal

# For Nagios:
/usr/local/etc/nagios(/.*)?	biba/10

/var/spool/nagios(/.*)?		biba/10

# For apache
/usr/local/etc/apache(/.*)?	biba/10

该策略通过对信息流动设置限制来强制执行安全性。在这个特定的配置中,包括 root 在内的用户不应该被允许访问 Nagios 。 Nagios 的配置文件和进程将完全自包含或被隔离。

在对每个文件系统运行 setfsmac 之后,将读取此文件。此示例设置了根文件系统的策略:

# setfsmac -ef /etc/policy.contexts /

接下来,将这些编辑添加到主要部分的 /etc/mac.conf 中:

default_labels file ?biba
default_labels ifnet ?biba
default_labels process ?biba
default_labels socket ?biba

18.7.4. 加载器配置

要完成配置,请将以下行添加到 /boot/loader.conf 中:

mac_biba_load="YES"
mac_seeotheruids_load="YES"
security.mac.biba.trust_all_interfaces=1

将以下行添加到存储在 /etc/rc.conf 中的网络卡配置中。如果主要网络配置是通过 DHCP 完成的,则可能需要在每次系统启动后手动配置此项:

maclabel biba/equal

18.7.5. 测试配置

首先,确保在系统初始化和重启时不会启动 Web 服务器和 Nagios 。确保 root 无法访问 Nagios 配置目录中的任何文件。如果 root 可以列出 .filename/var/spool/nagios 的内容,则表示出现了问题。相反,应返回“权限被拒绝(permission denied)”错误。

如果一切正常,现在可以启动 Nagios、Apache 和 Sendmail:

# cd /etc/mail && make stop && \
setpmac biba/equal make start && setpmac biba/10\(10-10\) apachectl start && \
setpmac biba/10\(10-10\) /usr/local/etc/rc.d/nagios.sh forcestart

请仔细检查以确保一切正常运行。如果不正常,请检查日志文件以查找错误信息。如果需要,使用 sysctl(8) 命令禁用 mac_biba(4) 安全策略模块,然后尝试按照通常的方式重新启动所有内容。

root 用户仍然可以更改安全执行和编辑其配置文件。以下命令将允许将安全策略降级为新生成的 shell 的较低级别:

# setpmac biba/10 csh

为了阻止这种情况发生,可以使用 login.conf(5) 强制用户进入一个范围。如果 setpmac(8) 尝试在隔离区域范围之外运行命令,将返回错误并且不执行该命令。在这种情况下,将 root 设置为 biba/high(high-high)

18.8. 解决 MAC 框架的问题

本节讨论常见的配置错误以及如何解决它们。

multilabel 标志在根(/ )分区上无法保持启用状态。

以下步骤可能解决此临时错误:

  1. 编辑 /etc/fstab 文件,并将根分区设置为 ro,以实现只读模式。

  2. 重新启动进入单用户模式。

  3. / 上运行 tunefs -l enable

  4. 重启系统。

  5. 运行 mount -urw 命令,并在 /etc/fstab 文件中将 ro 改回 rw,然后再次重启系统。

  6. 请仔细检查 mount 命令的输出,确保根文件系统上的 multilabel 已正确设置。

在使用 MAC 建立了安全环境之后,Xorg 不再启动。

这可能是由 MAC 分区 策略或 MAC 标签策略中的一个标签错误引起的。为了调试,请尝试以下操作:

  1. 检查错误消息。如果用户在 insecure 类中, partition 策略可能是问题的原因。尝试将用户的类设置回 default 类,并使用 cap_mkdb 重新构建数据库。如果这不能解决问题,请进行第二步。

  2. 请仔细检查用户、Xorg 和 /dev 条目的标签策略是否设置正确。

  3. 如果以上两种方法都不能解决问题,请将错误信息和环境描述发送到 FreeBSD general questions mailing list

出现了 _secure_path: 无法统计 .login_conf 错误。

当用户尝试从 root 用户切换到系统中的另一个用户时,可能会出现此错误。当用户的标签设置比他们尝试成为的用户的标签设置更高时,通常会出现此消息。例如,如果 joe 的默认标签是“ biba/low ”,而 root 的标签是 biba/high,则 root 无法查看 joe 的主目录。无论 root 是否使用 su 成为 joe,都会发生这种情况,因为 Biba 完整性模型不允许 root 查看设置在较低完整性级别的对象。

系统不再识别 root

当发生这种情况时,whoami 返回 0,而 su 返回 who are you?

如果一个标签策略被 sysctl(8) 禁用或者策略模块被卸载,就会发生这种情况。如果策略被禁用,登录能力数据库需要重新配置。请仔细检查 /etc/login.conf,确保所有的 label 选项都已经被移除,并使用 cap_mkdb 重新构建数据库。

如果策略限制对 master.passwd 的访问,也可能发生这种情况。这通常是由于管理员在与系统使用的通用策略冲突的标签下更改了文件而引起的。在这些情况下,系统会读取用户信息,并且由于文件继承了新的标签,访问将被阻止。使用 sysctl(8) 禁用该策略,一切应该恢复正常。


上次修改时间: September 18, 2024 by fiercex