# 18.3.了解 MAC 标签

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

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

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

单标签安全策略仅允许每个主体或对象使用一个标签。由于单标签策略在整个系统中强制执行一套访问权限，它提供了较低的管理开销，但降低了支持标签的策略的灵活性。然而，在许多环境中，单标签策略可能已经足够满足需求。

单标签策略与 DAC（自主访问控制）有些相似，`root` 配置策略，使得用户被放入适当的类别和访问级别。一个显著的区别是，许多策略模块也可以限制 `root`。对对象的基本控制将释放给组，但 `root` 可以随时撤销或修改这些设置。

在适当的情况下，可以通过将 `multilabel` 传递给 [tunefs(8)](https://man.freebsd.org/cgi/man.cgi?query=tunefs\&sektion=8\&format=html) 在 UFS 文件系统上设置多标签策略。多标签策略允许每个主体或对象拥有其自己的独立 MAC 标签。只有当策略实现标签功能时，才需要决定使用多标签还是单标签策略，例如 `biba`、`lomac` 和 `mls`。一些策略，如 `seeotheruids`、`portacl` 和 `partition`，根本不使用标签。

使用多标签策略在一个分区上并建立多标签安全模型可能会增加管理开销，因为文件系统中的每个项目（包括目录、文件甚至设备节点）都有一个标签。

以下命令将在指定的 UFS 文件系统上设置 `multilabel`。此操作只能在单用户模式下执行，并且不要求对交换文件系统进行此操作：

```sh
# tunefs -l enable /
```

> **注意**
>
> 一些用户在设置 `multilabel` 标志时遇到问题。如果是这种情况，请查阅 [MAC 框架故障排除](https://docs.freebsd.org/en/books/handbook/mac/#mac-troubleshoot)。

由于多标签策略是按文件系统设置的，因此如果文件系统布局设计良好，则可能不需要多标签策略。例如，考虑一个 FreeBSD Web 服务器的安全 MAC 模型。这台机器对默认文件系统中的所有内容使用单标签 `biba/high`。如果 Web 服务器需要以 `biba/low` 运行以防止向上写入能力，它可以安装到一个单独的 UFS **/usr/local** 文件系统，该文件系统设置为 `biba/low`。

## 18.3.1. 标签配置

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

所有配置都可以使用 `setfmac` 来完成，`setfmac` 用于设置系统对象的 MAC 标签，`setpmac` 用于设置系统主体的标签。例如，要将 `biba` MAC 标签设置为 `high`，应用于 **test**：

```sh
# setfmac biba/high test
```

如果配置成功，命令提示符将返回而没有错误。常见的错误是 `Permission denied`，通常发生在设置或修改受限对象的标签时。其他情况可能会产生不同的失败。例如，文件可能不是尝试重新标记该对象的用户拥有的，或者对象可能不存在，或者对象可能是只读的。强制性策略将不允许进程重新标记文件，可能是由于文件、进程或拟议的新标签值的某个属性。例如，如果一个低完整性运行的用户尝试更改一个高完整性文件的标签，或者一个低完整性运行的用户尝试将低完整性文件的标签更改为高完整性标签，则这些操作将失败。

系统管理员可以使用 `setpmac` 来覆盖策略模块的设置，为调用的进程分配一个不同的标签：

```sh
# setfmac biba/high test
Permission denied
# setpmac biba/low setfmac biba/high test
# getfmac test
test: biba/high
```

对于当前正在运行的进程（例如 sendmail），通常使用 `getpmac`。此命令需要传递进程 ID（PID），而不是命令名。如果用户试图操作不在其访问范围内的文件，并且受到加载的策略模块规则的约束，则会显示 `Operation not permitted` 错误。

## 18.3.2. 预定义标签

一些支持标签功能的 FreeBSD 策略模块提供了三个预定义标签：`low`、`equal` 和 `high`，它们的含义如下：

* `low` 被认为是对象或主体可能具有的最低标签设置。将此标签设置在对象或主体上，将阻止它们访问标记为高的对象或主体。
* `equal` 设置主体或对象为禁用或不受影响，仅应放置在被视为免受策略影响的对象上。
* `high` 赋予对象或主体在 Biba 和 MLS 策略模块中可用的最高设置。

这些策略模块包括 [mac\_biba(4)](https://man.freebsd.org/cgi/man.cgi?query=mac_biba\&sektion=4\&format=html)、[mac\_mls(4)](https://man.freebsd.org/cgi/man.cgi?query=mac_mls\&sektion=4\&format=html) 和 [mac\_lomac(4)](https://man.freebsd.org/cgi/man.cgi?query=mac_lomac\&sektion=4\&format=html)。每个预定义标签都会建立不同的信息流指令。请参考模块的手册页，以确定通用标签配置的特征。

## 18.3.3. 数字标签

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

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

这可以解释为 "Biba 策略标签/等级 10:组件 2、3 和 6：(等级 5 …​)"

在此示例中，第一个等级将被视为有效等级及其有效的组件，第二个等级是低等级，最后一个是高等级。在大多数配置中，这种精细的设置并不需要，因为它们被认为是高级配置。

系统对象只有当前的等级和组件。系统主体反映了系统中可用权限的范围，以及网络接口，在这些接口用于访问控制时。

主体和对象对中的等级和组件用于构建一种称为 *支配* 的关系，在这种关系中，主体支配对象，对象支配主体，或者两者都不支配对方，或者两者都支配对方。当两个标签相等时，就会发生“双方支配”的情况。由于 Biba 的信息流特性，用户具有一组对应于项目的组件的权限，但对象也有一组组件。用户可能需要使用 `su` 或 `setpmac` 来子集化其权限，以便访问他们被限制的组件中的对象。

## 18.3.4. 用户标签

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

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

```ini
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` 重建登录类能力数据库。

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

## 18.3.5. 网络接口标签

可以在网络接口上设置标签，以帮助控制数据流经网络的方式。使用网络接口标签的策略与涉及对象的策略具有相同的功能。例如，Biba 中设置为高完整性的用户将不允许访问标签为 `low` 的网络接口。

设置网络接口上的 MAC 标签时，可以将 `maclabel` 传递给 `ifconfig`：

```sh
# ifconfig bge0 maclabel biba/equal
```

此示例将 `bge0` 接口的 MAC 标签设置为 `biba/equal`。当使用类似于 `biba/high(low-high)` 的设置时，应该将整个标签括起来，以防止返回错误。

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