16.5. 可用的 MAC 策略

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

FreeBSD 包含一组策略,这些策略可满足大多数安全要求。每项策略总结如下。最后三个策略支持整数设置来代替三个默认标签。

16.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 tunable,用要豁免的数字组 ID 代替 XXX。
  • security.mac.seeotheruids.primarygroup_enabled用于将特定的主群组从该策略中豁免。当使用这个调整时,security.mac.seeotheruids.specificgid_enabled 可能不会被设置。

16.5.2. MAC BSD 扩展策略

模块名称: mac_bsdextended.ko

内核配置行:options MAC_BSDEXTENDED

引导选项:mac_bsdextended_load="YES"

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

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

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

  1. # ugidfw list
  2. 0 slots, 0 rules

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

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

虽然这个规则实现起来很简单,但却是一个非常糟糕的主意,因为它阻止所有用户发布任何命令。一个更现实的例子是阻止 user1user2 的主目录的所有访问,包括目录列表:

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

为了对所有用户执行相同的访问限制,可以不使用 uid user2 来代替 user1。然而,root 用户不受这些规则的影响。

注意
使用此模块时应格外小心,因为不正确的使用可能会阻止对文件系统某些部分的访问。

16.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 启用或禁用伯克利数据包过滤器接口 bpf(4) 上的所有流量。
  • security.mac.ifoff.other_enabled 启用或禁用所有其他接口上的流量。

mac_ifoff(4) 最常见的用途之一是在引导过程中不应允许网络流量的环境中进行网络监控。另一个用途是编写一个脚本,该脚本使用诸如 security/aide 之类的应用程序,以便在受保护的目录中找到新的或更改的文件时自动阻止网络流量。

16.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.rulesrule[,rule,…] 形式的文本字符串来指定策略,规则数量不限,每个规则的形式为idtype:id:protocol:portidtypeuidgidprotocol 参数可以是 tcpudp。端口参数是允许指定的用户或组绑定的端口号。用户 ID、组 ID 和端口参数只能使用数字值。

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

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

若要防止 root 用户受此策略的影响,请设置 security.mac.portacl.suser_exempt 为非零值:

  1. # sysctl security.mac.portacl.suser_exempt=1

允许 UID 为 80 的 www 用户绑定到 80 端口,而不需要 root 权限:

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

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

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

16.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 进程分区的强制实施。

当启用这个策略时,用户将只能看到他们的进程,以及他们分区内的任何其他进程,将不能使用这个分区范围以外的实用程序。例如,一个不安全等级的用户将不被允许访问 top 以及许多其他必须生成进程的命令。

这个例子在不安全类的用户上增加 top 的标签设置。所有由不安全类中的用户产生的进程将停留在 partition/13 标签中。

  1. # setpmac partition/13 top

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

  1. # ps Zax

此命令显示其他用户的进程分区标签以及该用户当前正在运行的进程:

  1. # ps -ZU trhodes
注意
用户可以在 root 的标签中看到进程,除非加载 mac_seeotheruids(4) 策略。

16.5.6. MAC _mls模块

模块名称: 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 提供:

  • 具有一组非分层类别的分层安全级别。
  • 固定的规则是 no read up, no write down。这意味着,一个主体可以对它自己那一层或下面的对象有阅读权限,但不能对上面的对象有阅读权限。同样地,一个主体可以对自己这一层或以上的对象有写入权限,但不能对下面的对象有写入权限。
  • 保密,或防止不当披露数据。
  • 设计系统的基础,该系统以多个敏感度级别同时处理数据,而不会在机密和机密之间泄漏信息。

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)。为对象指定标签:

  1. # setfmac mls/5 test

获取文件 test 的 MLS 标签:

  1. # getfmac test

另一种方法是在 /etc/ 中创建一个主策略文件,该文件指定 MLS 策略信息,并将该文件反馈到 setfmac

使用 MLS 策略模块时,管理员计划控制敏感信息的流。block read up block write down 默认值将所有内容设置为低状态。一切都可以访问,管理员慢慢地增强信息的机密性。

除了三个基本标签选项之外,管理员还可以根据需要对用户和组进行分组,以阻止它们之间的信息流。使用描述性词(如 ConfidentialSecretTop Secret 的分类)查看清关级别中的信息可能会更容易。某些管理员会根据项目级别创建不同的组。无论分类方法如何,在实施限制性策略之前,都必须有一个经过深思熟虑的计划。

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

16.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 用于在 pty(4) 设备上禁用 Biba 策略。
  • security.mac.biba.revocation_enabled 如果标签更改为主导对象,则强制吊销对对象的访问。

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

  1. # setfmac biba/low test
  2. # getfmac test
  3. test: biba/low

完整性不同于敏感度,用于保证信息不被不受信任的各方操纵。这包括在主体和对象之间传递的信息。它确保用户只能修改或访问他们已被授予显式访问权限的信息。mac_biba(4) 安全策略模块允许管理员配置用户可以看到和调用哪些文件和程序,同时确保系统为该用户信任这些程序和文件。

在初始规划阶段,管理员必须准备好将用户划分为等级、级别和区域。启用此策略模块后,系统将默认为高标签,并由管理员为用户配置不同的等级和级别。一个好的规划方法可以包括主题,而不是使用许可级别。例如,仅允许开发人员修改源代码存储库、源代码编译器和其他开发实用程序。其他用户将被分组到其他类别,如测试人员、设计人员或最终用户,并且只允许读取访问权限。

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

16.5.8. mac_lomac模块

模块名称: 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 用于在系统对象上放置标签:

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

辅助等级 low 是仅由 MACLOMAC 政策提供的功能。