15.5. 可用的MAC策略

默认的FreeBSD内核包括MAC 选项。这意味着MAC框架附带的每个模块都可以用kldload加载到内核中。测试模块后,将模块名称添加到/boot/loader.conf,以便在引导期间加载。每个模块还为选择编译自己的自定义内核的管理员提供了一个内核选项。

FreeBSD 包括一组策略,这些策略将涵盖大多数安全要求。每项策略概述如下。最后三个策略支持整数设置,以代替三个默认标签。

15.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 将启用模块的功能, 并使用默认的配置。 这些默认设置将阻止用户看到其他用户的进程和 socket。

  • security.mac.seeotheruids.specificgid_enabled 将允许特定的组从这一策略中和面。 要将某些组排除在这一策略之外, 可以用 security.mac.seeotheruids.specificgid=XXX sysctl 变量。 前述例子中, XXX 应替换为希望不受限的组 ID 的数值形式。

  • security.mac.seeotheruids.primarygroup_enabled 可以用来将特定的主要组排除在策略之外。 使用这一变量时, 不能同时设置 security.mac.seeotheruids.specificgid_enabled

15.5.2. MAC BSD 扩展策略

模块名: mac_bsdextended.ko

对应的内核配置: options MAC_BSDEXTENDED

引导选项: mac_bsdextended_load="YES"

mac_bsdextended(4) 模块能够强制文件系统防火墙策略。 这一模块的策略提供了标准文件系统权限模型的一种扩展, 使得管理员能够建立一种类似防火墙的规则集, 以文件系统层次结构中的保护文件、 实用程序,以及目录。 在尝试访问文件系统客体时, 会遍历规则表, 直至找到匹配的规则, 或到达表尾。 这一行为可以通过修改 sysctl(8) 参数, 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

user1 可以用 not uid user2 代替。 这将同样的强制访问控制实施在所有用户, 而不是单个用户上。

注意:

当使用这一模块模块时应极其小心; 不正确的使用将导致文件系统的某些部分无法访问。

15.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 的脚本, 以便自动地在受保护的目录中发现新的或修改过的文件时切断网络。

15.5.4. MAC 端口访问控制表策略

模块名: mac_portacl.ko

对应的内核配置: MAC_PORTACL

引导选项: mac_portacl_load="YES"

mac_portacl(4) 模块可以用来通过一系列 sysctl 变量来限制绑定本地的 TCPUDP 端口。本质上 mac_portacl(4) 使得 非-root 用户能够绑定到它所指定的特权端口,也就是那些编号小于 1024 的端口。

在加载之后, 这个模块将在所有的 socket 上启用 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:port。 这里的 idtype 参数可以是 uidgid, 分别表示将 id 参数解释为用户 id 或组 id。 protocol 参数可以用来确定希望应用到 TCPUDP 协议上, 方法是把这一参数设置为 tcpudp。 最后的 port 参数则给出了所指定的用户或组能够绑定的端口号。

默认情况下,编号小于 1024 的端口只能为特权进程使用或绑定,也就是那些以 root 身份运行的进程。 为了让 mac_portacl(4) 能够允许非特权进程绑定低于 1024 的端口, 就必须首先禁用标准的 UNIX® 限制。 这可以通过把 sysctl(8) 变量 net.inet.ip.portrange.reservedlownet.inet.ip.portrange.reservedhigh 设置为 0 来实现:

# 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

若要允许 www 使用者具有 UID 80 的用户绑定到端口 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

15.5.5. MAC 进程分区策略

模块名: mac_partition.ko

对应的内核配置: options MAC_PARTITION

引导选项: mac_partition_load="YES"

mac_partition(4) 策略将把进程基于其 MAC 标签放到特定的 partitions (分区) 中。要设置或删除 partition 标签中的工具, 需要使用setpmac(8)。本策略的sysctl配置如下:

  • security.mac.partition.enabled 将启用强制的 MAC 进程 partitions。

当启用了这个规则时, 用户将只能看到他们自己的, 以及其他与他们同处一个 partition 的进程, 而不能使用能够越过 partition 的工具。 例如, insecure class 中的用户, 就无法使用 top 命令, 以及其他需要产生新进程的工具。

本例将 top 命令加入到 insecure class 中的用户的标签集。 注意, 所有由 insecure class 中的用户产生的进程, 仍然会留在 partition/13 标签中。

# setpmac partition/13 top

下面的命令将显示 partition 标签以及进程列表:

# ps Zax

接下来的这个命令将允许察看其他用户的进程 partition 标签, 以及那个用户正在运行的进程:

# ps -ZU trhodes

注意:

除非加载了 mac_seeotheruids(4) 策略, 否则用户就看不到 root 的标签。

15.5.6. MAC 多级 (Multi-Level) 安全模块

模块名: mac_mls.ko

对应的内核配置: options MAC_MLS

引导选项: mac_mls_load="YES"

mac_mls(4) 策略, 通过严格控制信息流向来控制系统中主体和客体的访问。

MLS 环境中, 许可 (clearance) 级别会在每一个主体或客体标签上进行设置,连同对应的区间。由于这些透明度或敏感度可以有几千个层次, 因此为每一个主体或客体进行配置将是一件让任何系统管理员都感到头疼的任务。 为解决这个问题该策略预置了三个标签。这些标签是 mls/lowmls/equal 以及 mls/high,其作用分别为:

  • mls/low 标签包含了最低配置, 从而允许其他客体支配它。 任何标记为 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 可以用来在标签转为较低 grade 时撤销客体访问权。

  • security.mac.mls.max_compartments 可以用来设置客体的最大区间层次; 基本上, 这也就是系统中所允许的最大区间数。

