第十八章 强制访问控制

第十八章 强制访问控制18.1. 简介18.2. 关键术语18.3. 了解MAC标签18.3.1. 标签设置18.3.2. 预定义标签18.3.3. 数字标签18.3.4. 用户标签18.3.5. 网络接口标签18.4. 规划安全配置18.5. 可用MAC策略18.5.1. MAC见其他UID政策18.5.2. MAC BSD扩展策略18.5.3. MAC接口静默策略18.5.4. MAC端口访问控制列表策略18.5.5. MAC分区策略18.5.6. MAC多级安全模块18.5.7. MAC Biba模块18.5.8. MAC低水印模块18.6. 用户锁定18.7. Nagios在MAC Jail中18.7.1. 创建不安全的用户类18.7.2. 配置用户18.7.3. 创建上下文文件18.7.4. 装载器配置18.7.5. 测试配置18.8. MAC框架故障排除

18.1. 简介

FreeBSD支持基于POSIX®.1e草案的安全扩展。这些安全机制包括文件系统访问控制列表(【16.11. 访问控制列表】)和强制访问控制(Mandatory Access Control,MAC)。MAC允许加载访问控制模块以实现安全策略。一些模块为系统的一小部分提供保护,强化了特定的服务。其他则为所有主体和对象提供全面的标签安全。定义的强制性部分表明,控制的执行是由管理员和操作系统执行的。这与自主访问控制(Discretionary Access Control,DAC)的默认安全机制形成鲜明对比,在DAC中,强制执行由用户自行决定。

本章重点介绍MAC框架和FreeBSD为启用各种安全机制提供的可插拔安全策略模块集。

阅读本章后,你会知道: • 与MAC框架相关的术语。 • MAC安全策略模块的功能以及标记和非标记策略之间的区别。 • 在配置系统使用MAC框架之前需要考虑的因素。 • FreeBSD中包含哪些MAC安全策略模块以及如何配置它们。 • 如何使用MAC框架实现更安全的环境。 • 如何测试MAC配置以确保框架已正确实施。

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

• 了解UNIX®和FreeBSD基础知识(【3. FreeBSD基础知识】)。 • 熟悉安全性以及它与FreeBSD的关系(【16. 安全】)。

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

18.2. 关键术语

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

18.3. 了解MAC标签

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

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

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

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

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

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

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

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

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

18.3.1. 标签设置

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

所有配置都可以使用 setfmacsetpmac 来完成, setfmac 用于在系统对象上设置MAC标签,而 setpmac 则用于在系统主体上设置标签。例如,要在测试中将 biba MAC标签设置为 high

Permission denied(权限被拒绝),这通常发生在对受限对象设置或修改标签时。其他条件可能会产生不同的故障。例如,该文件可能不属于试图重新标记该对象的用户,该对象可能不存在,或者该对象可能是只读的。强制策略不允许进程重新标记文件,可能是因为文件的属性、进程的属性或建议的新标签值的属性。例如,如果以低完整性运行的用户试图更改高完整性文件的标签,或者以低完整度运行的用户尝试将低完整性文件标签更改为高完整性标签,这些操作将失败。

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

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

18.3.2. 预定义标签

一些支持标签功能的FreeBSD策略模块提供了三个预定义的标签:low(低)、equal (相等)和 high (高),其中:

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

18.3.3. 数字标签

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

可解释为“Biba政策标签/10级:2、3和6号隔间:(5级……”)

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

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

主体和对象对(subject and object pair)中的等级(grade)和隔间(compartments)用于构建一种称为支配(dominance)的关系,在这种关系中,主体支配一个对象,对象支配主体,两者都不支配对方,或者两者都支配对方。当两个标签相等时,就会出现 both dominate(两者都占主导地位)的情况。由于Biba的信息流特性,用户有权访问一组可能与项目相对应的隔间,但对象也有一组隔间。用户可能必须使用 susetpmac 对其权限进行子集,以便访问不受限制的隔间中的对象。

18.3.4. 用户标签

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

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

虽然用户不能修改默认值,但他们可以在登录后更改标签,但受策略的约束。上面的示例告诉Biba策略,进程的最小完整性为 5 ,最大完整性为 15 ,默认有效标签为 10 。该过程将在 10 上运行,直到它选择更改标签,这可能是由于用户使用了 setpmac ,这将被Biba限制在配置的范围内。

login.conf 进行任何更改后,必须使用 cap_mkdb 重建登录类功能数据库。

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

18.3.5. 网络接口标签

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

在网络接口上设置MAC标签时,可以将 maclabel 传递给 ifconfig

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

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

18.4. 规划安全配置

