15.3. 理解 MAC 标签

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

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

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

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

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

在适当情况下,可以在UFS文件系统上设置多标签策略,方法是向tunefs(8)中传入multilabel。多标签策略允许每个主体或对象具有其独立的MAC标签。只有实施标签功能的策略(如bibalomacmls)才需要决定使用多标签或单标签策略。某些策略(如seeotheruidsportaclpartition)根本不使用标签。

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

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

# tunefs -l enable /

注意:

一些用户在根分区设置multilabel标签可能会遇到问题,如有问题请参阅第 15.8 节 “MAC 框架的故障排除”

由于多标签策略是以文件系统为基础进行设置的,因此如果文件系统的布局设计得很好,就可能不需要多标签策略。考虑一个FreeBSD web服务器的安全MAC模型的例子。这台机器对默认文件系统中的所有内容都使用单一标签,biba/high。如果 web 服务器需要以 biba/low 的速度运行,以防止写出功能,它可以安装到一个单独的 UFS /usr/local 文件系统中,设置为 biba/low

15.3.1. 配置标签

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

所有的配置都应该通过 setfmac(8)(用于在系统对象上设置MAC标签) 及 setpmac(8)(用于在系统主体上设置标签) 组件实施。 setfmac 命令是用来对系统客体设置 MAC 标签的, 而 setpmac 则是用来对系统主体设置标签的。 例如:

# 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) 代替命令名称。如果用户尝试操作未在其访问中的文件,则受已加载策略模块的规则约束,将显示"操作不允许"错误。

15.3.2. 预定义标签

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

  • low 标签被认为是主体或客体所具有的最低层次的标签设定。 对主体或客体采用此设定, 将阻止其访问标签为 high 的客体或主体。

  • equal 标签只能被用于不希望受策略控制的客体上。

  • high在Biba和MLS策略模块中授予对象或主体最高优先级。

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

15.3.3. 数字标签

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

biba/10:2+3+6(5:2+3-20:2+3+4+5+6)

可理解为Biba Policy Label/Grade 10:Compartments 2, 3 and 6: (grade 5 ...)

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

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

主体和对象对中的等级和隔间被用来构建一种称为支配关系(dominance)的关系,其中主体支配对象,对象支配主体,既不支配另一个,也不支配对方。当两个标签相等时,将发生这两个占主导地位的情况。由于 Biba 的信息流性质,用户有权使用一组可能与项目对应的隔间,但对象也有一组隔间。用户可能必须使用susetpmac对其权限进行子集,才能访问不受限制的隔间中的对象。

15.3.4. 用户和标签设置

用户本身也需要设置标签, 以使其文件和进程能够正确地与系统上定义的安全策略互动, 这是通过使用登录分级在文件 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 重编译登录分级 capability 数据库, 这在接下来的例子和讨论中就会有所体现。

许多站点有大量用户需要多个不同的用户类。需要仔细规划,因为这可能变得难以管理。

15.3.5. 设置网口标签

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

maclabel 可以作为 ifconfig 的参数用于设置网络接口的 MAC 标签。 例如:

# ifconfig bge0 maclabel biba/equal

本例将在bge0网口上设置biba/equalMAC标签。当使用类似biba/high(low-high) 这样的标签时,整个标签应使用引号括起来,否则将发生错误。

每一个支持标签的策略模块都提供了用于在网口上禁用该 MAC标签的系统控制变量。将标签设置为 equal 的效果与此类似。请参见 sysctl 的输出、策略模块的联机手册,或本章接下来的内容,以了解更进一步的详情。

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

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

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