要管理 MLS 标签,可以使用 setfmac(8) 命令。要在客体上指定标签,需要使用下面的命令:

# setfmac mls/5 test

下述命令用于取得文件 test 上的 MLS 标签:

# getfmac test

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

使用MLS策略模块时,管理员可以规划如何控制敏感信息的流向。 默认情况下,由于其默认的禁止向上读以及向下写的性质,系统会默认将所有客体置于较低的状态。这样,所有的客体都可以访问,而管理员则可以在配置阶段慢慢地进行提高信息的敏感度这样的修改。

除了前面介绍的三种基本标签选项之外, 管理员还可以根据需要将用户和用户组进行分组, 以阻止它们之间的信息流。 一些人们比较熟悉的信息限界词汇, 如 机密秘密, 以及 绝密 可以方便您理解这一概念。 管理员也可以简单地根据项目级别建不同的分组。 无论采用何种分类方法, 在实施限制性的策略之前, 都必须首先想好如何进行规划。

MLS策略模块最典型的用例是电子商务的 web 服务器, 其上的文件服务保存公司的重要信息以及金融机构的情况。 对于只有两三个用户的个人工作站而言, 则可能不甚适用。

15.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/equal 以及 biba/high;解释如下:

  • biba/low 标签是客体或主体所能拥有的最低完整性级别。在客体或主体上设置它,将阻止其在更高级别客体或主体对其进行的写操作,虽然读仍被允许。

  • biba/equal 标签只应在那些希望排除在策略之外的客体上设置。

  • biba/high 允许向较低标签的客体上写,但不允许读那些客体。推荐在那些可能影响整个系统完整性的客体上设置这个标签。

Biba 提供了:

  • 层次式的完整性级别,并提供了一组非层次式的完整性分类。

  • 固定规则:不允许向上写,不允许向下读(与 MLS 相反)。主体可以在它自己和较低的级别写,但不能向更高级别实施写操作。类似地,主体也可以读在其自己的,或更高级别的客体,但不能读取较低级别的客体。

  • 完整性:防止对数据进行不正确的修改。

  • 完整性级别(而不是 MLS 的敏感度级别)。

下列 sysctl 参数可以用于维护 Biba 策略:

  • security.mac.biba.enabled 可以用来在机器上启用/禁用是否实施 Biba 策略。

  • security.mac.biba.ptys_equal 可以用来在 pty(4) 设备上禁用 Biba 策略。

  • security.mac.biba.revocation_enabled 将在支配主体发生变化时强制撤销对客体的访问权。

要操作系统客体上的 Biba 策略, 需要使用 setfmacgetfmac 命令:

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

与敏感性不同, 完整性是要确保不受信方不能对信息进行篡改。 这包括了在主体和客体之间传递的信息。 这能够确保用户只能修改甚至访问需要他们的信息。mac_biba(4) 安全策略模块允许管理员指定用户能够看到和执行的文件和程序, 并确保这些文件能够为系统及用户或用户组所信任, 而免受其他威胁。

在最初的规划阶段, 管理员必须做好将用户分成不同的等级、 级别和区域的准备。 在启动前后, 包括数据以及程序和使用工具在内的客体, 用户都会无法访问。 一旦启用了这个策略模块, 系统将默认使用高级别的标签, 而划分用户级别和等级的工作则交由管理员来进行配置。 与前面介绍的级别限界不同, 好的规划方法可能还包括 topic。 例如, 只允许开发人员修改代码库、 使用源代码编译器, 以及其他开发工具, 而其他用户则分入其他类别, 如测试人员、 设计人员, 以及普通用户, 这些用户可能只拥有读这些资料的权限。

通过其自然的安全控制, 完整性级别较低的主体, 就会无法向完整性级别高的主体进行写操作; 而完整性级别较高的主体, 也不能观察或读较低完整性级别的客体。 通过将客体的标签设为最低级, 可以阻止所有主体对其进行的访问操作。 这一安全策略模块预期的应用场合包括受限的 web 服务器、 开发和测试机, 以及源代码库。 而对于个人终端、 作为路由器的计算机, 以及网络防火墙而言, 它的用处就不大了。

15.5.8. MAC LOMAC 模块

模块名:mac_lomac.ko

对应的内核配置:options MAC_LOMAC

引导选项:mac_lomac_load="YES"

MAC Biba 策略不同, mac_lomac(4) 策略只允许在降低了完整性级别之后, 才允许在不破坏完整性规则的前提下访问较低完整性级别的客体。

MAC 版本的 Low-watermark 完整性策略不应与较早的 lomac(4) 实现相混淆, 除了使用浮动的标签来支持主体通过辅助级别区间降级之外, 其工作方式与 Biba 大体相似。 这一次要的区间以 [auxgrade] 的形式出现。 当指定包含辅助级别的 lomac 策略时, 其形式应类似于: lomac/10[2] 这里数字二 (2) 就是辅助级别。

MAC LOMAC 策略依赖于系统客体上存在普适的标签, 这样就允许主体从较低完整性级别的客体读取, 并对主体的标签降级, 以防止其在之后写高完整性级别的客体。 这就是前面讨论的 [auxgrade] 选项, 因此这个策略能够提供更大的兼容性, 而所需要的初始配置也要比 Biba 少。

与 Biba 和 MLS 策略类似; setfmacsetpmac 工具可以用来在系统客体上放置标签:

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

注意, 这里的辅助级别是 low, 这一特性只由 MAC LOMAC 策略提供。

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.