在实施任何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框架提供的不同安全策略模块将帮助管理员根据自己的情况选择最佳策略。

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

18.5. 可用MAC策略

默认的FreeBSD内核包含 options MAC 。这意味着MAC框架中包含的每个模块都可以作为运行时内核模块用 kldload 加载。测试模块后,将模块名称添加到 /boot/loder.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可调参数来控制其功能:

18.5.2. MAC BSD扩展策略

模块名称:mac_bsdextended.ko

内核配置行:options MAC_BSDEXTENDED

启动选项:mac_bsdextended_load="YES"

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

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

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

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

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

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

18.5.3. MAC接口静默策略

模块名称:mac_ifoff.ko 内核配置行:options MAC_IFOFF 启动选项:mac_ifoff_load="YES"

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

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

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策略。以下可调参数可用:

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

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

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

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

18.5.5. MAC分区策略

模块名称:mac_partition.ko

内核配置行:options MAC_PARTITION

启动选项:mac_partition_load=“YES”

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

启用此策略后,用户将只允许查看其进程以及其分区内的任何其他进程,但不允许使用此分区范围之外的实用程序。例如, insecure 类中的用户将不允许访问 top 以及必须生成进程的许多其他命令。

此示例将 top 添加到 insecure 类中用户的标签集。由 insecure 类中的用户生成的所有进程都将保留在 partition/13 标签中。

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

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

18.5.6. MAC多级安全模块

模块名称:mac_mls.ko 内核配置行:options MAC_MLS 启动选项:mac_mls_load=“YES”

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

在MLS环境中,每个主体或对象的标签上都设置了一个“间隙”级别,以及隔间。由于这些清除水平可能达到数千以上,因此彻底配置每个主体或对象将是一项艰巨的任务。为了减轻这种管理开销,此策略中包含了三个标签:mls/lowmls/equalmls/high ,其中:

MLS提供:

以下 sysctl 可调参数可用:

要操作MLS标签,请使用 setfmac(8) 。要为对象指定标签,请执行以下操作:

要获取文件测试的MLS标签,请执行以下操作:

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

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

除了三个基本标签选项外,管理员还可以根据需要对用户和组进行分组,以阻止它们之间的信息流。使用描述性词语(如 Confidential, Secret, 和 Top 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环境中,每个主题或对象都设置了一个 integrity (完整性)标签。这些标签由分级等级(hierarchical grades)和非分级组件(non-hierarchical components)组成。随着成绩的提高,它的完整性也会提高。

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

Biba提供:

以下可调参数可用于操纵Biba策略:

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

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

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

较低完整性主题无法写入较高完整性主题,较高完整性主体无法列出或读取较低完整度对象。将标签设置在尽可能低的等级可能会使受试者无法访问。此安全策略模块的一些预期环境将包括受约束的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 用于在系统对象上放置标签:

辅助品位 low 是仅由MACLOMAC政策提供的特征。

18.6. 用户锁定

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

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

首先在 /boot/loder.conf 中添加以下行:

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

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

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

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

18.7. Nagios在MAC Jail中

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

此示例要求在每个文件系统上设置多标签。它还假设在尝试集成到MAC框架之前, net-mgmt/nagios-pluginsnetmgmt/nagioswww/apache22 都已安装、配置并正常工作。

18.7.1. 创建不安全的用户类

通过将以下用户类添加到 /etc/login.conf 开始该过程:

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

保存编辑并发出以下命令以重建数据库:

18.7.2. 配置用户

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

所有非root用户帐户现在都需要登录类。登录类是必需的,否则用户将被拒绝访问常用命令。下面的sh脚本应该能做到这一点:

接下来,将 nagioswww 帐户放入不安全类中:

18.7.3. 创建上下文文件

现在应该创建一个名为 /etc/policy.contexts 的上下文文件:

此策略通过对信息流设置限制来加强安全性。在这种特定的配置中,包括root在内的用户永远不应该被允许访问Nagios。Nagios中的配置文件和进程将完全独立或被监禁。

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

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

18.7.4. 装载器配置

要完成配置,请在 /boot/loder.conf 中添加以下行:

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

18.7.5. 测试配置

首先,确保在系统初始化和重新启动时不会启动web服务器和Nagios。确保root无法访问Nagios配置目录中的任何文件。如果root可以列出 /var/spool/nagios 的内容,那么就有问题了。相反,应返回“拒绝权限”错误。

仔细检查以确保一切正常。如果没有,请检查日志文件中的错误消息。如果需要,使用 sysctl(8) 禁用 mac_biba(4) 安全策略模块,并尝试像往常一样重新启动所有内容。

18.8. MAC框架故障排除

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