diff options
author | Xin LI <delphij@FreeBSD.org> | 2006-05-07 17:57:32 +0000 |
---|---|---|
committer | Xin LI <delphij@FreeBSD.org> | 2006-05-07 17:57:32 +0000 |
commit | d66ba51686af7bfa9e1792fbd4711af0a66ff3ac (patch) | |
tree | ff3e380facaa5e05108c03e749e36fef68b3c1bb /zh_CN.GB2312/books/handbook/mac | |
parent | 203607eebcaa9c71b76aef58bb76fad177028399 (diff) |
Notes
Diffstat (limited to 'zh_CN.GB2312/books/handbook/mac')
-rw-r--r-- | zh_CN.GB2312/books/handbook/mac/chapter.sgml | 702 |
1 files changed, 283 insertions, 419 deletions
diff --git a/zh_CN.GB2312/books/handbook/mac/chapter.sgml b/zh_CN.GB2312/books/handbook/mac/chapter.sgml index e017158df9..33816cdbc9 100644 --- a/zh_CN.GB2312/books/handbook/mac/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/mac/chapter.sgml @@ -2,7 +2,7 @@ The FreeBSD Documentation Project The FreeBSD Simplified Chinese Project - Original Revision: 1.53 + Original Revision: 1.65 $FreeBSD$ --> @@ -109,7 +109,7 @@ <title>未涉及的内容</title> <para>本章涵盖了与 <acronym>MAC</acronym> 框架有关的诸多方面的安全问题; - 尽管如此, 本章将不涉及新 <acronym>MAC</acronym> 安全策略模块的开发成果。 + 而新的 <acronym>MAC</acronym> 安全策略模块的开发成果则不会涉及。 <acronym>MAC</acronym> 框架中所包含的一部分安全策略模块, 具有一些用于测试及新模块开发的特定属性, 其中包括 &man.mac.test.4;、 &man.mac.stub.4; @@ -135,6 +135,14 @@ </listitem> <listitem> + <para><emphasis>高水位线</emphasis>(high water mark): + 高水位线策略是一种允许提高安全级别, 以期访问更高级别的信息的安全策略。 + 在多数情况下, 当进程结束时, 又会回到原先的安全级别。 + 目前, &os; <acronym>MAC</acronym> + 框架尚未提供这样的策略, 在这里介绍其定义主要是希望给您一个完整的概念。</para> + </listitem> + + <listitem> <para><emphasis>完整性</emphasis>: 作为一个关键概念, 完整性是数据可信性的一种程度。 若数据的完整性提高, 则数据的可信性相应提高。</para> @@ -156,6 +164,14 @@ </listitem> <listitem> + <para><emphasis>低水位线</emphasis> (low water mark): + 低水位线策略允许降低安全级别, 以访问安全性较差的信息。 + 多数情况下, 在进程结束时, 又会回到原先的安全级别。 + 目前在 &os; 中唯一实现这一安全策略的是 + &man.mac.lomac.4;。</para> + </listitem> + + <listitem> <para><emphasis>多重标签 (multilabel)</emphasis>: <option>multilabel</option> 属性是一个文件系统选项。 该选项可在单用户模式下通过 &man.tunefs.8; 程序进行设置。 可以在引导时使用的 &man.fstab.5; @@ -458,7 +474,7 @@ test: biba/high</screen> :passwordtime=91d:\ :umask=022:\ :ignoretime@:\ - :label=partition/13,mls/5,biba/10(5-15),lomac10[2]:</programlisting> + :label=partition/13,mls/5,biba/10(5-15),lomac/10[2]:</programlisting> <para><literal>label</literal> 选项用以设定用户分级默认标签, 该标签将由 <acronym>MAC</acronym> 执行。 @@ -667,6 +683,56 @@ test: biba/high</screen> </sect2> </sect1> + <sect1 id="mac-planning"> + <title>规划安全配置</title> + + <para>在实施新技术时, 首先进行规划都是非常好的习惯。 + 在这段时间, 管理员一般都应 <quote>进行全面的考察</quote>, + 这至少应包括下列因素:</para> + + <itemizedlist> + <listitem> + <para>方案实施的必要条件;</para> + </listitem> + + <listitem> + <para>方案实施的目标;</para> + </listitem> + </itemizedlist> + + <para>就实施 <acronym>MAC</acronym> 而言, 这包括:</para> + + <itemizedlist> + <listitem> + <para>如何在目标系统上对信息和资源进行分类。</para> + </listitem> + + <listitem> + <para>需要限制哪类信息或资源的访问, 以及应采用何种限制。</para> + </listitem> + + <listitem> + <para>需要使用哪些 <acronym>MAC</acronym> 模块来完成这些目标。</para> + </listitem> + </itemizedlist> + + <para>尽管重新配置并修改系统资源和安全配置是可行的, + 但查找整个系统并修复暨存的文件和用户帐号并不是一件轻而易举的事情。 + 规划有助于完成无问题且有效的可信系统实施。 <emphasis>事先</emphasis> + 对采用 <acronym>MAC</acronym> 的可信系统, 以及其配置做试运行十分有益, + 因为这对实施的成败至关重要。 + 草率散漫地配置 <acronym>MAC</acronym> 通常是导致失败的祸根。</para> + + <para>不同的环境可能会有不同的需求。 + 建立多层次而完备的安全配置, 可以减少系统正式运转之后所需要的微调。 + 同样地, 接下来的章节将介绍管理员能够使用的各种不同的模块; + 描述它们的使用和配置; 除此之外还有一些关于它们最适合的情景的介绍。 + 例如, web 服务器可能希望使用 &man.mac.biba.4; 和 + &man.mac.bsdextended.4; 策略, 而其他情况下, + 例如一台机器上只有少量的本地用户时, &man.mac.partition.4; + 则是不错的选择。</para> + </sect1> + <sect1 id="mac-modules"> <title>模块配置</title> @@ -759,13 +825,13 @@ test: biba/high</screen> 使得管理员能够建立一种类似防火墙的规则集, 以文件系统层次结构中的保护文件、 实用程序,以及目录。 在尝试访问文件系统对象时, 会遍历规则表, - 直至找到匹配的规则, 或到达表尾。 这一行为可以通过使用 + 直至找到匹配的规则, 或到达表尾。 这一行为可以通过修改 &man.sysctl.8; 参数, security.mac.bsdextended.firstmatch_enabled 来进行设置。 与 &os; 中的其他防火墙设置类似, 也可以建一个文件来配置访问控制策略, 并通过 &man.rc.conf.5; 变量的配置在系统引导时加载它。</para> - <para>规则表可以通过工具 &man.ugidfw.8; 工具来创建, + <para>规则表可以通过工具 &man.ugidfw.8; 工具来输入, 其语法类似 &man.ipfw.8;。 此外还可以通过使用 &man.libugidfw.3; 库来开发其他的工具。</para> @@ -981,100 +1047,6 @@ test: biba/high</screen> </sect2> </sect1> - <sect1 id="mac-labelingpolicies"> - <title>包含标签功能的 MAC 策略</title> - - <para>接下来的几节中, 将讨论使用标签的 <acronym>MAC</acronym> - 策略。</para> - - <para>这一章从此处开始将集中于对 - &man.mac.biba.4;、 &man.mac.lomac.4;、 - &man.mac.partition.4;, 以及 &man.mac.mls.4; 的介绍。</para> - - <note> - <para>此处提供的仅仅是示范的配置, 不应用于在实际的生产环境中实施。 - 这份文档的目标是在展示配置写法的同时, 以实例的形式, - 对如何实施和进行测试予以介绍。</para> - </note> - - <para>要让配置正确工作, 首先需要进行一些准备工作。</para> - - <sect2 id="mac-prep"> - <title>准备使用标签策略</title> - - <para>下述修改需要在 - <filename>login.conf</filename> 文件上实施:</para> - - <itemizedlist> - <listitem> - <para>需要增加一个 <literal>insecure</literal> 级, 或其他类似类型的分级。 - 这里, <literal>insecure</literal> 级并不是必需的, - 只是作为例子加以展示; 不同的配置完全可以使用其他的分级名称。</para> - </listitem> - - <listitem> - <para><literal>insecure</literal> 级应包含下列配置和定义。 - 其中的许多内容都可以根据需要修改, - 但定义了默认标签的行都是必需的, 您应留下它们。</para> - - <programlisting>insecure:\ - :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:</programlisting> - - <para>需要在 - &man.login.conf.5; 上执行 &man.cap.mkdb.1; 之后, - 用户才能够切换到新的分级。</para> - - <para><username>root</username> 用户名也应出现在某个登录级中; - 否则, <username>root</username> 执行每一个命令的时候, - 都需要使用 <command>setpmac</command>。</para> - - <warning> - <para>重建 <filename>login.conf</filename> - 数据库可能会导致 daemon 级在稍后发生某些错误。 - 简单地去掉注释掉 daemon 的注释符并重建数据库, - 会有助于消除这类问题。</para> - </warning> - </listitem> - - <listitem> - <para>确保将要使用 - <acronym>MAC</acronym> 标签的所有分区, 都能够支持 - <option>multilabel</option>。 我们必须这样做, - 因为这里的很多例子中都包含了不同的、 用于测试目的的标签。 - 作为预防性措施之一, 您应复查 - <command>mount</command> 命令的输出结果。</para> - </listitem> - - <listitem> - <para>把将被应用更高级别的安全机制的那些用户转到新的用户 class 中。 - 运行 &man.pw.8; - 或 &man.vipw.8; 可以完成这样的任务。</para> - </listitem> - </itemizedlist> - </sect2> - </sect1> - <sect1 id="mac-partition"> <title>MAC partition (分区) 模块</title> @@ -1257,21 +1229,34 @@ test: biba/high</screen> <screen>&prompt.root; <userinput>getfmac test</userinput></screen> - <para>这是 <acronym>MLS</acronym> 策略特性的一个摘要。 - 另一种方法是建立一个主策略文件, - 把它放到 <filename class="directory">/etc</filename>, - 指定 <acronym>MLS</acronym> 策略信息, - 并作为 <command>setfmac</command> 命令的输入。 - 这一方法将在其他策略之后进行介绍。</para> - - <para>观察: 拥有较低 clearance 的对象不能够观察较高 clearance 的进程。 - 基本的策略是在每一个不应被读取的对象上应用 <literal>mls/high</literal>, - 即使需要在其上进行写操作。 在每所有不应被写的对象上应用 - <literal>mls/low</literal>, 即使需要在其上进行度操作。 - 最后, 在其他对象上应用 - <literal>mls/equal</literal>。 所有标记为 - <literal>insecure</literal> 的用户应被设置为 - <literal>mls/low</literal>。</para> + <para>以上是对于 <acronym>MLS</acronym> 策略提供功能的概要。 + 另一种做法是在 <filename class="directory">/etc</filename> + 中建立一个主策略文件, 并在其中指定 <acronym>MLS</acronym> 策略信息, + 作为 <command>setfmac</command> 命令的输入。 这种方法, + 将在其他策略之后进行介绍。</para> + + <sect2> + <title>规划托管敏感性</title> + + <para>通过使用多级安全策略模块, + 管理员可以规划如何控制敏感信息的流向。 默认情况下, + 由于其默认的禁止向上读以及向下写的性质, + 系统会默认将所有对象置于较低的状态。 这样, + 所有的对象都可以访问, + 而管理员则可以在配置阶段慢慢地进行提高信息的敏感度这样的修改。</para> + + <para>除了前面介绍的三种基本标签选项之外, + 管理员还可以根据需要将用户和用户组进行分组, + 以阻止它们之间的信息流。 一些人们比较熟悉的信息限界词汇, 如 + <literal>机密</literal>、 <literal>秘密</literal>, + 以及 <literal>绝密</literal> 可以方便您理解这一概念。 + 管理员也可以简单地根据项目级别建不同的分组。 + 无论采用何种分类方法, 在实施限制性的策略之前, + 都必须首先想好如何进行规划。</para> + + <para>这个安全策略模块最典型的用例是电子商务的 web 服务器, + 其上的文件服务保存公司的重要信息以及金融机构的情况。 + 对于只有两三个用户的个人工作站而言, 则可能不甚适用。</para> </sect1> <sect1 id="mac-biba"> @@ -1372,9 +1357,35 @@ test: biba/high</screen> &prompt.root; <userinput>getfmac test</userinput> test: biba/low</screen> - <para>观察: 较低完整性级别的 subject 不能向较高完整性级别的 subject 写; - 较高完整性级别的 subject 也不能观察或读取较低完整性级别的对象。 - 设置最低级别的 label 能够使 subject 无法访问它。</para> + <sect2> + <title>规划托管完整性</title> + + <para>与敏感性不同, 完整性是要确保不受信方不能对信息进行篡改。 + 这包括了在 subject 以及 object 之间传递的信息。 + 这能够确保用户只能修改甚至访问需要他们的信息。</para> + + <para>&man.mac.biba.4; 安全策略模块允许管理员指定用户能够看到和执行的文件和程序, + 并确保这些文件能够为系统及用户或用户组所信任, 而免受其他威胁。</para> + + <para>在最初的规划阶段, 管理员必须做好将用户分成不同的等级、 + 级别和区域的准备。 在启动前后, 包括数据以及程序和使用工具在内的对象, + 用户都会无法访问。 一旦启用了这个策略模块, 系统将默认使用高级别的标签, + 而划分用户级别和等级的工作则交由管理员来进行配置。 + 与前面介绍的级别限界不同, 好的规划方法可能还包括 topic。 + 例如, 只允许开发人员修改代码库、 使用源代码编译器, + 以及其他开发工具, 而其他用户则分入其他类别, + 如测试人员、 设计人员, 以及普通用户, + 这些用户可能只拥有读这些资料的权限。</para> + + <para>通过其自然的安全控制, 完整性级别较低的主体, + 就会无法向完整性级别高的主体进行写操作; 而完整性级别较高的主体, + 也不能观察或读较低完整性级别的对象。 通过将对象的标签设为最低级, + 可以阻止所有主体对其进行的访问操作。 + 这一安全策略模块预期的应用场合包括受限的 web 服务器、 + 开发和测试机, 以及源代码库。 而对于个人终端、 + 作为路由器的计算机, 以及网络防火墙而言, + 它的用处就不大了。</para> + </sect2> </sect1> <sect1 id="mac-lomac"> @@ -1424,10 +1435,10 @@ test: biba/low</screen> </sect1> <sect1 id="mac-implementing"> - <title>通过使用 MAC 来实现安全的环境</title> + <title>MAC Jail 中的 Nagios</title> <indexterm> - <primary>MAC 实现举例</primary> + <primary>MAC Jail 中的 Nagios</primary> </indexterm> <para>下面给出了通过多种 <acronym>MAC</acronym> 模块, @@ -1438,7 +1449,11 @@ test: biba/low</screen> <para>在开始这些操作之前, 必须在每一个文件系统上设置 <literal>multilabel</literal> 选项, 这些操作在这一章开始的部分进行了介绍。 不完成这些操作, - 将导致错误的结果。</para> + 将导致错误的结果。 首先, 请确认已经安装了 + <filename role="port">net-mngt/nagios-plugins</filename>、 + <filename role="port">net-mngt/nagios</filename>, 和 + <filename role="port">www/apache13</filename> 这些 ports, + 并对其进行了配置, 且运转正常。</para> <sect2> <title>创建一个 insecure (不安全) 用户 Class</title> @@ -1468,11 +1483,11 @@ test: biba/low</screen> :passwordtime=91d:\ :umask=022:\ :ignoretime@:\ -:label=partition/13,mls/5:</programlisting> +:label=biba/10:</programlisting> <para>并在 default 用户 class 中加入:</para> - <programlisting>:label=mls/equal,biba/equal,partition/15:</programlisting> + <programlisting>:label=biba/high:</programlisting> <para>一旦完成上述操作, 就需要运行下面的命令来重建数据库:</para> @@ -1480,19 +1495,23 @@ test: biba/low</screen> </sect2> <sect2> - <title>配合正确的模块启动</title> + <title>引导配置</title> - <para>在 <filename>/boot/loader.conf</filename> 中加入下面的配置, - 以保证系统初始化过程中加载那些模块:</para> + <para>现在暂时还不要重新启动, 我们还需要在 + <filename>/boot/loader.conf</filename> 中增加下面几行, + 以便让模块随系统初始化一同加载:</para> <programlisting>mac_biba_load="YES" -mac_mls_load="YES" -mac_seeotheruids_load="YES" -mac_partition_load="YES"</programlisting> +mac_biba_load="YES" +mac_seeotheruids_load="YES"</programlisting> </sect2> <sect2> - <title>将所有用户设置为不安全的</title> + <title>配置用户</title> + + <para>使用下面的命令将 <username>root</username> 设为属于默认的 class:</para> + + <screen>&prompt.root; <userinput>pw usermod root -L default</userinput></screen> <para>所有非 <username>root</username> 或系统的用户, 现在需要一个登录 class。 登录 class 是必须的, @@ -1500,346 +1519,183 @@ mac_partition_load="YES"</programlisting> 下面的 <command>sh</command> 脚本应能完成这个工作:</para> <screen>&prompt.root; <userinput>for x in `awk -F: '($3 >= 1001) && ($3 != 65534) { print $1 }' \</userinput> - <userinput>/etc/passwd`; do pw usermod $x -L insecure; done;</userinput></screen> + <userinput>/etc/passwd`; do pw usermod $x -L default; done;</userinput></screen> + + <para>将 <username>nagios</username> 和 + <username>www</username> 这两个用户归入不安全 class:</para> - <para>改完后, 需要在 <filename>/etc/master.passwd</filename> 上运行 - <command>cap_mkdb</command> 命令。</para> + <screen>&prompt.root; <userinput>pw usermod nagios -L default</userinput></screen> + <screen>&prompt.root; <userinput>pw usermod www -L default</userinput></screen> </sect2> <sect2> - <title>完成配置</title> + <title>创建上下文文件</title> - <para>现在需要创建一个 contexts 文件; - 下面的例子来自 Robert Watson 的策略示例, 应放到 + <para>接下来需要创建一个上下文文件; 您可以把下面的实例放到 <filename>/etc/policy.contexts</filename> 中。</para> - <programlisting># 这是系统中的默认 BIBA/MLS 策略。 - -.* biba/high,mls/high -/sbin/dhclient biba/high(low),mls/high(low) -/dev(/.*)? biba/equal,mls/equal -# This is not an exhaustive list of all "privileged" devices. -/dev/mdctl biba/high,mls/high -/dev/pci biba/high,mls/high -/dev/k?mem biba/high,mls/high -/dev/io biba/high,mls/high -/dev/agp.* biba/high,mls/high -(/var)?/tmp(/.*)? biba/equal,mls/equal -/tmp/\.X11-unix biba/high(equal),mls/high(equal) -/tmp/\.X11-unix/.* biba/equal,mls/equal -/proc(/.*)? biba/equal,mls/equal -/mnt.* biba/low,mls/low -(/usr)?/home biba/high(low),mls/high(low) -(/usr)?/home/.* biba/low,mls/low -/var/mail(/.*)? biba/low,mls/low -/var/spool/mqueue(/.*)? biba/low,mls/low -(/mnt)?/cdrom(/.*)? biba/high,mls/high -(/usr)?/home/(ftp|samba)(/.*)? biba/high,mls/high -/var/log/sendmail\.st biba/low,mls/low -/var/run/utmp biba/equal,mls/equal -/var/log/(lastlog|wtmp) biba/equal,mls/equal</programlisting> - - <para>这个策略将通过在信息的上下行流上, - 根据左边列出的工具和目录实施限制来强制安全。</para> - - <para>可以通过下面的命令将其读入我们的系统:</para> + <programlisting># This is the default BIBA policy for this system. - <screen>&prompt.root; <userinput>setfsmac -ef /etc/policy.contexts /</userinput> -&prompt.root; <userinput>setfsmac -ef /etc/policy.contexts /usr</userinput></screen> +# System: +/var/run biba/equal +/var/run/* biba/equal - <note> - <para>上述文件系统布局, 可能随环境而略有不同。</para> - </note> +/dev biba/equal +/dev/* biba/equal - <para>在 <filename>/etc/mac.conf</filename> 文件中的 main - 小节需要进行下面的修改:</para> +/var biba/equal +/var/spool biba/equal +/var/spool/* biba/equal - <programlisting>default_labels file ?biba,?mls -default_labels ifnet ?biba,?mls -default_labels process ?biba,?mls,?partition -default_labels socket ?biba,?mls</programlisting> - </sect2> +/var/log biba/equal +/var/log/* biba/equal - <sect2> - <title>对配置进行测试</title> +/tmp biba/equal +/tmp/* biba/equal +/var/tmp biba/equal +/var/tmp/* biba/equal - <indexterm> - <primary>MAC 配置测试</primary> - </indexterm> +/var/spool/mqueue biba/equal +/var/spool/clientmqueue biba/equal - <para>使用 <command>adduser</command> 命令来增加用户, - 并把这个用户放到 <literal>insecure</literal> - class 中, 以用于测试。</para> +# For Nagios: +/usr/local/etc/nagios +/usr/local/etc/nagios/* biba/10 - <para>下面的例子中混合了 - <username>root</username> 和普通用户 tests 的测试结果, - 并使用提示符来区别它们。</para> +/var/spool/nagios biba/10 +/var/spool/nagios/* biba/10 - <sect3> - <title>基本的标签测试</title> +# For apache +/usr/local/etc/apache biba/10 +/usr/local/etc/apache/* biba/10</programlisting> - <screen>&prompt.user; <userinput>getpmac</userinput> -biba/15(15-15),mls/15(15-15),partition/15 -&prompt.root; <userinput>setpmac partition/15,mls/equal top</userinput></screen> + <para>这个策略通过在信息流上设置限制来强化安全。 + 在这个配置中, 包括 <username>root</username> 和其他用户在内的用户, + 都不允许访问 <application>Nagios</application>。 作为 + <application>Nagios</application> 一部分的配置文件和进程, + 都是完全独立的, 也称为 jailed。</para> - <note> - <para>在启动其他 top 进程之前应该首先杀掉我们的这个 top 进程。</para> - </note> - </sect3> + <para>接下来可以用下面的命令将其读入系统:</para> - <sect3> - <title>MAC Seeotheruids 测试</title> - - <screen>&prompt.user; <userinput>ps Zax</userinput> -biba/15(15-15),mls/15(15-15),partition/15 1096 #C: S 0:00.03 -su (bash) -biba/15(15-15),mls/15(15-15),partition/15 1101 #C: R+ 0:00.01 ps Zax</screen> - - <para>我们应该看不到其他用户的进程。</para> - </sect3> - - <sect3> - <title>MAC Partition 测试</title> - - <para>为其他测试禁用 <acronym>MAC</acronym> - <literal>seeotheruids</literal> 策略:</para> + <screen>&prompt.root; <userinput>setfsmac -ef /etc/policy.contexts /</userinput> +&prompt.root; <userinput>setfsmac -ef /etc/policy.contexts /</userinput></screen> - <screen>&prompt.root; <userinput>sysctl security.mac.seeotheruids.enabled=0</userinput> -&prompt.user; <userinput>ps Zax</userinput> -LABEL PID TT STAT TIME COMMAND - biba/equal(low-high),mls/equal(low-high),partition/15 1122 #C: S+ 0:00.02 top - biba/15(15-15),mls/15(15-15),partition/15 1096 #C: S 0:00.05 -su (bash) - biba/15(15-15),mls/15(15-15),partition/15 1123 #C: R+ 0:00.01 ps Zax</screen> + <note> + <para>随环境不同前述的文件系统布局可能会有所不同; + 不过无论如何, 都只能在一个文件系统上运行它。</para> + </note> - <para>现在所有的用户都应能够看到他们的 partition 中的所有进程了。</para> - </sect3> + <para>在 <filename>/etc/mac.conf</filename> 文件中的 main + 小节需要进行下面的修改:</para> - <sect3> - <title>测试 Biba 和 MLS 标签</title> - - <screen>&prompt.root; <userinput>setpmac partition/15,mls/equal,biba/high\(high-high\) top</userinput> -&prompt.user; <userinput>ps Zax</userinput> -LABEL PID TT STAT TIME COMMAND - biba/high(high-high),mls/equal(low-high),partition/15 1251 #C: S+ 0:00.02 top - biba/15(15-15),mls/15(15-15),partition/15 1096 #C: S 0:00.06 -su (bash) - biba/15(15-15),mls/15(15-15),partition/15 1157 #C: R+ 0:00.00 ps Zax</screen> - - <para>Biba 策略允许我们读取标签为较高标签的对象。</para> - - <screen>&prompt.root; <userinput>setpmac partition/15,mls/equal,biba/low top</userinput> -&prompt.user; <userinput>ps Zax</userinput> -LABEL PID TT STAT TIME COMMAND - biba/15(15-15),mls/15(15-15),partition/15 1096 #C: S 0:00.07 -su (bash) - biba/15(15-15),mls/15(15-15),partition/15 1226 #C: R+ 0:00.01 ps Zax</screen> - - <para>Biba 策略不允许读取低标签的对象; - 但 <acronym>MLS</acronym> 允许此类操作。</para> - - <screen>&prompt.user; <userinput>ifconfig bge0 | grep maclabel</userinput> -maclabel biba/low(low-low),mls/low(low-low) -&prompt.user; <userinput>ping -c 1 192.0.34.166</userinput> -PING 192.0.34.166 (192.0.34.166): 56 data bytes -ping: sendto: Permission denied</screen> - - <para>由于这个原因, 用户将无法 ping - <hostid role="domainname">example.com</hostid> - 或其他主机。</para> - - <para>要防止发生这类错误, 需要运行下面的命令:</para> - - <screen>&prompt.root; <userinput>sysctl security.mac.biba.trust_all_interfaces=1</userinput></screen> - - <para>这将把默认的接口标签置为不安全模式, - 这样就不会强制使用 Biba 策略了。</para> - - <screen>&prompt.root; <userinput>ifconfig bge0 maclabel biba/equal\(low-high\),mls/equal\(low-high\)</userinput> -&prompt.user; <userinput>ping -c 1 192.0.34.166</userinput> -PING 192.0.34.166 (192.0.34.166): 56 data bytes -64 bytes from 192.0.34.166: icmp_seq=0 ttl=50 time=204.455 ms ---- 192.0.34.166 ping statistics --- -1 packets transmitted, 1 packets received, 0% packet loss -round-trip min/avg/max/stddev = 204.455/204.455/204.455/0.000 ms</screen> - - <para>通过设置更为正确的标签, 我们就能够发出 - <command>ping</command> 请求了。</para> - - <para>现在建立几个文件来测试一下读写操作:</para> - - <screen>&prompt.root; <userinput>touch test1 test2 test3 test4 test5</userinput> -&prompt.root; <userinput>getfmac test1</userinput> -test1: biba/equal,mls/equal -&prompt.root; <userinput>setfmac biba/low test1 test2; setfmac biba/high test4 test5; \ - setfmac mls/low test1 test3; setfmac mls/high test2 test4</userinput> -&prompt.root; <userinput>setfmac mls/equal,biba/equal test3 && getfmac test?</userinput> -test1: biba/low,mls/low -test2: biba/low,mls/high -test3: biba/equal,mls/equal -test4: biba/high,mls/high -test5: biba/high,mls/equal -&prompt.root; <userinput>chown testuser:testuser test?</userinput></screen> - - <para>所有这些文件应属于 - <username>testuser</username> 用户。 - 现在测试一下读操作:</para> - - <screen>&prompt.user; <userinput>ls</userinput> -test1 test2 test3 test4 test5 -&prompt.user; <userinput>ls test?</userinput> -ls: test1: Permission denied -ls: test2: Permission denied -ls: test4: Permission denied -test3 test5</screen> - - <para>没有允许我们 observe pairs; 例如: - <literal>(biba/low,mls/low)</literal>, - <literal>(biba/low,mls/high)</literal> 以及 - <literal>(biba/high,mls/high)</literal>。 - 因此, 很显然读操作应该被拒绝。 - 现在测试一下写操作:</para> - - <screen>&prompt.user; <userinput>for i in `echo test*`; do echo 1 > $i; done</userinput> --su: test1: Permission denied --su: test4: Permission denied --su: test5: Permission denied</screen> - - <para>和读操作的尝试类似, write pairs 不应允许这类操作; 例如: - <literal>(biba/low,mls/high)</literal> 和 - <literal>(biba/equal,mls/equal)</literal>。</para> - - <screen>&prompt.user; <userinput>cat test?</userinput> -cat: test1: Permission denied -cat: test2: Permission denied -1 -cat: test4: Permission denied</screen> - - <para>现在以 <username>root</username> 身份进行:</para> - - <screen>&prompt.root; <userinput>cat test2</userinput> -1</screen> - </sect3> + <programlisting>default_labels file ?biba +default_labels ifnet ?biba +default_labels process ?biba +default_labels socket ?biba</programlisting> </sect2> - </sect1> - - <sect1 id="MAC-examplehttpd"> - <title>另一个例子: 使用 MAC 来约束 Web 服务器</title> - <para>将配置一个独立的位置来保存 web 数据, - 并只允许特定的用户来访问。 这样, - 拥有 <literal>biba/high</literal> 的进程就能够访问 web 数据了。</para> - - <para>首先需要创建一个用于保存 web 数据的目录:</para> - - <screen>&prompt.root; <userinput>mkdir /usr/home/cvs</userinput></screen> - - <para>接下来使用 <command>cvs</command> 来对其进行初始化:</para> - - <screen>&prompt.root; <userinput>cvs -d /usr/home/cvs init</userinput></screen> + <sect2> + <title>启用网络</title> - <para>第一件事是启用 <literal>biba</literal> - 策略, 因此应把 <literal>mac_biba_enable="YES"</literal> - 加入到 <filename>/boot/loader.conf</filename>。 - 当然, 这样做的前提是在内核中启用了 <acronym>MAC</acronym> 支持。</para> + <para>在 + <filename>/boot/loader.conf</filename> 中增加下列内容:</para> - <para>从现在开始, 整个系统中的所有对象, - 都会默认设置为 <literal>biba/high</literal>。</para> + <programlisting>security.mac.biba.trust_all_interfaces=1</programlisting> - <para>必须在 <filename>login.conf</filename> 中的 default (默认) 用户 - class 上进行下列修改:</para> + <para>将下述内容加入 <filename>rc.conf</filename> 中的网络接口配置。 + 如果主 Internet 配置是通过 <acronym>DHCP</acronym> 完成的, + 则需要在每次系统启动之后手工执行类似的配置:</para> - <programlisting>:ignoretime@:\ - :umask=022:\ - :label=biba/high:</programlisting> + <programlisting>maclabel biba/equal</programlisting> + </sect2> - <para>现在每个用户都需要放到 default class 中; - 类似下面的命令:</para> + <sect2> + <title>测试配置</title> - <screen>&prompt.root; <userinput>for x in `awk -F: '($3 >= 1001) && ($3 != 65534) { print $1 }' \</userinput> - <userinput>/etc/passwd`; do pw usermod $x -L default; done;</userinput></screen> + <indexterm> + <primary>MAC Configuration Testing (MAC 配置测试)</primary> + </indexterm> - <para>可以很快地完成这个工作。</para> + <para>首先要确认 web 服务以及 + <application>Nagios</application> 不会随系统的初始化和重启过程而自动启动。 + 在此之前, 请在此确认 + <username>root</username> 用户不能访问 <application>Nagios</application> + 配置目录中的任何文件 如果 <username>root</username> 能够在 <filename>/var/spool/nagios</filename> + 中运行 &man.ls.1;, 则表示配置有误。 如果配置正确的话, + 您会收到一条 <quote>permission denied</quote> 错误信息。</para> - <para>接下来建立另一个 class, web, 它是 default 的一个副本, - 但将标签设置为 <literal>biba/10</literal>。</para> + <para>如果一切正常, <application>Nagios</application>、 + <application>Apache</application>, 以及 + <application>Sendmail</application> 就可以按照适应安全策略的方式启动了。 + 下面的命令将完成此工作:</para> - <para>建立一个用于在 <application>cvs</application> 中的主 web - 库的数据上工作的用户。 这个用户必须被放到我们新建立的那个登录 - class, <username>web</username> 中。</para> + <screen>&prompt.root; <userinput>cd /etc/mail && make stop && \ +setpmac biba/equal make start && setpmac biba/10 apachectl start && \ +setpmac biba/10 /usr/local/etc/rc.d/nagios.sh forcestart</userinput></screen> - <para>由于所有地方的默认值都是 <literal>biba/high</literal>, - 因此库也是一样的。 web 数据必须同样地被用户读写; - 然而, 由于我们的 web 服务器将要提供 - <literal>biba/high</literal> 用户需要访问的数据, - 因此必须将所有这些数据降级。</para> + <para>再次检查是否一切正常。 如果不是的话, 请检查日志文件和错误信息。 + 此外, 还可以用 &man.sysctl.8; 来临时禁用 &man.mac.biba.4; + 安全策略模块的强制措施, 并象之前那样进行配置和启动服务。</para> - <para>完成这些事情的最好工具是 &man.sh.1; 和 - &man.cron.8;, 它们已经由 &os; 提供了。 - 下面的脚本将完成全部所需的工作:</para> + <note> + <para><username>root</username> 用户可以放心大胆地修改安全强制措施, + 并编辑配置文件。 下面的命令可以对安全策略进行降级, 并启动一个新的 + shell:</para> - <programlisting>PATH=/bin:/usr/bin:/usr/local/bin; export PATH; -CVSROOT=/home/repo; export CVSROOT; -cd /home/web; -cvs -qR checkout -P htdocs; -exit;</programlisting> + <screen>&prompt.root; <userinput>setpmac biba/10 csh</userinput></screen> - <note> - <para>很多时候, <command>cvs</command> - Id tag 必须放到 web 站点的数据文件中。</para> + <para>要阻止这种情况发生, + 就需要配置 &man.login.conf.5; 中许可的命令范围了。 如果 &man.setpmac.8; + 尝试执行超越许可范围的命令, 则会返回一个错误, 而不是执行命令。 + 在这个例子中, 可以把 root 设为 + <literal>biba/high(high-high)</literal>。</para> </note> + </sect2> + </sect1> - <para>现在可以把这个脚本放到 - <username>web</username> 的主目录中, 并增加下面的 - &man.crontab.1; 项:</para> + <sect1 id="mac-userlocked"> + <title>User Lock Down</title> - <programlisting># Check out the web data as biba/low every twelve hours: -0 */12 * * * web /home/web/checkout.sh</programlisting> + <para>这个例子针对的是一个相对较小的存储系统, + 其用户数少于五十。 用户能够在其上登录, + 除了存储数据之外, 还可以访问一些其他资源。</para> - <para>这样, 这台机器上每十二小时都会检出一次 - <acronym>HTML</acronym> 源代码。</para> + <para>在这个场景中, &man.mac.bsdextended.4; 可以与 + &man.mac.seeotheruids.4; 并存, 以达到禁止访问非授权资源, + 同时隐藏其他用户的进程的目的。</para> - <para>Web 服务器的默认启动方式也必须进行修改, - 以便以 <literal>biba/low</literal> 来启动服务。 - 这可以通过对 - <filename>/usr/local/etc/rc.d/apache.sh</filename> - 脚本进行下面的修改来完成:</para> + <para>首先, 在 + <filename>/boot/loader.conf</filename> 中加入:</para> - <programlisting>command="setpmac biba/low /usr/local/sbin/httpd"</programlisting> + <programlisting>mac_seeotheruids_enabled="YES"</programlisting> - <para><application>Apache</application> 配置必须进行修改, - 以便在 <literal>biba/10</literal> 策略下工作。 - 因为这时软件必须配置为在设置了 <literal>biba/10</literal> - 的目录中记录日志, 否则将返回 <errorname>access denied</errorname> - 错误。</para> + <para>随后, 可以通过下述 rc.conf 变量来启用 &man.mac.bsdextended.4; + 安全策略模块:</para> - <note> - <para>完全按照上面的例子进行配置的话, - <literal>docroot</literal> 应被设置为 - <filename>/home/web/htdocs</filename>; 否则, - <application>Apache</application> - 将无法查找其提供文档的目录。</para> - </note> + <programlisting>ugidfw_enable="YES"</programlisting> - <para>同时, 也需要修改一些其他的配置变量, - 包括 <acronym>PID</acronym> 文件, - <literal>Scoreboardfile</literal>, - <literal>DocumentRoot</literal>、 日志文件的位置, - 以及其他需要写权限的配置。 - 使用 <literal>biba</literal> 时, - 所有发生在 <emphasis>没有</emphasis> 配置为 - <literal>biba/low</literal> 的写操作都会失败。</para> -<!-- -PROBLEM: CAN THIS WORK? OR SHOULD IT BE start_precmd? More testing need here. ---> - </sect1> + <para>默认规则保存在 + <filename>/etc/rc.bsdextended</filename> 中, + 并在系统初始化时加载; 但是, 其中的默认项可能需要进行一些改动。 + 因为这台机器只为获得了授权的用户提供服务, 因此除了最后两项之外, + 其它内容都应保持注释的状态。 这两项规则将默认强制加载属于用户的系统对象。</para> -<!-- -XXX + <para>在这台机器上添加需要的用户并重新启动。 出于测试的目的, + 请在两个控制台上分别以不同的用户身份登录。 + 运行 <command>ps aux</command> 命令来看看是否能看到其他用户的进程。 + 此外, 在其他用户的主目录中运行 &man.ls.1; 命令, + 如果配置正确, 则这个命令会失败。</para> - <sect1 id="mac-examplesandbox"> - <title>An Example of a MAC Sandbox</title> + <para>不要尝试以 <username>root</username> 用户的身份进行测试, + 除非您已经修改了特定的 <command>sysctl</command> 来阻止超级用户的访问。</para> - <para>An example of placing users in a sandbox using - <acronym>MAC</acronym> should go here.</para> + <note> + <para>在添加新用户时, 他们的 &man.mac.bsdextended.4 + 规则不会自动出现在规则集表中。 要迅速更新规则集, + 只需简单地使用 &man.kldunload.8; 和 &man.kldload.8; + 工具来卸载并重新加载安全策略模块。</para> + </note> </sect1> ---> <sect1 id="mac-troubleshoot"> <title>MAC 框架的故障排除</title> @@ -1973,6 +1829,14 @@ XXX 仔细检查 <filename>login.conf</filename> 以确保所有的 <option>label</option> 选项都已经删除, 然后使用 <command>cap_mkdb</command> 命令来重建数据库。</para> + + <para>这种情况也可能在通过策略来限制访问 + <filename>master.passwd</filename> 文件或对应的那个数据库时发生。 + 这主要是由于管理员修改受某一 label 限制的文件, + 而与系统级的通用策略发生了冲突。 这时, + 用户信息将由系统直接读取, 而在文件继承了新的 label + 之后则会拒绝访问。 此时, 只需使用 + &man.sysctl.8; 禁用这一策略, 一切就会恢复正常了。</para> </sect2> </sect1> </chapter> |