第十八章 强制访问控制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框架故障排除
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. 安全】)。
xxxxxxxxxx不正确的MAC配置可能会导致系统访问丢失、用户恶化或无法访问Xorg提供的功能。更重要的是,不应依赖MAC来完全保护系统。MAC框架仅增强现有的安全策略。如果没有健全的安全措施和定期的安全检查,系统将永远不会完全安全。本章中包含的示例仅用于演示目的,示例设置不应在生产系统上实现。实施任何安全策略都需要大量的理解、适当的设计和彻底的测试。虽然本章涵盖了与MAC框架相关的广泛安全问题,但不包括新MAC安全策略模块的开发。MAC框架中包含的许多安全策略模块具有特定的特性,可用于测试和新模块开发。有关这些安全策略模块及其提供的各种机制的更多信息,请参阅 mac_test(4) 、mac_stub(4) 和 mac_none(4) 。
在提及MAC框架时使用以下关键术语:
compartment(隔间)
一组要分区或分离的程序和数据,用户可以明确地访问系统的特定组件。compartment 代表一个分组,例如工作组、部门、项目或主题。compartment 使实施“需要知道”的基础安全策略成为可能。
integrity(完整性)
对数据的信任程度。随着数据完整性的提高,信任该数据的能力也在提高。
level(级别)
安全属性的增加或减少设置。随着级别的增加,其安全性也被认为会提高。
label(标签)
一种安全属性,可以应用于系统中的文件、目录或其他项目。它可以被视为一个保密印章。当标签放置在文件上时,它描述了该文件的安全属性,并且只允许具有类似安全设置的文件、用户和资源访问。标签值的含义和解释取决于策略配置。一些策略将标签视为表示对象的完整性或保密性,而另一些策略可能会使用标签来保存访问规则。
multilabel(多标签)
此属性是一个文件系统选项,可以在单用户模式下使用 tunefs(8) 、在启动期间使用 fstab(5) 或在创建新文件系统期间设置。此选项允许管理员在不同对象上应用不同的MAC标签。此选项仅适用于支持标签的安全策略模块。
single label(单标签)
一种策略,整个文件系统使用一个标签来强制对数据流进行访问控制。只要未设置 multilabel ,所有文件都将符合相同的标签设置。
object(对象)
在subject(主体)的指导下信息流动的实体。这包括目录、文件、字段、屏幕、键盘、内存、磁存储、打印机或任何其他数据存储或移动设备。对象是数据容器或系统资源。对对象的访问实际上意味着对其数据的访问。
subject(主体)
任何使信息在用户、用户进程或系统进程等对象之间流动的活动实体。在FreeBSD上,这几乎总是一个代表用户在进程中运行的线程。
policy(政策)
定义如何实现目标的规则集合。政策通常记录如何处理某些项目。本章将政策视为控制数据和信息流并定义谁有权访问这些数据和信息的规则集合。
high-watermark(高水印)
这种策略允许提高安全级别,以访问更高级别的信息。在大多数情况下,过程完成后会恢复到原始级别。目前,FreeBSD MAC框架不包括此类策略。
low-watermark(低水印)
这种策略允许降低安全级别,以访问不太安全的信息。在大多数情况下,过程完成后,用户的原始安全级别会恢复。FreeBSD中唯一使用此功能的安全策略模块是 mac_lomac(4) 。
sensitivity(敏感性)
通常在讨论多级安全(Multilevel Security,MLS)时使用。敏感级别描述了数据的重要性或机密性。随着敏感级别的增加,数据的机密性或保密性的重要性也在增加。
MAC标签是一种安全属性,可以应用于整个系统中的主体和对象。设置标签时,管理员必须了解其含义,以防止系统出现意外或不期望的行为。对象上可用的属性取决于加载的策略模块,因为策略模块以不同的方式解释它们的属性。
对象上的安全标签被策略用作安全访问控制决策的一部分。对于某些策略,标签包含做出决策所需的所有信息。在其他策略中,标签可以作为更大规则集的一部分进行处理。
标签策略有两种类型:单标签和多标签。默认情况下,系统将使用单个标签。管理员应该了解每种策略的优缺点,以便实施符合系统安全模型要求的策略。
单标签安全策略只允许每个主题或对象使用一个标签。由于单个标签策略在整个系统中强制执行一组访问权限,因此它提供了较低的管理开销,但降低了支持标签的策略的灵活性。然而,在许多环境中,可能只需要单标签策略。
单标签策略与DAC有些相似,因为root配置策略,以便将用户放置在适当的类别和访问级别中。一个显著的区别是,许多策略模块也可以限制root。然后,对对象的基本控制将释放给组,但root可以随时撤销或修改设置。
在适当的时候,可以通过将多标签传递给 tunefs(8) 在UFS文件系统上设置 multilabel 策略。多标签策略允许每个主体或对象拥有自己的独立MAC标签。只有实现标签功能的策略(如 biba 、lomac 和 mls )才需要决定使用多标签或单标签策略。一些策略,如 seeotheruids 、 portacl 和 partition ,根本不使用标签。
在分区上使用多标签策略并建立多标签安全模型可能会增加管理开销,因为该文件系统中的所有内容都有标签。这包括目录、文件,甚至设备节点。
以下命令将在指定的UFS文件系统上设置 multilabel 。这只能在单用户模式下完成,并且不是swap文件系统的要求:
xxxxxxxxxx# tunefs -l enable /xxxxxxxxxx一些用户在根分区上设置多标签标志时遇到问题。如果是这样,请查看【18.8. MAC框架的故障排除】。由于多标签策略是在每个文件系统的基础上设置的,如果文件系统布局设计良好,可能不需要多标签策略。考虑FreeBSD web服务器的安全MAC模型示例。这台机器对默认文件系统中的所有内容都使用单一标签 biba/high 。如果web服务器需要以 biba/low 运行以防止写入功能,则可以将其安装到设置为 biba/low 的单独 UFS /usr/local 文件系统中。
标签策略模块配置的几乎所有方面都将使用基本系统实用程序执行。这些命令为对象或主题配置或配置的操作和验证提供了一个简单的界面。
所有配置都可以使用 setfmac 和 setpmac 来完成, setfmac 用于在系统对象上设置MAC标签,而 setpmac 则用于在系统主体上设置标签。例如,要在测试中将 biba MAC标签设置为 high :
xxxxxxxxxx# setfmac biba/high testPermission denied(权限被拒绝),这通常发生在对受限对象设置或修改标签时。其他条件可能会产生不同的故障。例如,该文件可能不属于试图重新标记该对象的用户,该对象可能不存在,或者该对象可能是只读的。强制策略不允许进程重新标记文件,可能是因为文件的属性、进程的属性或建议的新标签值的属性。例如,如果以低完整性运行的用户试图更改高完整性文件的标签,或者以低完整度运行的用户尝试将低完整性文件标签更改为高完整性标签,这些操作将失败。
系统管理员可以使用 setpmac 通过为调用的进程分配不同的标签来覆盖策略模块的设置:
xxxxxxxxxx# setfmac biba/high testPermission denied# setpmac biba/low setfmac biba/high test# getfmac testtest: biba/high对于当前正在运行的进程,如 sendmail ,通常使用 getpmac 。此命令使用进程ID(PID)代替命令名。如果用户试图操纵不在其访问权限内的文件,则根据加载的策略模块的规则,将显示 Operation not permitted(操作不允许)错误。
一些支持标签功能的FreeBSD策略模块提供了三个预定义的标签:low(低)、equal (相等)和 high (高),其中:
low
被认为是对象或主体可能具有的最低标签设置。在对象或主题上设置此选项会阻止他们访问标记为高的对象或主题。
equal
将主题或对象设置为禁用或不受影响,并且只应放置在被认为不受策略约束的对象上。
high
授予对象或主体Biba和MLS策略模块中可用的最高设置。
这些策略模块包括 mac_biba(4) 、mac_mls(4) 和 mac_lomac(4) 。每个预定义的标签都建立了不同的信息流指令。请参阅模块的手册页,以确定通用标签配置的特征。
Biba和MLS策略模块支持数字标签,可以设置数字标签来指示分层控制的精确级别。此数字级别用于将信息划分或排序到不同的分类组中,只允许访问该组或更高的组级别。例如:
xxxxxxxxxxbiba/10:2+3+6(5:2+3-20:2+3+4+5+6)可解释为“Biba政策标签/10级:2、3和6号隔间:(5级……”)
在这个例子中,第一级将被视为具有有效隔间的有效级,第二级是低级,最后一级是高级。在大多数配置中,不需要这种细粒度设置,因为它们被认为是高级配置。
系统对象只有当前坡度和隔间。系统主体反映了系统中可用权限的范围,以及用于访问控制的网络接口。
主体和对象对(subject and object pair)中的等级(grade)和隔间(compartments)用于构建一种称为支配(dominance)的关系,在这种关系中,主体支配一个对象,对象支配主体,两者都不支配对方,或者两者都支配对方。当两个标签相等时,就会出现 both dominate(两者都占主导地位)的情况。由于Biba的信息流特性,用户有权访问一组可能与项目相对应的隔间,但对象也有一组隔间。用户可能必须使用 su 或 setpmac 对其权限进行子集,以便访问不受限制的隔间中的对象。
用户需要有标签,以便他们的文件和进程与系统上定义的安全策略正确交互。这是在 /etc/login.conf 中使用登录类配置的。使用标签的每个策略模块都将实现用户类设置。
要设置将由MAC强制执行的用户类默认标签,请添加 label 条目。下面显示了一个包含每个策略模块的标签条目示例。请注意,在实际配置中,管理员永远不会启用每个策略模块。建议在实施任何配置之前,先审查本章的其余部分。
xxxxxxxxxxdefault:\ :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 重建登录类功能数据库。
许多网站有大量用户,需要几个不同的用户类别。需要进行深入规划,因为这可能会变得难以管理。
可以在网络接口上设置标签,以帮助控制网络上的数据流。使用网络接口标签的策略的功能与策略对对象的功能相同。例如,在Biba中处于高设置的用户将不允许访问标签为低的网络接口。
在网络接口上设置MAC标签时,可以将 maclabel 传递给 ifconfig :
xxxxxxxxxx# ifconfig bge0 maclabel biba/equal此示例将在 bge0 接口上设置 biba/equal 的MAC标签。当使用类似于 biba/high (low-high )的设置时,应引用整个标签,以防止返回错误。
支持标签的每个策略模块都有一个可调参数,可用于禁用网络接口上的MAC标签。将标签设置为 equal 将产生类似的效果。查看 sysctl 的输出、策略手册页面和本章其余部分的信息,以获取有关这些可调参数的更多信息。
在实施任何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框架提供的不同安全策略模块将帮助管理员根据自己的情况选择最佳策略。
本章的其余部分涵盖了可用的模块,描述了它们的使用和配置,并在某些情况下提供了对适用情况的见解。
xxxxxxxxxx实施MAC与实施防火墙非常相似,因为必须注意防止完全被锁定在系统之外。应考虑恢复到以前配置的能力,并应极其谨慎地通过远程连接实现MAC。默认的FreeBSD内核包含 options MAC 。这意味着MAC框架中包含的每个模块都可以作为运行时内核模块用 kldload 加载。测试模块后,将模块名称添加到 /boot/loder.conf 中,以便在启动过程中加载。每个模块还为选择编译自己的自定义内核的管理员提供了一个内核选项。
FreeBSD包括一组涵盖大多数安全要求的策略。每项政策总结如下。最后三个策略支持整数设置来代替三个默认标签。
模块名称:mac_seeotheruids.ko
内核配置行:options MAC_SEEOTHERUIDS
启动选项:mac_seeotheruids_load="YES"
mac_seeotheruids(4) 模块扩展了 security.bsd.see_other_uids 和 security.bsd_see_other_gids sysctl可调参数。此选项在配置之前不需要设置任何标签,并且可以与其他模块透明地操作。
加载模块后,可以使用以下sysctl可调参数来控制其功能:
security.mac.seotheruids.enabled
启用该模块并实现默认设置,这些设置拒绝用户查看其他用户拥有的进程和套接字。
security.mac.seotheruids.specificgid_enabled
允许指定的组免于此策略。要豁免特定组,请使用 security.mac.seeotheruids.specificgid=XXX sysctl 可调参数,将XXX替换为要豁免的数字组ID。
security.mac.seeotheruids.primarygroup_enabled
用于将特定主组排除在此策略之外。使用此可调参数时,可能无法设置 security.mac.seeotheruids.specificgid_enabled 。
模块名称: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) 模块后,可以使用以下命令列出当前规则配置:
xxxxxxxxxx# ugidfw list0 slots, 0 rules默认情况下,没有定义任何规则,所有内容都是完全可访问的。要创建阻止用户所有访问但不影响root的规则,请执行以下操作:
xxxxxxxxxx# ugidfw add subject not uid root new object not uid root mode n虽然这个规则很容易实现,但它是一个非常糟糕的主意,因为它阻止了所有用户发出任何命令。一个更现实的例子阻止了 user1 对 user2 主目录的所有访问,包括目录列表:
xxxxxxxxxx# 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用户不受这些规则的影响。
xxxxxxxxxx使用此模块时应格外小心,因为不正确的使用可能会阻止对文件系统某些部分的访问。模块名称: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 等应用程序自动阻止网络流量。
模块名称: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:port 。
uid 或 gid 。tcp 或 udp 。用户ID、组ID和端口参数只能使用数值。
默认情况下,1024以下的端口只能由以root身份运行的特权进程使用。为了使 mac_portacl(4) 允许非特权进程绑定到1024以下的端口,请按如下方式设置以下可调参数:
xxxxxxxxxx# 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 设置为非零值。
xxxxxxxxxx# sysctl security.mac.portacl.suser_exempt=1要允许UID为80的 www 用户绑定到端口80,而无需root权限:
xxxxxxxxxx# sysctl security.mac.portacl.rules=uid:80:tcp:80下一个示例允许UID为1001的用户绑定到TCP端口110(POP3)和995(POP3):
xxxxxxxxxx# sysctl security.mac.portacl.rules=uid:1001:tcp:110,uid:1001:tcp:995模块名称: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 标签中。
xxxxxxxxxx# setpmac partition/13 top此命令显示分区标签和进程列表:
xxxxxxxxxx# ps Zax此命令显示另一个用户的进程分区标签和该用户当前正在运行的进程:
xxxxxxxxxx# ps -ZU trhodesxxxxxxxxxx除非加载了mac_seeotheruids(4)策略,否则用户可以在root的标签中看到进程。模块名称:mac_mls.ko
内核配置行:options MAC_MLS
启动选项:mac_mls_load=“YES”
mac_mls(4) 策略通过执行严格的信息流策略来控制系统中主体和对象之间的访问。
在MLS环境中,每个主体或对象的标签上都设置了一个“间隙”级别,以及隔间。由于这些清除水平可能达到数千以上,因此彻底配置每个主体或对象将是一项艰巨的任务。为了减轻这种管理开销,此策略中包含了三个标签:mls/low、mls/equal 和 mls/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) 。要为对象指定标签,请执行以下操作:
xxxxxxxxxx# setfmac mls/5 test要获取文件测试的MLS标签,请执行以下操作:
xxxxxxxxxx# getfmac test另一种方法是在 /etc/ 中创建一个主策略文件,指定MLS策略信息,并将该文件提供给 setfmac 。
使用MLS策略模块时,管理员计划控制敏感信息的流动。默认的 block read up block write down 将所有内容设置为低状态。一切都是可访问的,管理员会慢慢增强信息的机密性。
除了三个基本标签选项外,管理员还可以根据需要对用户和组进行分组,以阻止它们之间的信息流。使用描述性词语(如 Confidential, Secret, 和 Top Secret 的分类)查看权限级别的信息可能更容易。一些管理员会根据项目级别创建不同的组。无论采用何种分类方法,在实施限制性政策之前,都必须有一个深思熟虑的计划。
MLS策略模块的一些示例情况包括电子商务web服务器、保存关键公司信息的文件服务器和金融机构环境。
模块名称: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/low 、 biba/equal 和 biba/high ,其中:
biba/low
被认为是对象或主体可能具有的最低完整性。在对象或主题上设置此选项会阻止其对标记为 biba/high 的对象或主题的写入访问,但不会阻止读取访问。
biba/equal
只能放在被认为不受政策约束的对象上。
biba/high
允许写入设置在较低标签上的对象,但不允许读取该对象。建议将此标签放置在影响整个系统完整性的对象上。
Biba提供:
no write up, no read down ,与MLS相反。主体可以对其自身级别或更低级别的对象具有写访问权限,但不能对更高级别的对象进行写访问。同样,主体可以对其自身级别或更高级别的对象具有读取权限,但不能对更低级别的对象进行读取。以下可调参数可用于操纵Biba策略:
security.mac.biba.enabled
用于在目标计算机上启用或禁用Biba策略的执行。
security.mac.biba.ptys_equal
用于禁用 pty(4) 设备上的Biba策略。
security.mac.biba.revocation_enabled
如果标签被更改为主导主题,则强制撤销对对象的访问。
要访问系统对象上的Biba策略设置,请使用 setfmac 和 getfmac :
xxxxxxxxxx# setfmac biba/low test# getfmac testtest: biba/low完整性(integrity)不同于敏感性(sensitivity),用于保证信息不被不受信任的各方操纵。这包括在主体和对象之间传递的信息。它确保用户只能修改或访问他们被明确授予访问权限的信息。 mac_biba(4) 安全策略模块允许管理员配置用户可以查看和调用的文件和程序,同时确保系统对该用户信任这些程序和文件。
在初始规划阶段,管理员必须准备好将用户划分为等级(grades)、级别(levels)和区域(areas)。启用此策略模块后,系统将默认为高标签,管理员可以为用户配置不同的等级和级别。一个好的规划方法可以包括主题,而不是使用间隙水平(clearance levels)。例如,只允许开发人员修改源代码存储库、源代码编译器和其他开发工具。其他用户将被分为其他类别,如测试人员、设计师或最终用户,并且只允许读取权限。
较低完整性主题无法写入较高完整性主题,较高完整性主体无法列出或读取较低完整度对象。将标签设置在尽可能低的等级可能会使受试者无法访问。此安全策略模块的一些预期环境将包括受约束的web服务器、开发和测试机器以及源代码存储库。一个不太有用的实现是个人工作站、用作路由器的机器或网络防火墙。
模块名称: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策略一样, setfmac 和 setpmac 用于在系统对象上放置标签:
xxxxxxxxxx# setfmac /usr/home/trhodes lomac/high[low]# getfmac /usr/home/trhodes lomac/high[low]辅助品位 low 是仅由MACLOMAC政策提供的特征。
此示例考虑了一个用户少于五十的相对较小的存储系统。用户将具有登录功能,并被允许存储数据和访问资源。
对于这种情况, mac_bsdextended(4) 和 mac_seeotheruids(4) 策略模块可以共存,并在隐藏用户进程的同时阻止对系统对象的访问。
首先在 /boot/loder.conf 中添加以下行:
xxxxxxxxxxmac_seeotheruids_load="YES"mac_bsdextended(4) 安全策略模块可以通过在 /etc/rc.conf 中添加以下行来激活:
xxxxxxxxxxugidfw_enable="YES"存储在 /etc/rc.bsdextended 中的默认规则将在系统初始化时加载。但是,默认条目可能需要修改。由于这台机器只为用户提供服务,因此除了最后两行之外,所有内容都可以省略注释,以便默认情况下强制加载用户拥有的系统对象。
将所需用户添加到此计算机并重新启动。出于测试目的,请尝试在两个控制台上以不同用户身份登录。运行 ps aux 查看其他用户的进程是否可见。验证在其他用户的主目录上运行 ls(1) 是否失败。
除非修改了特定的 sysctls 以阻止超级用户访问,否则不要尝试使用root用户进行测试。
xxxxxxxxxx添加新用户时,他们的mac_bsdextended(4)规则将不在规则集列表中。要快速更新规则集,请卸载安全策略模块,然后使用kldunload(8)和kldload(8)。本节演示了在MAC环境中实现Nagios网络监控系统所需的步骤。这是一个示例,仍然要求管理员在生产环境中使用之前测试所实施的策略是否符合网络的安全要求。
此示例要求在每个文件系统上设置多标签。它还假设在尝试集成到MAC框架之前, net-mgmt/nagios-plugins 、netmgmt/nagios 和 www/apache22 都已安装、配置并正常工作。
通过将以下用户类添加到 /etc/login.conf 开始该过程:
xxxxxxxxxxinsecure:\: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):然后,将以下行添加到默认用户类部分:
xxxxxxxxxx:label=biba/high:保存编辑并发出以下命令以重建数据库:
xxxxxxxxxx# cap_mkdb /etc/login.conf使用以下命令将root用户设置为默认类:
xxxxxxxxxx# pw usermod root -L default所有非root用户帐户现在都需要登录类。登录类是必需的,否则用户将被拒绝访问常用命令。下面的sh脚本应该能做到这一点:
xxxxxxxxxx# for x in `awk -F: '($3 >= 1001) && ($3 != 65534) { print $1 }' \ /etc/passwd`; do pw usermod $x -L default; done;接下来,将 nagios 和 www 帐户放入不安全类中:
xxxxxxxxxx# pw usermod nagios -L insecure# pw usermod www -L insecure现在应该创建一个名为 /etc/policy.contexts 的上下文文件:
x# 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 后,将读取此文件。此示例在根文件系统上设置策略:
xxxxxxxxxx# setfsmac -ef /etc/policy.contexts /接下来,将这些编辑添加到 /etc/mac.conf 的主要部分:
xxxxxxxxxxdefault_labels file ?bibadefault_labels ifnet ?bibadefault_labels process ?bibadefault_labels socket ?biba要完成配置,请在 /boot/loder.conf 中添加以下行:
xxxxxxxxxxmac_biba_load="YES"mac_seeotheruids_load="YES"security.mac.biba.trust_all_interfaces=1以及存储在 /etc/rc.conf 中的网卡配置的以下行。如果主网络配置是通过DHCP完成的,则可能需要在每次系统启动后手动配置:
xxxxxxxxxxmaclabel biba/equal首先,确保在系统初始化和重新启动时不会启动web服务器和Nagios。确保root无法访问Nagios配置目录中的任何文件。如果root可以列出 /var/spool/nagios 的内容,那么就有问题了。相反,应返回“拒绝权限”错误。
xxxxxxxxxx# 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) 安全策略模块,并尝试像往常一样重新启动所有内容。
xxxxxxxxxxroot用户仍然可以更改安全实施并编辑其配置文件。以下命令将允许将新生成的shell的安全策略降级到较低级别: # setpmac biba/10 csh要阻止这种情况发生,请使用login.conf(5)强制用户进入一个范围。如果setpmac(8)试图在隔间范围之外运行命令,将返回错误,命令将不会执行。在这种情况下,将根设置为biba/high(high-high)。本节讨论常见的配置错误以及如何解决这些错误。
根(/)分区上的 multilabel 标志未保持启用状态
以下步骤可以解决此瞬态错误:
ro ——只读。tunefs -l enable 。mount -urw/ ,在 /etc/fstab 中将 ro 更改回 rw ,然后重新启动系统。使用MAC建立安全环境后,Xorg不再启动
这可能是由于MAC分区策略或其中一个MAC标签策略中的标签错误造成的。要调试,请尝试以下操作:
insecure(不安全的)类, partition 策略可能是罪魁祸首。请尝试将用户的类设置回 default 类,并使用 cap_mkdb 重建数据库。如果这不能缓解问题,请转到第二步。出现 _secure_path: unable to stat .login.conf 错误
当用户试图从root用户切换到系统中的另一个用户时,可能会出现此错误。当用户的标签设置高于他们试图成为的用户时,通常会出现此消息。例如,如果 joe 的默认标签为 biba/low ,而 root 的标签为 bibb/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) 禁用该策略,一切应恢复正常。