16.3. 了解 MAC 标签

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

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

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

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

单一标签策略有点类似于 DAC,因为 root 配置策略,使用户被放在适当的类别和访问级别中。一个值得注意的区别是,许多策略模块也可以限制根。然后,对对象的基本控制将被释放给组,但 root 可以在任何时候撤销或修改这些设置。

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

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

下面的命令将在指定的 UFS 文件系统上设置 multilabel。这只能在单用户模式下进行,对 swap 文件系统来说不是一个要求。

  1. # tunefs -l enable /
注意
某些用户在根分区上设置 multilabel 标志时遇到了问题。如果是这种情况,请查看 MAC 框架疑难解答

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

16.3.1. 标签配置

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

所有的配置都可以使用 setfmacsetpmac 来完成,前者用于设置系统对象的 MAC 标签,后者用于设置系统主体的标签。例如,在 test 中把 biba 的 MAC 标签设置为高。

  1. # setfmac biba/high test

如果配置成功,将无错误地返回提示。一个常见的错误是 Permission denied,这通常发生在对一个受限制的对象设置或修改标签时。其他条件可能产生不同的失败。例如,文件可能不属于试图重新标记该对象的用户,该对象可能不存在,或者该对象可能是只读的。一个强制性的策略将不允许进程重新标记文件,可能是因为文件的一个属性,进程的一个属性,或建议的新标签值的一个属性。例如,如果一个以低完整性运行的用户试图改变一个高完整性文件的标签,或者一个以低完整性运行的用户试图将一个低完整性文件的标签改为高完整性标签,这些操作将失败。

系统管理员可以使用 setpmac 来覆盖策略模块的设置,给被调用的进程分配一个不同的标签:

  1. # setfmac biba/high test
  2. Permission denied
  3. # setpmac biba/low setfmac biba/high test
  4. # getfmac test
  5. test: biba/high

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

16.3.2. 预定义标签

一些支持标签功能的 FreeBSD 策略模块提供了三个预定义的标签:lowequalhigh,其中:

  • low 被视为对象或主题可能具有的最低标签设置。在对象或主体上设置此项会阻止它们访问标记为“高”的对象或主体。
  • equal 将主题或对象设置为禁用或不受影响,并且只应放置在被视为从策略中免除的对象上。
  • high 为对象或主体授予 Biba 和 MLS 策略模块中可用的最高设置。

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

16.3.3. 数字标签

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

  1. 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 …)”

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

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

主体和客体对中的等级和格子被用来构建一种被称为支配的关系,在这种关系中,一个主体支配一个客体,客体支配主体,两者都不支配对方,或者两者都支配对方。当两个标签相等时,就会出现“都支配”的情况。由于 Biba 的信息流性质,用户对一组可能对应于项目的隔间有权利,但对象也有一组隔间。用户可能不得不使用 susetpmac 对他们的权利进行子集,以便访问他们不受限制的隔间中的对象。

16.3.4. 用户标签

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

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

  1. default:\
  2. :copyright=/etc/COPYRIGHT:\
  3. :welcome=/etc/motd:\
  4. :setenv=MAIL=/var/mail/$,BLOCKSIZE=K:\
  5. :path=~/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:\
  6. :manpath=/usr/share/man /usr/local/man:\
  7. :nologin=/usr/sbin/nologin:\
  8. :cputime=1h30m:\
  9. :datasize=8M:\
  10. :vmemoryuse=100M:\
  11. :stacksize=2M:\
  12. :memorylocked=4M:\
  13. :memoryuse=8M:\
  14. :filesize=8M:\
  15. :coredumpsize=8M:\
  16. :openfiles=24:\
  17. :maxproc=32:\
  18. :priority=0:\
  19. :requirehome:\
  20. :passwordtime=91d:\
  21. :umask=022:\
  22. :ignoretime@:\
  23. :label=partition/13,mls/5,biba/10(5-15),lomac/10[2]:

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

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

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

16.3.5. 网络接口标签

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

设置网口的 MAC 标签时,maclabel 可以传递给 ifconfig:

  1. # ifconfig bge0 maclabel biba/equal

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

每一个支持标签的策略模块都有一个可调整的功能,可以用来禁用网络接口上的 MAC 标签。将标签设置为等值会有类似的效果。查看 sysctl 的输出,策略手册的页面,以及本章其余部分的信息,以了解关于这些可调谐项的更多信息。