第 18 章。强制访问控制

18.1. 概述

FreeBSD 支持基于 POSIX®.1e 草案的安全扩展。这些安全机制包括文件系统访问控制列表 (“访问控制列表”) 和强制访问控制 (MAC)。MAC 允许加载访问控制模块以实施安全策略。某些模块为系统的狭窄子集提供保护,从而强化特定服务。其他模块在所有主体和对象上提供全面的标记安全。定义中的强制部分表明控制的实施由管理员和操作系统执行。这与默认的安全机制即自由裁量访问控制 (DAC) 相反,在 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 框架时使用

  • 隔室:一组要分区或分离的程序和数据,其中用户被明确授予对系统特定组件的访问权限。隔室代表分组,例如工作组、部门、项目或主题。隔室使实施按需知情原则的安全策略成为可能。

  • 完整性:可以对数据放置的信任级别。随着数据完整性的提高,对数据的信任度也随之提高。

  • 级别:安全属性的升高或降低设置。随着级别的提高,其安全性也被认为是提高的。

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

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

  • 单标签:整个文件系统使用一个标签来强制执行对数据流的访问控制的策略。无论何时未设置multilabel,所有文件都将符合相同的标签设置。

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

  • 主体:任何导致信息在对象之间流动的活动实体,例如用户、用户进程或系统进程。在 FreeBSD 上,这几乎始终是代表用户在进程中运行的线程。

  • 策略:定义如何实现目标的一组规则。策略通常记录如何处理某些项目。本章认为策略是控制数据和信息流并定义谁有权访问该数据和信息的一组规则。

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

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

  • 敏感度:通常用于讨论多级安全 (MLS)。敏感度级别描述数据应该有多重要或多秘密。随着敏感度级别的提高,数据的机密性或保密性的重要性也随之提高。

18.3. 了解 MAC 标签

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

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

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

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

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

在适当的情况下,可以通过将multilabel传递给 tunefs(8),在 UFS 文件系统上设置多标签策略。多标签策略允许每个主体或对象拥有其独立的 MAC 标签。使用多标签或单标签策略的决定仅适用于实施标记功能的策略,例如bibalomacmls。一些策略,例如seeotheruidsportaclpartition,根本不使用标签。

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

以下命令将在指定 UFS 文件系统上设置multilabel。这只能在单用户模式下完成,并且不是交换文件系统的要求

# tunefs -l enable /

一些用户在根分区上设置multilabel标志时遇到了问题。如果是这种情况,请查看 MAC 框架疑难解答

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

18.3.1. 标签配置

几乎所有标签策略模块配置方面都将使用基本系统实用程序执行。这些命令为对象或主体配置或配置的操纵和验证提供了一个简单的界面。

所有配置都可以使用setfmac完成,setfmac用于在系统对象上设置 MAC 标签,以及setpmacsetpmac用于在系统主体上设置标签。例如,要在 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) 代替命令名称。如果用户尝试操作不在其访问权限内的文件,则会显示操作不被允许错误,具体取决于已加载的策略模块的规则。

18.3.2. 预定义标签

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

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

  • 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 标签时,可以将maclabel传递给ifconfig

# 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

虽然此规则易于实现,但它是一个非常糟糕的主意,因为它阻止所有用户发出任何命令。更现实的示例是阻止 user1user2 的主目录的所有访问,包括目录列表

# 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 启用或禁用环回接口 lo(4) 上的所有流量。

  • security.mac.ifoff.bpfrecv_enabled 启用或禁用 Berkeley Packet Filter 接口 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:portidtypeuidgidprotocol 参数可以是 tcpudpport 参数是要允许指定用户或组绑定的端口号。用户 ID、组 ID 和端口参数只能使用数值。

默认情况下,低于 1024 的端口只能由作为 root 运行的特权进程使用。要让 mac_portacl(4) 允许非特权进程绑定到低于 1024 的端口,请按以下方式设置以下可调参数

# 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 用户绑定到端口 80 而不必使用 root 权限

# 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

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

18.5.6. MAC 多级安全模块

模块名称:mac_mls.ko

内核配置行:options MAC_MLS

启动选项:mac_mls_load="YES"

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

在 MLS 环境中,会在每个主体或对象的标签中设置“清除”级别,以及隔间。由于这些清除级别可以达到几千以上的数字,因此彻底配置每个主体或对象将是一项艰巨的任务。为了减轻这种管理开销,此策略中包含三个标签: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 策略模块时,管理员计划控制敏感信息的流动。默认的 阻止读取上,阻止写入下 将所有内容设置为低状态。一切都可以访问,管理员会慢慢提高信息的机密性。

除了三个基本标签选项之外,管理员可以根据需要对用户和组进行分组,以阻止它们之间的信息流。使用描述性词语来查看清除级别中的信息可能更容易,例如,ConfidentialSecretTop Secret 的分类。一些管理员会根据项目级别创建不同的组。无论采用哪种分类方法,在实施限制性策略之前,都必须制定周密的计划。

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

18.5.7. MAC Biba 模块

模块名称:mac_biba.ko

内核配置行:options MAC_BIBA

引导选项:mac_biba_load="YES"

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

在 Biba 环境中,每个主体或对象都设置了一个“完整性”标签。这些标签由分层等级和非分层组件组成。随着等级的上升,其完整性也会上升。

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

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

  • biba/equal 仅应放置在被认为不受策略约束的对象上。

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

Biba 提供

  • 具有非分层完整性类别集的分层完整性级别。

  • 固定规则为 no write up, no read down,与 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"

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

ugidfw_enable="YES"

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

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

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

当添加新用户时,他们的 mac_bsdextended(4) 规则将不在规则集列表中。要快速更新规则集,请使用 kldunload(8)kldload(8) 卸载安全策略模块,然后重新加载。

18.7. MAC 监狱中的 Nagios

本节演示在 MAC 环境中实现 Nagios 网络监控系统所需的步骤。这是一个示例,管理员仍然需要测试已实施的策略是否满足网络的安全要求,然后才能在生产环境中使用。

此示例要求在每个文件系统上设置 multilabel。它还假设 net-mgmt/nagios-pluginsnet-mgmt/nagioswww/apache22 已经安装、配置并正常工作,然后再尝试将其集成到 MAC 框架中。

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可以列出/var/spool/nagios的内容,则说明有问题。相反,应该返回“权限被拒绝”错误。

如果一切正常,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 partition策略或 MAC 标记策略之一中的错误标记引起的。要进行调试,请尝试以下操作。

  1. 检查错误消息。如果用户处于insecure类,则partition策略可能是罪魁祸首。尝试将用户的类设置回default类,然后使用cap_mkdb重建数据库。如果这不能解决问题,请转到步骤二。

  2. 再次检查用户、Xorg 和/dev条目是否正确设置了标签策略。

  3. 如果这些方法都无法解决问题,请将错误消息和环境描述发送到FreeBSD 一般问题邮件列表

出现_secure_path: unable to stat .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)禁用策略,一切应该恢复正常。


最后修改日期:2024 年 9 月 20 日,作者:Fernando Apesteguía