18.3.了解 MAC 标签 ================== MAC 标签是一种安全属性,可应用于整个系统的主体和客体。在设置标签时,管理员必须了解其含义,以防止系统出现意外或不愿意看到的行为。一个客体上的可用属性取决于加载的策略模块,因为策略模块以不同的方式解释它们的属性。 客体上的安全标签是作为策略的安全访问控制决策的一部分来使用的。对于某些策略,标签包含了做出决定所需的所有信息。在其他策略中,标签可以作为更大的一套规则的一部分来处理。 有两种类型的标签策略:单一标签和多重标签。默认情况下,系统将使用单一标签。管理员应该了解每一种的优点和缺点,以便实施符合系统安全模型要求的策略。 单一标签安全策略只允许对每个主体或客体使用一个标签。由于单一标签策略在整个系统中执行一套访问权限,它提供了较低的管理开销,但减少支持标签的策略的灵活性。然而,在许多环境中,单一标签策略可能是所需的。 单一标签策略有点类似于 DAC,因为 ``root`` 配置策略,使用户被放在适当的类别和访问级别中。一个值得注意的区别是,许多策略模块也可以限制 ``root``\ 。然后,对客体的基本控制将被释放给组,但 ``root`` 可以在任何时候撤销或修改这些设置。 在适当的时候,可以通过向 `tunefs(8) `__ 传递\ ``多重标签``\ 来在 UFS 文件系统上设置多标签策略。多重标签策略允许每个主体或客体有自己独立的 MAC 标签。使用多重标签或单一标签策略的决定只需要用于实现标签功能的策略,如 ``biba``\ 、\ ``lomac`` 和 ``mls``\ 。一些策略,如 ``seeotheruids``\ 、\ ``portacl`` 和 ``partition`` 根本不使用标签。 在一个区间上使用多标签策略并建立一个多标签安全模型会增加管理开销,因为该文件系统中的所有东西(包括目录、文件,甚至是设备节点)都有一个标签。 下面的命令将在指定的 UFS 文件系统上设置\ ``多重标签``\ 。这只能在单用户模式下进行,对交换分区文件系统来说不是一个要求。 .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # tunefs -l enable / .. **注意** 某些用户在 root 分区上设置\ ``多重标签``\ 标志时遇到了问题。如果是这种情况,请查看 `MAC 框架疑难解答 `__\ 。 由于多重标签策略是在每个文件系统的基础上设置的,如果文件系统布局设计得好,可能就不需要多重标签策略。思考以下用于 FreeBSD web 服务器的安全 MAC 模型示例:这台机器对默认文件系统中的所有东西都使用单一标签,即 ``biba/high``\ 。如果网络服务器需要在 ``biba/low`` 下运行以防止写入功能,它可以被安装到一个单独的 UFS **/usr/local** 文件系统,设置为 ``biba/low``\ 。 18.3.1.标签配置 --------------- 实际上,标签策略模块配置的所有方面都将使用基本的系统实用程序进行。这些命令为客体或主体的配置或对配置的操作和验证提供一个简单的界面。 所有的配置都可以使用 ``setfmac`` 和 ``setpmac`` 来完成,前者用于设置系统客体的 MAC 标签,后者用于设置系统主体的标签。例如,在 **test** 中把 biba 的 MAC 标签设置为 ``high``\ 。 .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # setfmac biba/high test 如果配置成功,将无报错地返回到命令行。一个常见的错误是 ``Permission denied``\ ,这通常发生在对一个受限制的客体设置或修改标签时。其他情况可能产生不同的问题。例如,文件可能不属于试图重新标记该客体的用户,该客体可能不存在,或者该客体可能是只读的。强制性的策略可能会因为文件属性,进程属性,或建议的新标签值属性而不允许进程重新标记文件。例如,如果一个以低完整性运行的用户试图改变一个高完整性文件的标签,或者一个以低完整性运行的用户试图将一个低完整性文件的标签改为高完整性标签,这些操作将失败。 系统管理员可以使用 ``setpmac`` 来覆盖策略模块的设置,给被调用的进程分配一个不同的标签: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # setfmac biba/high test Permission denied # setpmac biba/low setfmac biba/high test # getfmac test test: biba/high 对于当前正在运行的进程,如 ``sendmail``\ ,通常使用 ``getpmac`` 来代替。这个命令用一个进程 ID(PID)来代替命令名称。如果用户试图操作一个不在其访问范围内的文件,根据加载的策略模块的规则,将显示不允许操作的错误。 18.3.2.预定义标签 ----------------- 一些支持标签功能的 FreeBSD 策略模块提供了三个预定义的标签:\ ``low``\ 、\ ``equal`` 和 ``high``\ ,其中: - ``low`` 被视为客体或主体可能具有的最低标签设置。在客体或主体上设置此项会阻止它们访问标记为“高”的客体或主体。 - ``equal`` 将主题或客体设置为禁用或不受影响,并且只应放置在被视为从策略中免除的客体上。 - ``high`` 为客体或主体授予 Biba 和 MLS 策略模块中可用的最高设置。 这些策略模块包括 `mac_biba(4) `__\ 、\ `mac_mls(4) `__ 和 `mac_lomac(4) `__\ 。每个预定义的标签都建立不同的信息流指令。请参阅模块的手册页,以确定通用标签配置的特征。 18.3.3.数字标签 --------------- Biba 和 MLS 策略模块支持数字标签,可以设置该标签以指示分层控制的精确级别。此数字级别用于将信息分区或分类到不同的分类组中,仅允许访问该组或更高级别的组。例如: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session 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 的信息流性质,用户对一组可能对应于项目的区间有权利,但客体也有一组区间。用户可能不得不使用 ``su`` 或 ``setpmac`` 对他们的权力进行分组,以便访问他们不受限制的区间中的客体。 18.3.4.用户标签 --------------- 用户需具有标签,以便其文件和进程与系统上定义的安全策略正确交互。这是在 **/etc/login.conf** 中使用登录分级配置的。每个使用标签的策略模块都将实现用户类设置。 要设置由 MAC 强制执行的用户类默认标签,请添加一个条目。下面显示包含每个策略模块的示例条目。请注意,在实际配置中,管理员永远不会启用每个策略模块。建议在实现任何配置之前查看本章的其余部分。 .. raw:: latex \diilbookstyleinputcell .. code:: shell-session 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``: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # ifconfig bge0 maclabel biba/equal 这个例子将在 ``bge0`` 接口上设置 ``biba/equal`` 的 MAC 标签。当使用类似 ``于biba/high(low-high)`` 的设置时,应该引用整个标签以防止返回错误。 每一个支持标签的策略模块都有一个可调整的功能,可以用来禁用网络接口上的 MAC 标签。将标签设置为等值会有类似的效果。请查看 ``sysctl`` 的输出,策略的手册页面,以及本章其余部分的信息,以了解关于这些可调选项的更多信息。