diff options
author | Xin LI <delphij@FreeBSD.org> | 2005-04-06 11:12:52 +0000 |
---|---|---|
committer | Xin LI <delphij@FreeBSD.org> | 2005-04-06 11:12:52 +0000 |
commit | cd11b47b286e4df0ef6205d97bf7bd2043f57642 (patch) | |
tree | b831b4c1ed21ec538ba624ead69528b77f91f2cb /zh_CN.GB2312/books/handbook | |
parent | 4b24022ded710b87a9093e02fa0ca4e7d98c54ac (diff) |
Notes
Diffstat (limited to 'zh_CN.GB2312/books/handbook')
-rw-r--r-- | zh_CN.GB2312/books/handbook/Makefile | 5 | ||||
-rw-r--r-- | zh_CN.GB2312/books/handbook/book.sgml | 11 | ||||
-rw-r--r-- | zh_CN.GB2312/books/handbook/chapters.ent | 5 | ||||
-rw-r--r-- | zh_CN.GB2312/books/handbook/security/chapter.sgml | 1590 |
4 files changed, 539 insertions, 1072 deletions
diff --git a/zh_CN.GB2312/books/handbook/Makefile b/zh_CN.GB2312/books/handbook/Makefile index 87a4958500..02fc44bfac 100644 --- a/zh_CN.GB2312/books/handbook/Makefile +++ b/zh_CN.GB2312/books/handbook/Makefile @@ -1,9 +1,9 @@ # # $FreeBSD$ # -# Build the FreeBSD Handbook (Chinese). +# Build the FreeBSD Handbook (Simplified Chinese). # -# Original revision: 1.90 +# Original revision: 1.91 # ------------------------------------------------------------------------ # @@ -163,6 +163,7 @@ SRCS+= cutting-edge/chapter.sgml SRCS+= desktop/chapter.sgml SRCS+= disks/chapter.sgml SRCS+= eresources/chapter.sgml +SRCS+= firewalls/chapter.sgml SRCS+= install/chapter.sgml SRCS+= introduction/chapter.sgml SRCS+= kernelconfig/chapter.sgml diff --git a/zh_CN.GB2312/books/handbook/book.sgml b/zh_CN.GB2312/books/handbook/book.sgml index e9e81e2844..d8ea2eafb5 100644 --- a/zh_CN.GB2312/books/handbook/book.sgml +++ b/zh_CN.GB2312/books/handbook/book.sgml @@ -1,8 +1,8 @@ <!-- The FreeBSD Documentation Project - The FreeBSD Chinese (Simplified) Documentation Project + The FreeBSD Simplified Chinese Documentation Project - Original Revision: 1.156 + Original Revision: 1.159 $FreeBSD$ --> @@ -35,6 +35,7 @@ <!ENTITY % chap.serialcomms "IGNORE"> <!ENTITY % chap.ppp-and-slip "IGNORE"> <!ENTITY % chap.advanced-networking "IGNORE"> +<!ENTITY % chap.firewalls "IGNORE"> <!ENTITY % chap.network-servers "IGNORE"> <!ENTITY % chap.mail "IGNORE"> <!ENTITY % chap.cutting-edge "IGNORE"> @@ -69,6 +70,7 @@ <year>2002</year> <year>2003</year> <year>2004</year> + <year>2005</year> <holder>The FreeBSD Documentation Project</holder> </copyright> @@ -258,6 +260,10 @@ </listitem> <listitem> + <para>防火墙</para> + </listitem> + + <listitem> <para>其他高级网络话题</para> </listitem> </itemizedlist> @@ -270,6 +276,7 @@ <![ %chap.ppp-and-slip; [ &chap.ppp-and-slip; ]]> <![ %chap.mail; [ &chap.mail; ]]> <![ %chap.network-servers; [ &chap.network-servers; ]]> + <![ %chap.firewalls; [ &chap.firewalls; ]]> <![ %chap.advanced-networking; [ &chap.advanced-networking; ]]> </part> diff --git a/zh_CN.GB2312/books/handbook/chapters.ent b/zh_CN.GB2312/books/handbook/chapters.ent index a7ed45b0dd..fd70fde9a3 100644 --- a/zh_CN.GB2312/books/handbook/chapters.ent +++ b/zh_CN.GB2312/books/handbook/chapters.ent @@ -5,8 +5,8 @@ chapter's .sgml file is stored. Chapters should be listed in the order in which they are referenced. - - Original revision: 1.28 + + Original revision: 1.29 $FreeBSD$ --> @@ -42,6 +42,7 @@ <!ENTITY chap.ppp-and-slip SYSTEM "ppp-and-slip/chapter.sgml"> <!ENTITY chap.mail SYSTEM "mail/chapter.sgml"> <!ENTITY chap.network-servers SYSTEM "network-servers/chapter.sgml"> +<!ENTITY chap.firewalls SYSTEM "firewalls/chapter.sgml"> <!ENTITY chap.advanced-networking SYSTEM "advanced-networking/chapter.sgml"> <!-- Part five (appendices) --> diff --git a/zh_CN.GB2312/books/handbook/security/chapter.sgml b/zh_CN.GB2312/books/handbook/security/chapter.sgml index 49ba535915..7e1baf5111 100644 --- a/zh_CN.GB2312/books/handbook/security/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/security/chapter.sgml @@ -2,7 +2,7 @@ The FreeBSD Documentation Project The FreeBSD Simplified Chinese Project - Original Revision: 1.228 + Original Revision: 1.266 $FreeBSD$ --> @@ -23,12 +23,14 @@ <sect1 id="security-synopsis"> <title>概述</title> - <para> - 这一章将对系统安全的基本概念进行介绍,除此之外,还将介绍一些好的习惯,以及 &os; - 下的一些更深入的话题。这章的许多内容对于一般的系统和Internet安全也适用。如今, - Internet已经不再像以前那样是一个人人都愿意与您作好邻居的 <quote>友善</quote> - 的地方。 让系统更加安全,将保护您的数据、智力财产、时间, - 以及其他很多东西不至于被入侵者或类似人员所窃取。</para> + <para>这一章将对系统安全的基本概念进行介绍, 除此之外, 还将介绍一些好的习惯, 以及 + &os; 下的一些更深入的话题。 这章的许多内容对于一般的系统和 Internet + 安全也适用。 如今, Internet + 已经不再像以前那样是一个人人都愿意与您作好邻居的 <quote>友善</quote> + 的地方。 让系统更加安全, 将保护您的数据、 智力财产、 时间, + 以及其他很多东西不至于被入侵者或心存恶意的人所窃取。</para> + + <para>&os; 提供了一系列工具和机制来保证您系统和网络的完整和安全。</para> <para>&os;提供了大量的工具和机制来确保您的系统和网络的安全。</para> @@ -64,12 +66,8 @@ </listitem> <listitem> - <para>如何使用 <acronym>IPFW</acronym> 来创建防火墙。</para> - </listitem> - - <listitem> - <para>如何配置 IPsec 并在 &os;/&windows; 间建立 - <acronym>VPN</acronym>。</para> + <para>如何配置 IPsec 并在 &os;/&windows; + 机器之间建构 <acronym>VPN</acronym>。</para> </listitem> <listitem> @@ -82,9 +80,18 @@ </listitem> <listitem> + <para>如何使用 <application>Portaudit</application> + 工具来审核从 Ports Collection 安装的第三方软件包的安全性。</para> + </listitem> + + <listitem> <para>如何从 &os; 的安全公告中获得有用信息并采取相应措施。</para> </listitem> + <listitem> + <para>对于进程记帐功能的感性认识, + 并了解如何在 &os; 中启用它。</para> + </listitem> </itemizedlist> <para>在开始阅读这章之前,您需要:</para> @@ -95,32 +102,44 @@ </listitem> </itemizedlist> + <para>其他安全方面的话题, 则贯穿本书的始终。 + 例如, 强制性访问控制 (MAC) 在 <xref + linkend="mac"> 中进行了介绍, 而 Internet 防火墙则在 <xref + linkend="firewalls"> 中进行了讨论。</para> </sect1> <sect1 id="security-intro"> <title>介绍</title> - <para>安全是系统管理至始至终最基本的要求。由于所有的 BSD &unix; - 多用户系统都有它自身内在的安全性,建立和维护额外的安全机制, - 确保用户的 <quote>诚实</quote> 大概是系统管理最艰巨的工作之一。 - 机器仅保持着建立时最原始的安全性,而安全性必须要考虑到用户使用的便利性。 - 通常, &unix; 系统能够支持巨大的并发用户处理, - 而这些处理中绝大部分是以服务器形式处理的 — 这意味着外部的实体能够与它们互连和互动。 - 昨天的小型计算机和主机变成了今天的桌面机,计算机已连到局域网和互联网, - 安全就成了一个非常严峻的问题。</para> - - <para>通过像 <quote>洋葱</quote> 那样分层的方法,能够很好地实现安全。 - 简而言之,您所要做的就是创建很多的安全层,然后仔细地监视系统以防入侵。 - 不过,过多地创建安全层可能会出现问题,您可能不希望大量地阅读检测结果, - 因为检测是所有安全机制中最重要的一环。例如,在所有的系统可执行文件上都设置 - <literal>schg</literal> 标记 (参考 &man.chflags.1;) - 的意义就不大,因为尽管这也许能够暂时地保护那些执行文件, - 它阻止了攻击者轻易地闯入并作一个容易被检测出来的修改, - 却很可能最终导致您的安全机制根本检测不到入侵者。</para> - - <para>系统安全也涉及到许多攻击方式,包括试图摧毁或使系统无法使用, - 但并不试图窃取 <username>root</username> 帐号 - (<quote>干掉 root</quote>)。 安全问题主要分成以下几类:</para> + <para>安全是系统管理员自始至终的基本要求。 由于所有的 BSD &unix; + 多用户系统都提供了与生俱来的安全性, 因此建立和维护额外的安全机制, + 确保用户的 <quote>诚实</quote> + 可能也就是最需要系统管理员考虑的艰巨的工作了。 + 机器的安全性取决于您设置的安全设施, 而许多安全方面的考虑, + 则会与人们使用计算机时的便利性相矛盾。 一般来说, &unix; + 系统能够胜任数目众多进程并发地处理各类任务, + 这其中的许多进程是以服务身份运行的 — 这意味着, + 外部实体能够与它们互联并产生会话交互。 如今的桌面系统, + 已经能够达到许多昔日的小型机甚至主机的性能, + 而随着这些计算机的联网和在更大范围内完成互联, + 安全也成为了一个日益严峻的课题。</para> + + <para>最好能够通过像 + <quote>洋葱</quote> 那样的分层方式来实现安全。 简而言之, + 方便的话, 应该建立尽可能多的安全层次, + 并小心地监视针对系统的各类入侵。 当然, 不应过分地构建安全机制, + 因为这样做可能会干扰甚至阻碍入侵检测, + 而后者正是安全机制中最为重要的一环。 例如, + 在所有操作系统的可执行文件上都设置 <literal>schg</literal> 标志 + (参见 &man.chflags.1;) 往往收效甚微, 因为这样做, + 尽管短时间内能够保护这些文件, + 但也阻止了闯入者进行那些易于检测的修改, + 这意味着您设置的安全机制可能根本就无法监测到攻击者。</para> + + <para>系统的安全也应能够应付各种形式的攻击, 这也包括那些使系统崩溃, + 或阻止其正常运转, 但并不试图窃取 + <username>root</username> 帐号 (<quote>破译 root</quote>) + 的攻击形式。 安全问题大体可分为以下几类:</para> <orderedlist> <listitem> @@ -211,7 +230,7 @@ 后门能给入侵者提供一个简单的方法来重新获取访问系统的 <username>root</username> 权限, 但它也会给聪明的系统管理员一个检测入侵的简便方法。 让入侵者无法安装后门事实上对您的系统安全是有害的, - 因为这样这样并不会修复那些侵入系统的入侵者所发现的新漏洞。</para> + 因为这样并不会修复那些侵入系统的入侵者所发现的新漏洞。</para> <para>安全的管理方法应当使用像 <quote>洋葱皮</quote> 一样多层次的方法来实现, @@ -251,10 +270,10 @@ </sect1> <sect1 id="securing-freebsd"> - <title>确保FreeBSD的安全</title> + <title>确保 &os; 的安全</title> <indexterm> <primary>security</primary> - <secondary>确保FreeBSD的安全</secondary> + <secondary>确保 &os; 的安全</secondary> </indexterm> <note> @@ -266,9 +285,9 @@ 因为它既可以表示命令,又可以表示协议。</para> </note> - <para>下面几节中的内容将包括 <link - linkend="security-intro">前一节</link> 中提到的那些加强 FreeBSD - 安全性的方法。</para> + <para>接下来的几节中, 将介绍在这一章中 <link + linkend="security-intro">前一节</link> 中所介绍的那些加强 + &os; 系统安全性的手段。</para> <sect2 id="securing-root-and-staff"> <title>确保 <username>root</username> 和维护人员帐户的安全 </title> @@ -281,7 +300,8 @@ <username>root</username> 帐户。 我们的第一个假定是,口令 <emphasis>总是</emphasis> 不安全的。 这并不意味着您要把口令删掉。 口令通常对访问机器的控制台来说是必须的。 也就是说, - 您不应当让它用到控制台以外的口令, 即使是使用 &man.su.1; 命令。 + 您应该避免允许在控制台以外的地方使用口令, + 甚至包括使用 &man.su.1; 命令的情形。 例如,确信您的 pty 终端在 <filename>/etc/ttys</filename> 文件中被指定为 insecure (不安全),这将使直接通过 <command>telnet</command> 或 <command>rlogin</command> 登录 @@ -327,8 +347,9 @@ need of a rewrite, but we'll have to wait and see. ceri@ --> - <para>一种间接地提高员工帐号,以及 <username>root</username> - 访问的方法,使采用其他的登录访问方式,并使用 <quote>星号</quote> + <para>一种间接地提高员工帐号, 乃至 <username>root</username> + 权限安全性的方法, 便是采用其他的登录访问方式, + 并使用 <quote>星号</quote> 替代员工加密的口令。使用 &man.vipw.8; 命令, 可以把每一个加密的口令替换成一个 <quote><literal>*</literal></quote> 符。 这将更新 <filename>/etc/master.passwd</filename> 文件,以及 @@ -358,7 +379,7 @@ 而这将使得入侵者通过监听网络通讯, 从某些不相关的、 不太安全的机器上窃取口令成为不可能。</para> - <para>另一钟间接的安全机制则是, + <para>另一种间接的安全机制则是, 从严格受限的机器向限制更宽松的机器上登录。 例如, 如果您的服务器运行了所有的服务,那么,工作站应该什么都不运行。 为了让工作站尽可能地安全,应该避免运行任何没有必要的服务, @@ -370,7 +391,7 @@ <indexterm><primary>KerberosIV</primary></indexterm> <para>使用类似 Kerberos 这样的工具,也为我们提供了使用一个工具来禁用某个用户, - 或修改他们口令并在所有机器上立即生效的方法。如果员工的帐号被窃取, + 或修改他们的口令, 并在所有机器上立即生效的方法。 如果员工的帐号被窃取, 能够在所有的其他机器上生效的口令变更将很有意义。如果口令分散地保存在多个机器上, 一次修改 N 台机器上的口令很可能是一件痛苦的事情。 此外, Kerberos 还能够提供更多的限制,除了 Kerberos 令牌有很好的过期机制之外, @@ -405,27 +426,31 @@ <primary><application>rlogind</application></primary> </indexterm> - <para>谨慎的管理员只运行它们需要的服务,不多,不少。 - 要当心第三方的服务程序很可能有更多的问题。例如,运行旧版的 - <application>imapd</application> 或者 + <para>谨慎的管理员只运行他们需要的服务, 不多, 不少。 + 要当心第三方的服务程序很可能有更多的问题。 例如, 运行旧版的 + <application>imapd</application> 或 <application>popper</application> 无异于将 <username>root</username> 令牌拱手送给全世界的攻击者。 - 永远不要运行那些您没有仔细检查过的服务程序,许多服务程序并不需要以 - <username>root</username> 身份运行。例如,<application>ntalk</application>, - <application>comsat</application>,以及 - <application>finger</application> 服务程序都能够以一种称作 - <firstterm>沙盒</firstterm> 的特殊用户身份运行。除非您解决了大量的麻烦, - 否则沙盒远不是一个完美的策略,但洋葱规则仍然成立, - 如果某个人设法攻破了在沙盒中运行的程序,那么他们还必须冲出沙盒才能够做的更多。 - 攻击者需要冲破的层次越多,他成功的机会就越小。root漏洞曾经在几乎所有的以 - <username>root</username> 身份运行的程序中存在,包括基本的系统服务。 - 另外,如果您只通过 - <application>sshd</application> 登录,而不打算使用 + 永远不要运行那些您没有仔细检查过的服务程序, 另外也要知道, + 许多服务程序并不需要以 <username>root</username> 的身份运行。 + 例如, <application>ntalk</application>、 + <application>comsat</application>, 以及 + <application>finger</application> 这些服务, + 都能够以一种被称作 <firstterm>沙盒</firstterm> 的特殊用户的身份运行。 + 除非您已经解决掉了许多麻烦的问题, 否则沙盒就不是完美的, + 但洋葱式安全规则仍然成立: 如果有人设法攻破了在沙盒中运行的程序, + 那么在做更多坏事之前, 他们还必须想办法攻破沙盒本身的限制。 + 攻击者需要攻破的层次越多, 他们成功的可能性就越小。 + 过去, 破解 root 的漏洞几乎在所有以 <username>root</username> + 身份运行的服务上都发现过, 包括那些基本的系统服务。 + 如果您的机器只打算向外界提供 + <application>sshd</application> 登录, 而用户不会使用 <application>telnetd</application> 或 - <application>rshd</application> 或 - <application>rlogind</application>,那么,毫不犹豫地关闭这些服务!</para> - - <para>FreeBSD 现在默认在沙盒中运行 + <application>rshd</application> 甚至 + <application>rlogind</application> 登录, + 就应该毫不犹豫地关闭它们!</para> + + <para>&os; 现在默认在沙盒中运行 <application>ntalkd</application>, <application>comsat</application>, 以及 <application>finger</application>。此外, &man.named.8; 也可以这样运行。 @@ -455,7 +480,8 @@ <username>root</username> 漏洞。1998年,<literal>Xlib</literal> 中发现了一处 <username>root</username> 漏洞,这使得 <application>xterm</application> (通常是做了suid的) 变得可以入侵。 - 安全通常比时候沮丧更好,因此,谨慎的管理员通常会限制 suid 可执行文件, + 做的安全些, 总比出现问题再后悔要强。 + 因此,谨慎的管理员通常会限制 suid 可执行文件, 并保证只有员工帐号能够执行它们,或只开放给特定的用户组,甚至彻底干掉 (<command>chmod 000</command>) 任何 suid 可执行文件, 以至于没有人能够执行它们。没有显示设备的服务器通常不会需要 @@ -486,8 +512,9 @@ <para>尽可能使用 <literal>*</literal> 替换掉口令是保证口令文件安全唯一的解决方法, 如果能够用 ssh 或 Kerberos 的话。即使只有 - <username>root</username> 用户能够读取加密过的口令文件 (<filename>/etc/spwd.db</filename>) - 入侵者仍然可能设法读到它,即使他暂时还无法写入这个文件。</para> + <username>root</username> 用户能够读取加密过的口令文件 (<filename>/etc/spwd.db</filename>), + 入侵者仍然可能设法读到它的内容, + 即使他暂时还无法写入这个文件。</para> <para>您的安全脚本应该经常检查并报告口令文件的异动 (参见后面的 <link linkend="security-integrity">检查文件完整性</link> 一节)。</para> @@ -499,7 +526,7 @@ <para>如果攻击者已经拿到了 <username>root</username> 那么他就有能力作任何事情, 当然, 有一些事情是他们比较喜欢干的。 例如, 绝大多数现代的内核都包括一个内建的听包设备。 - 在 FreeBSD 中,这个设备被称作 + 在 &os; 中,这个设备被称作 <devicename>bpf</devicename> 。攻击者通常会尝试在攻克的系统上运行它。 如果您不需要 <devicename>bpf</devicename> 设备提供的功能,那么,就不要把它编入内核。</para> @@ -536,7 +563,7 @@ 因为尽管它能够保护那些文件,但同样关掉了一个很好的监测机制。 层次化安全的最后一层可能是最重要的 — 检测。 安全的其他部分可能相对来讲意义并不那么大 (或者,更糟糕的事情是, - 那些措施会给您安全的假象), 加入您无法检测潜在的入侵事件。 + 那些措施会给您安全的假象), 假如您无法检测潜在的入侵事件。 层次化安全最重要的功能是减缓入侵者, 而不是彻底不让他们入侵,这能够让检测起到作用,并更好地捕捉入侵行为。</para> @@ -659,8 +686,8 @@ 其他情况下,则至少应该加上 <option>-a</option>。</para> <para>对于基于连接的服务,例如 - <application>tcpwrapper</application> 的 reverse-identd, 都应该格外的小心, - 因为它们都可能直接遭受攻击。 一般情况下, 基于安全考虑, 不应使用 <application>tcpwrappers</application> + <application>TCP Wrapper</application> 的 reverse-identd, 都应该格外的小心, + 因为它们都可能直接遭受攻击。 一般情况下, 基于安全考虑, 不应使用 <application>TCP Wrapper</application> 所提供的 reverse-ident 这样的功能。</para> <para>此外, 将内部服务保护起来, 阻止来自其他主机的访问也十分重要, @@ -678,10 +705,10 @@ — 采用比较宽松的策略, 那么您将很有可能忘记 <quote>关掉</quote> 一两个服务, 或者在增加了一些服务之后忘记更新防火墙策略。 - 尽管如此, 仍然可以考虑允许段口号较高的那一部分端口进入数据, + 尽管如此, 仍然可以考虑允许让数据进入编号较高的那一部分端口, 这将保证那些需要这样特性的服务能够正常工作, 而又不影响低端口服务的安全性。 - 此外, 还应注意到 FreeBSD 允许您来控制动态绑定的端口的范围, + 此外, 还应注意到 &os; 允许您来控制动态绑定的端口的范围, 即一系列 <varname>net.inet.ip.portrange</varname> 变量,通过 <command>sysctl</command> 来完成设置。 (<command>sysctl -a | fgrep portrange</command>)。 这使得您完成较复杂的防火墙策略变得易如反掌。 @@ -703,15 +730,15 @@ 通过建立可以生成 ICMP 出错响应的包, 攻击者能够攻击服务器的网络下行资源, 并导致其上行资源耗尽。 这种类型的攻击也可以通过耗尽 mbuf 来使得使得被攻击的服务器崩溃,特别是当这些服务器无法足够快地完成 - ICPM 响应的时候。 可以通过为 FreeBSD 内核配置称为 - <option>ICMP_BANDLIM</option> 的编译时选项来使这类攻击变得不那么有效。 + ICPM 响应的时候。 可以通过为 &os; 内核配置称为 + <option>ICMP_BANDLIM</option> 的编译选项来使这类攻击变得不那么有效。 最后一类主要的 springboard 是针对某些 <application>inetd</application> 的内部服务, 例如 udp echo 服务进行的。 攻击者简单地伪造一个来自服务器 A 的 echo 口的 UDP 包, 然后将这个包发到 B 的 echo 口。 于是, 两台服务器将不停地将包弹给对方。 攻击者能够将两台服务器的这种服务都耗竭, - 并且通过这种方式, 之需要很少的包就可以让 LAN 超载。 + 并且通过这种方式, 只需要很少的包就可以让 LAN 超载。 类似的问题对 <application>chargen</application> 口也是存在的。 好的系统管理员应该关闭这些 inetd 的测试服务。</para> @@ -725,7 +752,7 @@ 1600 秒才会过期。 如果内核发现路由表变得太大, 它会动态地降低 <varname>rtexpire</varname> 但以 <varname>rtminexpire</varname> 为限。 这引发了两个问题:</para> - + <orderedlist> <listitem> <para>在访问量不大的服务器上, 内核对于突然袭击的反应不够快。</para> @@ -799,38 +826,38 @@ <indexterm><primary>DES</primary></indexterm> <indexterm><primary>MD5</primary></indexterm> - <para>&unix; 系统上的每个用户都有一个与其帐户关联的口令。很显然, - 密码只需要被这个用户和操作系统知道。为了保证口令的私密性, - 使用了一种容易加密,却很难解密的被称作 <quote>单向散列</quote> - 的方法来处理口令。换言之,我们刚刚说的那句话并不十分确切: - 操作系统本身并不 <emphasis>真的</emphasis> 知道您的口令。 - 它只知道口令 <emphasis>经过加密的形式</emphasis>。 - 获取口令对应 + <para>&unix; 系统上的每个用户都有一个与其帐户关联的口令。 + 很显然, 密码只需要被这个用户和操作系统知道。 + 为了保证口令的私密性, 采用了一种称为 <quote>单向散列</quote> + 的方法来处理口令, 简单地说, 很容易从口令推算出散列值, + 反之却很难。 其实, 刚才那句话可能并不十分确切: + 因为操作系统本身并不 <emphasis>真的</emphasis> 知道您的口令。 + 它只知道口令 <emphasis>经过加密的形式</emphasis>。 获取口令对应 <quote>明文</quote> 的唯一办法是采用暴力在口令可能的区间内穷举。</para> <para>不幸的是,当 &unix; 刚刚出现时,安全地加密口令的唯一方法基于DES, 数据加密标准 ( the Data Encryption Standard )。 于是这给那些非美国居民带来了问题, 因为 DES 的源代码在当时不能被出口到美国以外的地方, - FreeBSD 必须找到符合美国法律,但又要与其他那些使用 DES + &os; 必须找到符合美国法律,但又要与其他那些使用 DES 的 &unix; 版本兼容的办法。</para> <para>解决方案是把加密函数库分割为两个, 于是美国的用户可以安装并使用 DES 函数库, 而国际用户则使用另外一套库提供的一种可以出口的加密算法。 - 这就是 FreeBSD 为什么使用 MD5 作为它的默认加密算法的原因。 + 这就是 &os; 为什么使用 MD5 作为它的默认加密算法的原因。 MD5 据信要比 DES 更安全,因此,安装 DES 更多地是出于兼容目的。</para> <sect2> <title>识别您采用的加密算法</title> - <para>在 FreeBSD 4.4 之前,<filename>libcrypt.a</filename> 曾经是 - 一个指向相应加密算法的符号连接。FreeBSD 4.4 开始,把 + <para>在 &os; 4.4 之前,<filename>libcrypt.a</filename> 曾经是 + 一个指向相应加密算法的符号连接。&os; 4.4 开始,把 <filename>libcrypt.a</filename> 变成了一个可以配置的密码验证散列库。 - 现在这个库支持 DES,MD5和Blowfish散列函数。默认情况下,FreeBSD + 现在这个库支持 DES,MD5和Blowfish散列函数。默认情况下, &os; 使用 MD5 来加密口令。</para> - <para>可以很容易地识别 FreeBSD 使用哪种加密方法。 + <para>可以很容易地识别 &os; 使用哪种加密方法。 检查 <filename>/etc/master.passwd</filename> 文件中的加密密码是一种方法。 用 MD5 散列加密的密码通常要比用 DES 散列得到的长一些, 并且以 @@ -841,7 +868,7 @@ 64 个可显示字符来表示, 因此相对比较短的、没有以美元符号开头的字符串很可能是一个 DES 口令。</para> - <para>新口令锁使用的密码格式是由 <filename>/etc/login.conf</filename> + <para>新口令所使用的密码格式是由 <filename>/etc/login.conf</filename> 中的 <literal>passwd_format</literal> 来控制的, 可供选择的算法包括 <literal>des</literal>, <literal>md5</literal> 和 <literal>blf</literal>。 请参考 &man.login.conf.5; 联机帮助以获得更进一步的详情。</para> @@ -857,31 +884,40 @@ <secondary>一次性口令</secondary> </indexterm> + <para>&unix; 系统上的每个用户都有一个与其帐户关联的口令。很显然, + 为了保证口令的私密性, + 使用了一种容易加密,却很难解密的被称作 <quote>单向散列</quote> + 的方法来处理口令。换言之,我们刚刚说的那句话并不十分确切: + 操作系统本身并不 <emphasis>真的</emphasis> 知道您的口令。 + 它只知道口令 <emphasis>经过加密的形式</emphasis>。 + 获取口令对应 + <quote>明文</quote> 的唯一办法是采用暴力在口令可能的区间内穷举。</para> + <para>S/Key 是基于单向 hash 功能的一次性密码管理方式。 为了考虑兼容性而使用了 MD4 散列, 而其他系统则使用了 MD5 和 DES-MAC。 S/Key 从 1.1.5 版之后就一直是 - FreeBSD 基本系统的一部分, 包含这一特性的操作系统也日益增多。 + &os; 基本系统的一部分, 包含这一特性的操作系统也日益增多。 S/Key 是 Bell Communications Research, Inc. 的注册商标。</para> - <para>从 FreeBSD 的 5.0 版开始, S/Key 被功能相同的 + <para>从 &os; 的 5.0 版开始, S/Key 被功能相同的 OPIE (One-time Passwords In Everything) 取代了。 OPIE 默认使用 MD5 散列。</para> <para>下面将介绍三种不同的口令。 第一种是您常用的 &unix; 风格或 Kerberos 口令; 我们在后面的章节中将称其为 - <quote>&unix; 口令</quote>。 第二种是使用 S/Key <command>key</command> - 程序或 OPIE &man.opiekey.1; 程序生成, 并为 <command>keyinit</command> + <quote>&unix; 口令</quote>。 第二种是使用 S/Key 的 <command>key</command> + 程序或 OPIE 的 &man.opiekey.1; 程序生成, 并为 <command>keyinit</command> 或 &man.opiepasswd.1; 以及登录提示所接受的一次性口令,我们称其为 <quote>一次性口令</quote>。 最后一类口令是您输入给 <command>key</command>/<command>opiekey</command> 程序 (有些时候是 <command>keyinit</command>/<command>opiepasswd</command> 程序) 用以产生一次性口令的秘密口令,我们称其为 <quote>秘密口令</quote> - 或简称为 <quote>秘密口令</quote>。</para> + 或通俗地简称为 <quote>口令</quote>。</para> <para>秘密口令和您的 &unix; 口令毫无关系, 尽管可以设置为相同的, 但不推荐这么做。 S/Key 和 OPIE 秘密口令并不像旧式的 - &unix; 口令那样只能限于8位以内<footnote><para>在 &os; 中标准的登录口令最长可达 - 128 个字符那么长。</para></footnote>。 + &unix; 口令那样只能限于8位以内<footnote><para>在 &os; 中标准的登录口令最长不能超过 + 128 个字符。</para></footnote>。 您想要用多长的口令都可以。 有六、七个词的短句是很常见的选择。 在绝大多数时候, S/Key 或 OPIE 系统和 &unix; 口令系统完全相互独立地工作。</para> @@ -902,7 +938,7 @@ <para>接下来将讨论和每个系统有关的三个程序。 <command>key</command> 和 <command>opiekey</command> 程序能够接收带迭代计数, 种子和秘密口令, - 并生成一个一次性口令, 或一张包含所有有关口令的表格。 + 并生成一个一次性口令, 或一张包含连续的一组一次性口令的表格。 <command>keyinit</command> 和 <command>opiepasswd</command> 程序分别用于初始化 S/Key 和 OPIE, 并修改口令、 迭代次数、种子和一次性口令。 <command>keyinfo</command> @@ -1032,7 +1068,7 @@ GAME GAG WELT OUT DOWN CHAT </sect2> <sect2> - <title>产生一个一次性密码</title> + <title>生成一个一次性密码</title> <para>一旦初始化过 S/Key 或 OPIE, 当您登录时将看到类似这样的提示:</para> @@ -1061,8 +1097,8 @@ otp-md5 498 gr4269 ext Password: </screen> <para>另外, S/Key 和 OPIE 提示有一个很有用的特性 - (这里没有表现出来): 如果您在口令提示的地方按下 <keycap>Return</keycap> - 则将开启提示返显, 您可以藉此看到自己所键入的内容。 + (这里没有表现出来): 如果您在口令提示处按下 <keycap>Return</keycap>(回车) + 系统将回显刚键入的口令, 您可以藉此看到自己所键入的内容。 如果试图手工键入一个一次性密码, 这会非常有用。</para> <indexterm><primary>MS-DOS</primary></indexterm> @@ -1106,7 +1142,7 @@ Last login: Tue Mar 21 11:56:41 from 10.0.0.2 ... </screen> <title>产生多个一次性口令</title> <para>有时,会需要到不能访问可信的机器或安全连接的地方。 - 这中情形下, 可以使用 <command>key</command> 和 + 这种情形下, 可以使用 <command>key</command> 和 <command>opiekey</command> 命令来一次生成许多一次性口令。 例如:</para> <screen>&prompt.user; <userinput>key -n 5 30 zz99999</userinput> @@ -1132,10 +1168,10 @@ Enter secret pass phrase: <userinput><secret password></userinput> <para><option>-n 5</option> 按顺序请求 5 个口令, <option>30</option> 则指定了最后一个迭代轮数应该是多少。 - 注意这些将按按与使用相反的顺序显示。 + 注意这些口令将按与使用顺序相反的顺序来显示。 如果您比较偏执, 可以手工写下这些结果; 一般来说把它粘贴到 <command>lpr</command> 就可以了。 - 注意,每一行都显示迭代轮数机器对应的一次性的密码; + 注意,每一行都显示迭代轮数及其对应的一次性的密码; 一些人建议用完一个就划掉一个。</para> </sect2> @@ -1149,7 +1185,7 @@ Enter secret pass phrase: <userinput><secret password></userinput> 并给出了更详细的使用这一配置文件时在安全方面需要注意的事项。</para> <para>如果没有 <filename>/etc/skey.access</filename> 这个文件 - (在 FreeBSD 4.X 系统上这是默认的), 那么所有的用户都可以使用 + (在 &os; 4.X 系统上这是默认的), 那么所有的用户都可以使用 &unix; 口令。 然而如果它存在, 所有的用户将被要求使用 S/Key, 除非明确地在 @@ -1163,32 +1199,33 @@ Enter secret pass phrase: <userinput><secret password></userinput> permit user fnord permit port ttyd0</programlisting> - <para>第一行 (<literal>permit internet</literal>) 允许来自这些 IP - 的用户 (这类 IP 很容易伪造) - 使用 &unix; 口令。 这不应被认为是一种安全的机制, - 因为使用不安全的网络的用户需要使用 S/Key 验证。</para> + <para>第一行 (<literal>permit internet</literal>) 允许来自 IP + 源地址 (需要注意这是可能被伪造的) 与指定的掩码值进行逻辑与之后, + 与给定值匹配的用户使用 &unix; 口令。 这不应被认为是一种安全机制, + 它只是为那些使用不安全网络的获得许可的用户提供了用 S/Key + 进行身份验证的手段。</para> <para>第二行 (<literal>permit user</literal>) 允许指定的用户, 在本例中是 <username>fnord</username>, 在任何时候使用 &unix; 口令。 一般说来, 只应为无法使用 - <command>key</command> 程序, 例如使用哑终端的那些人, - 或无法学会如何使用它的人来使用。</para> + <command>key</command> 程序, 例如那些使用哑终端, + 或无法学会如何使用它的用户启用这样的功能。</para> <para>第三行 (<literal>permit port</literal>) 允许通过指定终端线的用户使用 &unix; 口令; 这可以被用于拨号用户。</para> <para>OPIE 可以像 S/Key 一样对 &unix; 口令的使用进行基于 IP 的登录限制。 对应的文件是 <filename>/etc/opieaccess</filename>, 在 - FreeBSD 5.0 以及更新一些的系统中它是缺省存在的。 + 在 &os; 5.0 和更高版本的系统中, 默认情况下它就已经存在了。 请参阅 &man.opieaccess.5; 以了解关于这个文件进一步的情况, 以及安全方面需要进行的一些考虑。</para> - - <para>这是一个示范的 <filename>opieaccess</filename> 文件:</para> + + <para>下面是一个示范的 <filename>opieaccess</filename> 文件:</para> <programlisting>permit 192.168.0.0 255.255.0.0</programlisting> <para>这行允许指定 IP 地址的用户 (再次强调这种地址容易被伪造) - 在任何时有使用 &unix; 口令登录。</para> + 在任何时候使用 &unix; 口令登录。</para> <para>如果 <filename>opieaccess</filename> 中没有匹配的规则, 则将默认拒绝任何非 OPIE 登录。</para> @@ -1211,7 +1248,7 @@ permit port ttyd0</programlisting> <title>TCP Wrappers</title> - <para>任何熟悉 &man.inetd.8; 都应该听说过 + <para>每一个熟悉 &man.inetd.8; 都应该听说过 <acronym>TCP</acronym> Wrappers, 但几乎没有人对它在网络环境中的作用有全面的理解。 几乎每个人都会安装防火墙来处理网络连接, @@ -1228,17 +1265,23 @@ permit port ttyd0</programlisting> 使得服务程序只接受内部连接, 等等。 尽管防火墙也能够完成其中的某些功能, 但这不仅增加了一层额外的保护, - 也提供了防火墙所不能提供的功能。</para> + 也提供了防火墙无法提供的功能。</para> - <para>由 <acronym>TCP</acronym> Wrappers - 所增加的功能不应被看作好的防火墙的替代品; - 它应该与防火墙以及其他安全设施一道, - 作为系统的一层额外的安全防护来看待。</para> + <para>然而, 由 <acronym>TCP</acronym> Wrappers + 提供的一些额外的安全功能, 不应被视为好的防火墙的替代品。 + <acronym>TCP</acronym> Wrappers 应结合防火墙或其他安全加强设施一并使用, + 为系统多提供一层安全防护。</para> <para>由于这些配置是对于 - <command>inetd</command> 配置的扩展, 因此读者应首先阅读 - <link linkend="network-inetd">配置 inetd</link> - 一节。</para> + <command>inetd</command> 的扩展, 因此, + 读者应首先阅读 <link linkend="network-inetd">配置 inetd</link> + 这节。</para> + + <note> + <para>尽管由 &man.inetd.8; 运行的程序并不是真正的 + <quote>服务程序</quote>, 但传统上也把它们称为服务程序。 + 下面仍将使用这一术语。</para> + </note> <sect2> <title>初始配置</title> @@ -1268,7 +1311,7 @@ permit port ttyd0</programlisting> <literal>服务 : 地址 : 动作</literal>。 这里 <literal>服务</literal> 是从 <command>inetd</command> 启动的服务程序的名字。 而 - <literal>地址</literal> 可以使任何有效的主机名、 一个 + <literal>地址</literal> 可以是任何有效的主机名、 一个 <acronym>IP</acronym> 或由方括号 ([ ]) 括起来的 IPv6 地址。 动作字段可以使 allow 或 deny, 分别用于允许和禁止相应的访问。 @@ -1348,7 +1391,7 @@ ALL : .example.com \ /var/log/connections.log) \ : deny</programlisting> - <para>浙江拒绝来自 + <para>这将拒绝来自 <hostid role="fqdn">*.example.com</hostid> 域的所有连接; 同时还将记录主机名, <acronym>IP</acronym> 地址, 以及对方所尝试连接的服务名字到 @@ -1418,9 +1461,10 @@ sendmail : PARANOID : deny</programlisting> <title><application>KerberosIV</application></title> <para>Kerberos 是一个网络附加系统/协议, 它使得用户能够通过一个安全服务器的服务来验证身份。 - 象远程登录,远程拷贝,系统间的相互文件拷贝和其他完成高风险任务的服务将被变得相当安全和可控制。</para> + 象远程登录, 远程复制, + 系统间的相互文件复制和其他完成高风险任务的服务将被变得相当安全和可控制。</para> - <para>下面将具体介绍如何配置随 FreeBSD 发行的 + <para>下面将具体介绍如何配置随 &os; 发行的 Kerberos。 不过, 您还是应该阅读相应的联机手册以获得完整的说明。</para> <sect2> @@ -1432,7 +1476,7 @@ sendmail : PARANOID : deny</programlisting> <secondary>安装</secondary> </indexterm> <para>Kerberos 是 &os; 的一项可选组件。 安装该软件最简单的办法就是 - 在使用 <application>sysinstall</application> 安装 FreeBSD 时选择 + 在使用 <application>sysinstall</application> 安装 &os; 时选择 <literal>krb4</literal> 或 <literal>krb5</literal>。 这样将会安装 <quote>eBones</quote> (KerberosIV) 或 <quote>Heimdal</quote> (Kerberos5) @@ -1440,7 +1484,7 @@ sendmail : PARANOID : deny</programlisting> 因此这些国家之外的人使用, 而不必受美国的加密代码出口管制的限制。</para> <para>此外, 您可以从 - <filename role="package">security/krb5</filename> 获取 Kerberos 的 MIT 实现。</para> + <filename role="package">security/krb5</filename> 得到 Kerberos 的 MIT 实现。</para> </sect2> <sect2> @@ -1477,7 +1521,7 @@ LCS.MIT.EDU kerberos.lcs.mit.edu TELECOM.MIT.EDU bitsy.mit.edu ARC.NASA.GOV trident.arc.nasa.gov</screen> - <para>在这个例子中, 除此之外的其它领域并不时必须的。 + <para>在这个例子中, 除此之外的其它领域并不是必需的。 把他们在这里一并展示是为了演示如何让机器了解多个领域的存在。 简单起见, 在实际的配置中可以省略它们。</para> @@ -1501,7 +1545,7 @@ grunt.example.com EXAMPLE.COM .MIT.EDU ATHENA.MIT.EDU .mit.edu ATHENA.MIT.EDU</screen> - <para>再次强调, 其它领域并不时必需的。 在这里只是要展示如何使用多个领域。 + <para>再次强调, 其它领域并不是必需的。 在这里只是要展示如何使用多个领域。 可以删掉它们以简化配置。</para> <para>第一行将 <emphasis>指定的</emphasis> 系统置于所指名字的领域内。 @@ -1684,7 +1728,7 @@ Edit O.K. 如果您正确地修改了 <filename>/etc/rc.conf</filename> 则系统在启动时会自动完成这个工作。 只有在 Kerberos 服务器上才需要这么做。 Kerberos 客户程序将自动地从 - <filename>/etc/kerberosIV</filename> 目录中的文件或去所需要的信息。</para> + <filename>/etc/kerberosIV</filename> 目录中的文件获取所需要的信息。</para> <screen>&prompt.root; <userinput>kerberos &</userinput> Kerberos server starting @@ -1740,7 +1784,7 @@ Password changed.</screen> <para>Kerberos 使我们能够给予 <emphasis>每一个</emphasis> 需要使用 <username>root</username> 特权的用户使用他们自己 - <emphasis>s单独的</emphasis> &man.su.1; 口令。 + <emphasis>单独的</emphasis> &man.su.1; 口令。 现在我们追加一个被授予 &man.su.1; 到 <username>root</username> 权限的 ID。 这件事是由与 <username>root</username> 相关联的一个 principal 实例来控制的。使用 <command>kdb_edit</command> @@ -1806,7 +1850,7 @@ May 2 20:43:12 May 3 04:43:12 krbtgt.EXAMPLE.COM@EXAMPLE.COM</screen> <sect2> <title>使用其它命令</title> - <para>在前文给出的粒子中, 我们创建了一个称为 + <para>在前文给出的例子中, 我们创建了一个称为 <literal>jane</literal> 的用户, 以及一个 <literal>root</literal> 实例。 此处的用户名和它的 principal 相同, 这是 Kerberos 默认的; 一个形如 <literal><username>.</literal><username>root</username> @@ -1846,11 +1890,11 @@ Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994 FreeBSD BUILT-19950429 (GR386) #0: Sat Apr 29 17:50:09 SAT 1995</screen> - <para>Or <username>jack</username> logs into <username>jane</username>'s account on the same machine - (<username>jane</username> having - set up the <filename>.klogin</filename> file as above, and the person - in charge of Kerberos having set up principal - <emphasis>jack</emphasis> with a null instance):</para> + <para>或者, 当 <username>jack</username> 登录到 <username>jane</username> + 在同一台机器上的账号 + (<username>jane</username> 按照前面所介绍的那样配置了 + <filename>.klogin</filename> 文件, 而负责 Kerberos 的管理员, 则为 + <emphasis>jack</emphasis> 的 principal 配置了一个空的 instance):</para> <screen>&prompt.user; <userinput>kinit</userinput> &prompt.user; <userinput>rlogin grunt -l jane</userinput> @@ -1900,7 +1944,7 @@ FreeBSD BUILT-19950429 (GR386) #0: Sat Apr 29 17:50:09 SAT 1995</screen> 以及其它高危险性的操作, 由于其存在而显著地提高了安全型并且更加可控。</para> <para><application>Kerberos</application> 可以理解为一种身份验证代理系统。 - 它也被描述为一种受信第三方玮主导的身份验证系统。 + 它也被描述为一种以受信第三方为主导的身份验证系统。 <application>Kerberos</application> 只提供一种功能 — 在网络上安全地完成用户的身份验证。 它并不提供授权功能 (也就是说用户能够做什么操作) @@ -1935,7 +1979,7 @@ FreeBSD BUILT-19950429 (GR386) #0: Sat Apr 29 17:50:09 SAT 1995</screen> <para>在安装 <application>Kerberos</application> 时请使用实际的域名即使您只是想在内部网上用一用。 这可以避免 <acronym>DNS</acronym> 问题并保证了同其它 -= <application>Kerberos</application> 之间的互操作性。</para> + <application>Kerberos</application> 之间的互操作性。</para> </note> <sect2> @@ -1947,7 +1991,7 @@ FreeBSD BUILT-19950429 (GR386) #0: Sat Apr 29 17:50:09 SAT 1995</screen> <para><application>Kerberos</application> 最早由 <acronym>MIT</acronym> 作为解决网络安全问题的一个方案提出。 - <application>Kerberos</application> 协议采用了枪加密, + <application>Kerberos</application> 协议采用了强加密, 因此客户能够在不安全的网络上向服务器 (以及相反地) 验证自己的身份。</para> @@ -1974,7 +2018,7 @@ FreeBSD BUILT-19950429 (GR386) #0: Sat Apr 29 17:50:09 SAT 1995</screen> (<filename role="package">security/heimdal</filename>) 安装, 最新的 &os; 的最小安装也会包含它。</para> - <para>为使尽可能多的受众受益, 这份说明以 &os; 附带的 + <para>为使尽可能多的读者从中受益, 这份说明以 &os; 附带的 Heimdal 软件包为准。</para> </sect2> @@ -1983,7 +2027,7 @@ FreeBSD BUILT-19950429 (GR386) #0: Sat Apr 29 17:50:09 SAT 1995</screen> <title>配置 Heimdal <acronym>KDC</acronym></title> <indexterm> <primary>Kerberos5</primary> - <secondary>密钥分发中心配置</secondary> + <secondary>密钥分发中心</secondary> </indexterm> <para>密钥分发中心 (<acronym>KDC</acronym>) 是 @@ -2018,6 +2062,7 @@ kerberos_stash="YES"</programlisting> [realms] EXAMPLE.ORG = { kdc = kerberos.example.org + admin_server = kerberos.example.org } [domain_realm] .example.org = EXAMPLE.ORG</programlisting> @@ -2045,6 +2090,15 @@ _kpasswd._udp IN SRV 01 00 464 kerberos.example.org. _kerberos-adm._tcp IN SRV 01 00 749 kerberos.example.org. _kerberos IN TXT EXAMPLE.ORG.</programlisting></note> + <note> + <para>要让客户机能够找到 + <application>Kerberos</application> 服务, 您 + <emphasis>必须</emphasis> 已经配置了一个完整的 + <filename>/etc/krb5.conf</filename> 或最小配置的 + <filename>/etc/krb5.conf</filename> <emphasis>加上</emphasis> + 正确配置的 DNS 服务器。</para> + </note> + <para>接下来需要创建 <application>Kerberos</application> 数据库。 这个数据库包括了使用主密码加密的所有实体的密钥。 您并不需要记住这个密码, 它会保存在一个文件 @@ -2066,7 +2120,7 @@ _kerberos IN TXT EXAMPLE.ORG.</programlisting></note> <command>modify</command> 命令来修改这些设置。 另外, 也可以用 <literal>?</literal> 命令来了解可用的选项。</para> - <para>下面是一个典型的数据库创建过程:</para> + <para>典型的数据库创建过程如下:</para> <screen>&prompt.root; <userinput>kstash</userinput> Master key: <userinput>xxxxxxxx</userinput> @@ -2113,8 +2167,8 @@ Aug 27 15:37:58 Aug 28 01:37:58 krbtgt/EXAMPLE.ORG@EXAMPLE.ORG</screen> <para>首先我们需要一份 <application>Kerberos</application> 配置文件 <filename>/etc/krb5.conf</filename> 的副本。 只需简单地用安全的方式 - (使用类似 &man.scp.1; 的网络工具, 或通过软盘) - <acronym>KDC</acronym> 上的版本覆盖掉客户机上的对应文件就可以了。</para> + (使用类似 &man.scp.1; 的网络工具, 或通过软盘) 复制 + <acronym>KDC</acronym> 上的版本, 并覆盖掉客户机上的对应文件就可以了。</para> <para>接下来需要一个 <filename>/etc/krb5.keytab</filename> 文件。 这是提供 @@ -2159,7 +2213,7 @@ kadmin><userinput> ext host/myserver.example.org</userinput> kadmin><userinput> exit</userinput></screen> <para>注意 <command>ext</command> 命令 (这是 - <quote>extract</quote> 的简写) 默认时会把导出的密钥放到 + <quote>extract</quote> 的简写) 默认会把导出的密钥放到 <filename>/etc/krb5.keytab</filename> 中。</para> <para>如果您由于没有在 <acronym>KDC</acronym> 上运行 @@ -2255,8 +2309,11 @@ kadmin><userinput> exit</userinput></screen> <title>用户配置文件: <filename>.k5login</filename> 和 <filename>.k5users</filename></title> <indexterm> - <primary>Kerberos5</primary> - <secondary>用户配置文件</secondary> + <primary><filename>.k5login</filename></primary> + </indexterm> + + <indexterm> + <primary><filename>.k5users</filename></primary> </indexterm> <para>在某个领域中的用户往往都有自己的 @@ -2534,14 +2591,14 @@ jdoe@example.org</screen> <indexterm> <primary>Kerberos5</primary> - <secondary>外界的资源</secondary> + <secondary>外部资源</secondary> </indexterm> <itemizedlist> <listitem> <para><ulink url="http://www.faqs.org/faqs/Kerberos-faq/general/preamble.html"> - The <application>Kerberos</application> FAQJ</ulink></para> + The <application>Kerberos</application> FAQ</ulink></para> </listitem> <listitem> @@ -2569,831 +2626,6 @@ jdoe@example.org</screen> </sect2> </sect1> - <sect1 id="firewalls"> - <sect1info> - <authorgroup> - <author> - <firstname>Gary</firstname> - <surname>Palmer</surname> - <contrib>作者 </contrib> - </author> - <author> - <firstname>Alex</firstname> - <surname>Nash</surname> - </author> - </authorgroup> - </sect1info> - - <title>防火墙</title> - <indexterm><primary>防火墙</primary></indexterm> - <indexterm> - <primary>安全</primary> - <secondary>防火墙</secondary> - </indexterm> - - <para>对于接入 Internet 的人来说, 防火墙是一个越来越让人感兴趣的领域。 - 人们甚至在设法寻找一些能够在私有网络中使用并提供更好安全型的应用程序。 - 这节将介绍防火墙是什么, 如何使用它们, 以及如何利用 &os; 内核提供的机制来实现它。</para> - - <note> - <para>人们经常认为在内部网络与 - <quote>硕大无朋而臭名昭著的 Internet</quote> 之间建立一个防火墙能够解决所有的安全问题。 - 这可能会有所帮助, 但糟糕的防火墙设置可能要比没有防火墙更加危险。 - 防火墙可以为系统增加另一个安全层, 但不可能完全阻止一些入侵高手侵入系统。 - 如果觉得防火墙能够完全阻止入侵而放松了安全设置, - 那可能会让黑客侵入系统变得更加容易。</para> - </note> - - <sect2> - <title>防火墙是什么?</title> - - <para>目前常见的 Internet 防火墙主要有两种类型。 - 第一种类型正式的名字叫 - <emphasis>包过滤路由器</emphasis>, 这类防火墙通过一台接入多个网段的机器, - 以及一组规则来决定转发或阻止数据包的传输。 - 第二种类型被称为 <emphasis>代理服务器</emphasis>, - 依赖服务程序来完成包的转发, - 而内核的包转发则可能被禁用。</para> - - <para>有时,一些站点同时使用两种类型的防火墙, 这样只有某个特定的机器 - (称为 <emphasis>bastion host</emphasis>) 能够通过包过滤路由器将包发给内网。 - 代理服务器在 bastion host 上运行, 这通常比一般的验证机制更安全。</para> - - <para>FreeBSD 有一个内核数据包过滤程序 (也就是人们熟悉的 - IPFW), 本节余下的部分将集中介绍它。 - 可以在 FreeBSD 上通过安装第三方软件来建立代理服务器, - 但限于篇幅, 这里将不予介绍。</para> - - <sect3 id="firewalls-packet-filters"> - <title>包过滤路由器</title> - - <para>路由器是负责在网络之间转发数据的机器。 - 包过滤路由器通过将每一个包与一组规则表对比, 然后决定是否转发它来完成其功能。 - 多数现代的 IP 路由软件都包括了包过滤功能, 并默认转发所有的包。 - 为了启用过滤器, 需要您定义一组规则。</para> - - <para>为了确定一个包是否应该通过, 防火墙需要便利其规则集中所有于包头匹配的规则。 - 一旦发现一个匹配, 则会采取规则所指定的动作。 - 规则动作可以是丢弃包, 转发包, 甚至给发包的人发送一个 ICMP 消息。 - 只有第一个匹配是有效的, 因为规则是按顺序进行搜索的。 - 因此, 规则表也可以称作 <quote>规则链</quote>。</para> - - <para>包的匹配规则随所使用的软件的不同而不同, - 但基本上典型的包过滤防火墙都允许基于源 IP 地址、 目的 IP 地址、 - 源端口号、 目的端口号 (对于那些支持端口号的协议), 甚至协议类型 - (UDP, TCP, ICMP, etc) 的过滤。</para> - </sect3> - - <sect3 id="firewalls-proxy-servers"> - <title>代理服务器</title> - - <para>代理服务器上的那些普通的系统服务 - (<application>telnetd</application>、 - <application>ftpd</application>等等) 换成了一些特别的服务。 - 这些服务被称为 <emphasis>代理服务</emphasis>, 因为它们只允许进行一个方向的连接。 - 这使得您可以在作为防火墙的机器上运行 (举例来说) - 一个代理的 <application>telnet</application> 服务, - 而人们可以从外面 <application>telnet</application> 到防火墙上, - 并通过适当的验证之后, 就能够访问内网 - (另外, 代理服务器也可以用来让内网能够访问外网)。</para> - - <para>一般而言代理服务器较之普通的服务器更为安全, - 而且能够使用更多的验证方式, - 包括 <quote>一次性</quote> 口令系统等等, 因此即使有人拿到了您的口令, - 他们也没有办法用这个口令做什么,因为口令在第一次用过之后马上就过期了。 - 由于并没有授予用户使用代理本身的权限, - 因此在防火墙上做后门并进而进行更多的破坏会变得困难许多。</para> - - <para>代理服务器通常有更多的限制访问的方法, - 例如可以设置只有从特定主机才能够访问到服务器。 - 许多代理服务软件也允许管理员来指定哪些用户可以访问哪些机器。 - 当然, 能够使用哪些机制很大程度上取决于采用了什么代理软件。</para> - </sect3> - </sect2> - - <sect2> - <title>IPFW 能用来做什么?</title> - <indexterm><primary><command>ipfw</command></primary></indexterm> - - <para>FreeBSD 提供的 IPFW 软件, - 是一个内核级的包过滤和审计系统, - 它同时还提供了一个用户界面的控制工具, 即 - &man.ipfw.8;。 这两部分配合使用, - 您可以轻松地定义和查询内核在进行路由决策时所采用的规则。</para> - - <para>IPFW 有两个相关的部分。 - 防火墙部分实施的是包过滤。 - 另一部分是 IP 审计, - 它将记录路由器的使用, 并采用与防火墙部分类似的规则。 - 这样, 管理员就能够监视从特定机器上使用了多少路由资源, - 举例来说, 它转发了多少了多少 WWW 的访问流量。</para> - - <para>由于 IPFW 的这种设计, 您也可以把 IPFW 用在非路由的哪些机器上, - 以便对进入和送出的连接进行包过滤。 - 这是 IPFW 更为普遍的用法中的一个特例, - 而此时您仍然可以使用相同的命令和技巧。</para> - </sect2> - - <sect2> - <title>在 FreeBSD 上启用 IPFW</title> - <indexterm> - <primary><command>ipfw</command></primary> - <secondary>启用</secondary> - </indexterm> - - <para>由于 IPFW 的主要部分是在内核中运行的, - 因此会需要在内核配置文件中添加一些选项, 这取决于您需要使用哪些机制, - 随后是重新编译内核。 - 请参见 "Reconfiguring your Kernel" (<xref - linkend="kernelconfig">) - 一节来了解如何重新编译内核。</para> - - <warning> - <para>IPFW 的默认策略是 <literal>deny ip from any to - any</literal>。 因此如果您没有在启动时增加其他策略来允许一些包进入, - 则如果使用了启用过防火墙的内核, 则<emphasis>您将把自己挡在服务器外面</emphasis>。 - 我们建议您在第一次使用时在 <filename>/etc/rc.conf</filename> - 中设置 <literal>firewall_type=open</literal>, - 然后再到 <filename>/etc/rc.firewall</filename> 中慢慢微调它。 - 保险起见, 您可能会考虑在本地控制台上, 而不是通过 - <application>ssh</application> 来完成防火墙的配置。 - 另一种方法是同时启用 - <literal>IPFIREWALL</literal> 和 - <literal>IPFIREWALL_DEFAULT_TO_ACCEPT</literal> - 两个选项,这时 IPFW 的默认规则将是 <literal>allow ip from any to - any</literal> 从而避免了将自己锁在外面的尴尬局面。</para> - </warning> - - <para>目前一共有四个与 IPFW 有关的内核选项:</para> - - <variablelist> - <varlistentry> - <term><literal>options IPFIREWALL</literal></term> - - <listitem> - <para>将包过滤部分的代码编译进内核。</para> - </listitem> - </varlistentry> - - <varlistentry> - <term><literal>options IPFIREWALL_VERBOSE</literal></term> - - <listitem> - <para>启用通过 &man.syslogd.8; 记录的日志。 如果没有指定这个选项, - 即使您在过滤规则中指定记录包, 也不会真的记录它们。</para> - </listitem> - </varlistentry> - - <varlistentry> - <term><literal>options IPFIREWALL_VERBOSE_LIMIT=10</literal></term> - - <listitem> - <para>限制通过 &man.syslogd.8; 记录的每项包规则的记录条数。 - 在恶劣的环境中如果您想记录防火墙的活动, - 而又不想由于 syslog 洪水一般的记录而导致拒绝服务攻击, - 那么这个选项将会很有用。</para> - - <para>当规则链中的某一项达到这一限制数值时, - 它所对应的日志将不再记录。 - 如果需要恢复, 则需要使用 &man.ipfw.8; 工具来复位对应的计数器:</para> - - <screen>&prompt.root; <userinput>ipfw zero 4500</userinput></screen> - <para>这里 4500 是希望继续记录日志的规则在链中的编号。</para> - </listitem> - </varlistentry> - - <varlistentry> - <term><literal>options IPFIREWALL_DEFAULT_TO_ACCEPT</literal></term> - - <listitem> - <para>这将把默认的规则动作从 <quote>deny</quote> - 改为 <quote>allow</quote>。 这可以防止在没有配置防火墙之前使用启用过 - <literal>IPFIREWALL</literal> 支持的内核重启时把自己锁在外面。 - 另外, 如果您经常使用 - &man.ipfw.8; 来解决一些问题时它也非常有用。 - 尽管如此, 在使用时应该小心, - 因为这将使防火墙敞开, 并改变它的行为。</para> - </listitem> - </varlistentry> - </variablelist> - - <note><para>先前版本的 FreeBSD 包括了一个 - <literal>IPFIREWALL_ACCT</literal> 选项。 它现在已经过时了, - 因为新的防火墙代码已经包括了审计机制。</para> - </note> - </sect2> - - <sect2> - <title>配置 IPFW</title> - <indexterm> - <primary><command>ipfw</command></primary> - <secondary>配置</secondary> - </indexterm> - - <para>对于 IPFW 软件的配置是通过 - &man.ipfw.8; 来完成的。 它的命令看上去很复杂, - 但只要您理解了其结构, - 就会感到很简单。</para> - - <para>目前这个工具有四种不同的命令: - 添加/删除、 列表、 清空规则链以及让审计项归零。 - 添加删除类的命令主要用来建立控制如何接受、拒绝和记录包的规则。 - 列表类命令用于检视目前的规则集 (有时也称作规则链) 和包计数器 (审计)。 - 清空规则链则删除链中的所有规则, - 而审计项归零则可以让一些审计项重新从零开始计数。</para> - - <sect3> - <title>改变 IPFW 的规则</title> - - <para>这类命令的格式是: - <cmdsynopsis> - <command>ipfw</command> - <arg>-N</arg> - <arg choice="plain">命令</arg> - <arg>编号</arg> - <arg choice="plain">动作</arg> - <arg>log(日志)</arg> - <arg choice="plain">协议</arg> - <arg choice="plain">地址</arg> - <arg>其它选项</arg> - </cmdsynopsis></para> - - <para>当使用这种形式的命令时,有一个可用的参数:</para> - - <variablelist> - <varlistentry> - <term>-N</term> - - <listitem> - <para>在输出中解析地址和服务的名字。</para> - </listitem> - </varlistentry> - </variablelist> - - <para>给出的 <emphasis>命令</emphasis> 可以简写为能够为一分辨它们的最短形式。 - 可用的 <emphasis>命令</emphasis> - 包括:</para> - - <variablelist> - <varlistentry> - <term>add</term> - - <listitem> - <para>添加一个防火墙/审计规则到规则链中。</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>delete</term> - - <listitem> - <para>从规则链中删除一项防火墙/审计规则。</para> - </listitem> - </varlistentry> - </variablelist> - - <para>先前版本的 IPFW 使用分别的防火墙和审计规则项。 - 目前的版本则为每一个防火墙规则项进行审计。</para> - - <para>如果给出了 <emphasis>编号</emphasis> 值, - 则它将决定规则项在链中的位置。 - 如果没有指定, 则系统会自动分配一个比链的最后一项大 100 的编号 - (当然, 不包括默认规则, 即 65535 号规则, deny)。</para> - - <para>选项 <literal>log</literal> 则将使匹配规则的包输出到控制台上, - 当然前提是把 <literal>IPFIREWALL_VERBOSE</literal> 编译进内核。</para> - - <para>可用的 <emphasis>动作</emphasis> 包括:</para> - - <variablelist> - <varlistentry> - <term>reject</term> - - <listitem> - <para>丢掉包, 并回应一个(相应的) ICMP 主机或端口不可达消息给包的来源地址。</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>allow</term> - - <listitem> - <para>让包通过。 (等价的别名: - <literal>pass</literal>、 <literal>permit</literal>、 以及 - <literal>accept</literal>)</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>deny</term> - - <listitem> - <para>丢弃包。 但源地址并不会得到相关的 - ICMP 消息通知 (因此对它来说就像包没有到达目的地址一样)。</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>count</term> - - <listitem> - <para>更新包过滤启但并不执行允许/丢弃的动作。 - 此后将会继续查找规则链中的下一条规则。</para> - </listitem> - </varlistentry> - </variablelist> - - <para>每一个 <emphasis>动作</emphasis> 都可以使用其无二义性的最短前缀来代替。</para> - - <para>可以指定的 <emphasis>协议</emphasis> 是:</para> - - <variablelist> - <varlistentry> - <term>all</term> - - <listitem> - <para>匹配任何的 IP 包</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>icmp</term> - - <listitem> - <para>匹配 ICMP 包</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>tcp</term> - - <listitem> - <para>匹配 TCP 包</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>udp</term> - - <listitem> - <para>匹配 UDP 包</para> - </listitem> - </varlistentry> - </variablelist> - - <para>可以指定的 <emphasis>地址</emphasis> 是:</para> - - <cmdsynopsis> - <arg choice="plain">from</arg> - <arg choice="plain"><replaceable>地址/掩码</replaceable></arg><arg><replaceable>端口</replaceable></arg> - <arg choice="plain">to</arg> - <arg choice="plain"><replaceable>地址/掩码</replaceable></arg><arg><replaceable>端口</replaceable></arg> - <arg>via <replaceable>网络接口名</replaceable></arg> - </cmdsynopsis> - - <para>只有在使用支持 <replaceable>端口</replaceable> 的 - <emphasis>协议</emphasis> - (UDP and TCP) 时才能指定端口。</para> - - <para><option>via</option> 是一个可选的选项, 它可以通过指定来自某个本地网络接口的 IP - 地址或名字 (例如 <devicename>ed0</devicename>) 来匹配来自那个接口的包。 - 接口的单元号可以用通配符来指定。例如, 使用 <literal>ppp*</literal> - 来匹配所有的内核 PPP 接口。</para> - - <para>指定 - <replaceable>地址/掩码</replaceable> 的语法是: - - <screen><replaceable>地址</replaceable></screen> - - 或者 - - <screen><replaceable>地址</replaceable>/<replaceable>掩码位数</replaceable></screen> - - 或者 - - <screen><replaceable>地址</replaceable>:<replaceable>掩码模式</replaceable></screen> - </para> - - <para>可以在 IP 地址的位置指定一个有效的主机名。 - <option><replaceable>掩码位数</replaceable></option> 是一个十进制的数, - 用以表达地址掩码中的前多少位应当被置一。 - 例如, 指定 <hostid role="netmask">192.216.222.1/24</hostid> - 将建立一个匹配对应 C 类子网的掩码 (在本例中, - <hostid role="ipaddr">192.216.222</hostid>)。 - <option><replaceable>掩码模式</replaceable></option> 是一个将与之执行逻辑与操作的 - IP 地址。 此外, 还可以用 <literal>any</literal> 来指定 <quote>任意 IP - 地址</quote>。</para> - - <para>端口地址范围可以指定为: - - <cmdsynopsis> - <arg choice="plain"><replaceable>端口</replaceable><arg>,<replaceable>端口</replaceable><arg>,<replaceable>端口</replaceable><arg>…</arg></arg></arg></arg> - </cmdsynopsis> - - 如果想指定一组不连续的端口。 用 - - <cmdsynopsis> - <arg choice="plain"><replaceable>端口</replaceable>-<replaceable>端口</replaceable></arg> - </cmdsynopsis> - - 来指定一组连续的端口。 这两种格式可以在同一规则中使用, - 但连续端口必须先于单个端口指定。</para> - - <para>可用的 <emphasis>其它选项</emphasis> 是:</para> - - <variablelist> - <varlistentry> - <term>frag</term> - - <listitem> - <para>匹配数据报中非第一分片的所有分片。</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>in</term> - - <listitem> - <para>匹配进入的包。</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>out</term> - - <listitem> - <para>匹配送出的包。</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>ipoptions <replaceable>标志</replaceable></term> - - <listitem> - <para>匹配 IP 头包含逗号分隔的 <replaceable>标志</replaceable> - 的包。 支持的 IP 选项包括: <literal>ssrr</literal> - (严格使用源路由)、 <literal>lsrr</literal> (使用松散的源路由)、 - <literal>rr</literal> (记录包路由)、 以及 - <literal>ts</literal> (时间戳)。 如果想指定不包括某个标志, - 则在选项前加入一个 - <literal>!</literal>。</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>established</term> - - <listitem> - <para>匹配属于已经建立的 TCP 连接的包 (也就是说其 - RST 或 ACK 是置1的)。 您可以通过在规则链中较早的位置上放置 - <emphasis>established</emphasis> 规则来优化防火墙性能。</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>setup</term> - - <listitem> - <para>匹配尝试建立 TCP 连接的包 (SYN 置位而 ACK 没有)。</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>tcpflags <replaceable>标志</replaceable></term> - - <listitem> - <para>匹配 TCP 报头包括指定的 <replaceable>标志</replaceable> - 的包。 支持的标志是 - <literal>fin</literal>, <literal>syn</literal>, - <literal>rst</literal>, <literal>psh</literal>, - <literal>ack</literal>, 以及 <literal>urg</literal>。 - 如果需要匹配某一位为0, 则在对应的标志前面加 - <literal>!</literal>。</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>icmptypes <replaceable>类型</replaceable></term> - - <listitem> - <para>匹配 ICMP 类型在 - <replaceable>类型</replaceable> 表中的包。 - 这个表使用逗号分隔, 可以指定任何范围和/或单个的类型。 - 常见的 ICMP 类型包括: <literal>0</literal> - 原样回应 (ping 响应), <literal>3</literal> 目的不可达、 - <literal>5</literal> 重定向、 - <literal>8</literal> 原样回应请求 (ping 请求), 以及 - <literal>11</literal> 超时 (在 &man.traceroute.8; 这样的程序中用来追踪 - TTL超时)。</para> - </listitem> - </varlistentry> - </variablelist> - </sect3> - - <sect3> - <title>列出 IPFW 规则</title> - - <para>这类命令的格式是: - <cmdsynopsis> - <command>ipfw</command> - <arg>-a</arg> - <arg>-c</arg> - <arg>-d</arg> - <arg>-e</arg> - <arg>-t</arg> - <arg>-N</arg> - <arg>-S</arg> - <arg choice="plain">list</arg> - </cmdsynopsis></para> - - <para>七个标志的意义分别是:</para> - - <variablelist> - <varlistentry> - <term>-a</term> - - <listitem> - <para>当列条目时,显示计数器的值。这个选项是可以看到计数器值的唯一方法。</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>-c</term> - - <listitem> - <para>以紧凑的形式列出规则。</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>-d</term> - - <listitem> - <para>除了静态规则之外, 还列出动态的规则。</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>-e</term> - - <listitem> - <para>如果指定了 <option>-d</option>, 同时列出已经过期的动态规则。</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>-t</term> - - <listitem> - <para>列出每一规则的最后匹配时间。 - 显示的格式和 &man.ipfw.8; 使用的时间语法并不兼容。</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>-N</term> - - <listitem> - <para>解析地址和服务的名字。</para> - </listitem> - </varlistentry> - - <varlistentry> - <term>-S</term> - - <listitem> - <para>显示每个规则所述的规则集。 如果没有指定标志, - 则不会列出已经禁用的规则。</para> - </listitem> - </varlistentry> - </variablelist> - </sect3> - - <sect3> - <title>清空 IPFW 规则</title> - - <para>用于清空规则链的语法是: - <cmdsynopsis> - <command>ipfw</command> - <arg choice="plain">flush</arg> - </cmdsynopsis></para> - - <para>这将导致防火墙规则链中除了由内核强制的默认规则 - (编号是 65535) 的所有规则都被清除。 - 这么做时需要格外的孝心; - 默认 deny 的策略将切断网络连接, - 直到新的规则添加进来为止。</para> - </sect3> - - <sect3> - <title>将 IPFW 包计数器归零</title> - - <para>将某个或某些包计数器归零的命令语法是: - <cmdsynopsis> - <command>ipfw</command> - <arg choice="plain">zero</arg> - <arg choice="opt"><replaceable>编号</replaceable></arg> - </cmdsynopsis></para> - - <para>当不带 <replaceable>编号</replaceable> 参数使用时, - 所有的包计数器都会归零。 如果指定了 - <replaceable>编号</replaceable> 参数, 则归零操作只影响那个规则。</para> - </sect3> - </sect2> - - <sect2> - <title>与 <application>ipfw</application> 有关的命令示范</title> - - <para>下面的命令将丢弃所有来自主机 <hostid - role="fqdn">evil.crackers.org</hostid> 到主机 - <hostid role="fqdn">nice.people.org</hostid> 端口的包:</para> - - <screen>&prompt.root; <userinput>ipfw add deny tcp from evil.crackers.org to nice.people.org 23</userinput></screen> - - <para>下一个例子则将拒绝并记录来自整个 - <hostid role="domainname">crackers.org</hostid> 网络 (C类) 到 - <hostid role="fqdn">nice.people.org</hostid> 机器的流量 (任何端口)。</para> - - <screen>&prompt.root; <userinput>ipfw add deny log tcp from evil.crackers.org/24 to nice.people.org</userinput></screen> - - <para>如果不希望人们发送 X 到您的内网 - (一个 C 类子网), 则可以使用下面的规则:</para> - - <screen>&prompt.root; <userinput>ipfw add deny tcp from any to my.org/28 6000 setup</userinput></screen> - - <para>察看审计记录: - - <screen>&prompt.root; <userinput>ipfw -a list</userinput></screen> - - 或者以简写的形式 - - <screen>&prompt.root; <userinput>ipfw -a l</userinput></screen> - </para> - - <para>可以通过下面的方法察看每个规则上次匹配的时间:</para> - - <screen>&prompt.root; <userinput>ipfw -at l</userinput></screen> - </sect2> - - <sect2> - <title>建立包过滤的防火墙</title> - - <note> - <para>注意:下面的建议仅仅是:建议。 - 每个防火墙的要求是不同的, - 我们不能告诉如何建构符合特殊要求的防火墙。</para> - </note> - - <para>当一开始设置防火墙时, - 除非有一个测试平台来在可控的环境中测试防火墙主机, - 否则强烈建议使用启用了日志的命令, 并启用内核中的日志功能。 - 这将帮助您快速地确定问题所在并加以修复。 - 即使初始安装已经完成, - 仍然建议记录 `deny' 因为它能够记录攻击企图, - 并帮助您在必要时在事后调整防火墙规则。</para> - - <note> - <para>如果使用了带日志的 <command>accept</command> - 命令, 则可能产生 - <emphasis>大量的</emphasis> 日志数据。 - 通过防火墙的所有包都会被记录, 因此大的 FTP/http 传输等等, - 都会让系统变得很慢。 - 由于在数据包通过之前会要求内核做更多的工作, - 因此这些更大的延迟。 另外, <application>syslogd</application> - 将会使用更多的处理器时间来吧所有那些额外的数据记录到磁盘上, - 这也很容易把 <filename>/var/log</filename> - 所在的分区填满。</para> - </note> - - <para>一般情况下应该从 - <filename>/etc/rc.conf.local</filename> 或 - <filename>/etc/rc.conf</filename> 启动防火墙。 - 相关的联机手册会解释如何设置和列出当前的防火墙配置。 - 如果不使用当前的配置, <command>ipfw list</command> - 列表将输出当前的规则设置, 您可以把这些设置放到 - <filename>rc.conf</filename> 中。 如果不想用 - <filename>/etc/rc.conf.local</filename> 或 - <filename>/etc/rc.conf</filename> 来启用防火墙, - 则确认防火墙是在任何 IP 接口之前已经配置好就很重要了。</para> - - <para>下一个问题是防火墙实际上 <emphasis>做了</emphasis> 些什么! - 着很大程度上取决于您希望外界如何访问您的网络, - 以及允许什么样的访问被发到外网。 - 下面是一些通用的规则:</para> - - <itemizedlist> - <listitem> - <para>阻止所有低于 1024 的 TCP 端口。 很多对安全最敏感的服务都在这些端口上运行, - 例如 finger、 SMTP (mail) 以及 telnet。</para> - </listitem> - - <listitem> - <para>阻止 <emphasis>所有</emphasis> 进入的 UDP 传输。 使用 UDP - 的有用的服务很少, 而每一个有用的服务往往都同时伴随着安全威胁 - (例如 Sun 的 RPC 和 NFS 协议)。 还有其他一些缺点, 由于 UDP 是一种无连接的协议, - 阻止 UDP 传输同时也就阻止了对发出 UDP 传输的回应。 - 这可能会给人们 (在内网上工作的那些) 访问外部的 - archie (prospero) 服务器造成问题。 想要允许访问 archie, - 就需要允许来自 191 和 1525 到任何内部 UDP 端口的数据通过防火墙。 - <application>ntp</application> 是另一种可能需要允许通过防火墙的服务, - 它使用的端口号是 123。</para> - </listitem> - - <listitem> - <para>阻止来自外界到端口 6000 的访问。 这个端口主要用来访问 - X11 服务器, 着很可能是对安全的威胁 - (特别是对那些有在他们工作站上做 <command>xhost - +</command> 癖好的人)。 X11 实际上可以使用从 - 6000 开始的端口, 其上限取决于机器上运行了多少个 X - 显示。 由 RFC 1700 (Assigned Numbers) 所定义的上限是 6063。</para> - </listitem> - - <listitem> - <para>检查内部服务器使用什么服务 (例如 SQL 服务等等)。 - 同时阻止到这些端口的访问可能也是很好的习惯, - 因为它们往往不在前面所指定的 1-1024 的端口范围内。</para> - </listitem> - </itemizedlist> - - <para>另外可以到 CERT 的网站去查看一下防火墙配置的推荐步骤, - 其网址是 <ulink - url="http://www.cert.org/tech_tips/packet_filtering.html"></ulink></para> - - <para>如前面提到的, 这些只是 <emphasis>指导原则</emphasis>。 - 必须根据具体情况决定使用什么过滤规则。 - 即使按照上面提到的方法做了, 也没办法保证一定没有人能够侵入您的网络。</para> - </sect2> - - <sect2 id="ipfw-overhead"> - <title>IPFW 的开销和优化</title> - - <para>许多人希望知道 IPFW 会给系统增加多少开销。 - 答案很大程度上取决于您的规则集大小以及处理器速度。 - 对于运行在一台网上的绝大多数应用和小规则集来说, - 这种开销是 <quote>可忽略的</quote>。 - 如果您仍然像知道实际的大小来满足好奇心, - 则请继续读下去。</para> - - <para>下面的测试是在 486-66 上运行的 2.2.5-STABLE 上完成的。 - (虽然 IPFW 在之后版本的 FreeBSD 上有很多小规模的修改, - 但它们的速度仍然接近)。 IPFW 经过了修改以给出在 - <literal>ip_fw_chk</literal> 子程序上消耗的时间, - 并在每处理1000个数据包之后在控制台上打出结果。</para> - - <para>使用两个各包含 1000 条规则的规则集进行了测试。 - 第一个规则集是用来展现最差情况的, - 它重复下面的规则:</para> - - <screen>&prompt.root; <userinput>ipfw add deny tcp from any to any 55555</userinput></screen> - - <para>通过使绝大多数 IPFW 的包检查子程序被执行之后才能完成决策, - 这样做将会展现最差情况, 因为所有的包都不可能匹配这些规则 - (因为端口号)。 - 在重复 999 之有一条 - <literal>allow ip from any to any</literal>规则。</para> - - <para>第二组规则用于在规则的开始就停止判断:</para> - - <screen>&prompt.root; <userinput>ipfw add deny ip from 1.2.3.4 to 1.2.3.4</userinput></screen> - - <para>由于源 IP 地址不匹配上述规则将很快被挑过。 - 像之前一样, 第 - 1000 条规则也是 <literal>allow ip from any to - any</literal>。</para> - - <para>第一个情况下处理大约需要 - 2.703 毫秒/包, 大致相当于每条规则 2.7 毫秒。 - 这种情况下最大的包处理能力达约是每秒 - 370 个包。 假设在 10 Mbps 以太网上, - 包的大小大致是 ~1500 字节, - 则只能达到 55.5% 的带宽利用率。</para> - - <para>对于后一种情况每个包的处理大约需要 - 1.172 毫秒, 大致相当于每条规则 1.2 毫秒。 - 理论上每秒大约能够处理 - 853 个包, 能够完全占满 10 Mbps 以太网的带宽。</para> - - <para>测试中这些过多的规则数目和规则本身是无法模拟实际的情况的 - -- 它们只是用来产生这里需要的计时信息。 - 在建立规则时请牢记下面一些技巧:</para> - - <itemizedlist> - <listitem> - <para>在尽可能早的地方放一个 <literal>established</literal> - 规则来处理主要的 TCP 传输。 不要在这条规则之前写任何其它的 - <literal>allow tcp</literal> 语句。</para> - </listitem> - - <listitem> - <para>将常用的规则放在规则集尽可能早的位置, 而将不太常用的放在后面 - (当然, <emphasis>不要改变防火墙的性质</emphasis>)。 - 您可以通过 <command>ipfw -a - l</command> 统计包的计数。</para> - </listitem> - </itemizedlist> - </sect2> - </sect1> - <sect1 id="openssl"> <sect1info> <authorgroup> @@ -3423,7 +2655,7 @@ jdoe@example.org</screen> <application>OpenSSL</application> 支持的方法。</para> <note> - <para>绝大多数情况下 ports collection 会试图使用 + <para>绝大多数情况下 Ports Collection 会试图使用 <filename role="package">security/openssl</filename> 除非明确地将 <makevar>WITH_OPENSSL_BASE</makevar> make 变量设置为 <quote>yes</quote>。</para> @@ -3431,7 +2663,7 @@ jdoe@example.org</screen> <para>&os; 中附带的 <application>OpenSSL</application> 版本能够支持 安全套接字层 v2/v3 (SSLv2/SSLv3) 和 安全传输层 - v1 (TLSv1) 三种网络协议, 并可作为通用的密码学函数库用于应用程序。</para> + v1 (TLSv1) 三种网络协议, 并可作为通用的密码学函数库使用。</para> <note> <para>尽管 <application>OpenSSL</application> 支持 @@ -3442,13 +2674,16 @@ jdoe@example.org</screen> <makevar>MAKE_IDEA</makevar>。</para> </note> - <para>为应用软件创建和提供证书可能是 - <application>OpenSSL</application> 最为常用的功能。 - 证书是一种确保公司或个人身份有效性的凭据。 - 如果证书没有被权威发证机构, 即 <acronym>CA</acronym> 验证, - 则通常会收到一个警告。 权威发证机构是通过签署证书来证明个人或公司凭据有效性的公司, - 如 VeriSign。 这个过程是需要收费的, 并且也不是使用证书时必须的工作; - 不过, 这可以让那些比较偏执的用户感到轻松。</para> + <para>为应用软件提供证书是 + <application>OpenSSL</application> 最为常用的功能之一。 + 证书是一种能够确保公司或个人有效身份不被伪造的凭据。 + 如果证书没有被众多 <quote>权威发证机构</quote>, + 或 <acronym>CA</acronym> 中的某一个确认, + 则会产生一个警告。 权威发证机构通常是一家公司, + 例如 <ulink url="http://www.verisign.com">VeriSign</ulink>, + 它能够通过签署来证明个人或公司证书的有效性。 + 这个过程是需要付费的, 当然, 这不是使用证书的必要条件; + 然而, 这样做会让那些比较偏执的用户感到轻松。</para> <sect2> <title>生成证书</title> @@ -3486,22 +2721,30 @@ to be sent with your certificate request A challenge password []:<userinput><replaceable>SOME PASSWORD</replaceable></userinput> An optional company name []:<userinput><replaceable>Another Name</replaceable></userinput></screen> - <para>请注意在回答 - <quote>Common Name</quote> 时使用的是一个域名。 - 这个提示要求输入服务器的名字, 以完成验证过程; - 如果在这里填入其他内容, 则证书就没有什么意义了。 - 其他选项主要是关于证书有效期和使用的算法。 - &man.openssl.1; 联机手册中包括了更详细的信息。</para> - - <para>上述命令执行完之后应该会生成一个 <filename>cert.pem</filename> - 到当前目录中。 这个证书可以发给一个 <acronym>CA</acronym> - 进行签名。</para> - - <para>如果不需要由 <acronym>CA</acronym> 签名, 也可以使用自签名的证书。 - 首先需要生成 <acronym>CA</acronym> 密钥:</para> + <para>请注意, 在 + <quote>Common Name</quote> 提示后面我们输入的是一个域名。 + 这个提示要求输入服务器的名字, + 这个名字今后将用于完成验证过程; + 如果在这里输入域名以外的内容, 那么证书也就失去其意义了。 + 您还可以指定一些其他的选项, 比如证书的有效期, + 以及使用的加密算法等等。 这些选项的完整列表, + 可以在 &man.openssl.1; 联机手册中找到。</para> + + <para>上述命令执行完之后应该会在当前目录生成一个 <filename>cert.pem</filename> + 文件。 这就是刚刚生成的证书, 您可以把它发给任意一家 + <acronym>CA</acronym> 进行签署。</para> + + <para>如果不需要来自 <acronym>CA</acronym> 的签名, + 也可以创建自行签名的证书。 首先, + 需要生成 <acronym>RSA</acronym> 密钥:</para> + + <screen>&prompt.root; <userinput>openssl dsaparam -rand -genkey -out +<filename>myRSA.key</filename> 1024</userinput></screen> + + <para>接下来, 生成 <acronym>CA</acronym> 密钥:</para> <screen>&prompt.root; <userinput>openssl gendsa -des3 -out \ -<filename>myca.key</filename> 1024</userinput></screen> +<filename>myca.key</filename> <filename>myRSA.key</filename></userinput></screen> <para>然后用这个密钥来创建证书:</para> @@ -3509,10 +2752,13 @@ An optional company name []:<userinput><replaceable>Another Name</replaceable></ <filename>myca.key</filename> -out <filename>new.crt</filename></userinput></screen> <para>上述步骤将在当前目录中生成两个新文件: - 一个是权威发证机构的签名文件, <filename>myca.key</filename> 另一个则是证书本身, - <filename>new.crt</filename>。 这些文件应放到一个目录中, 通常推荐放在 - <filename role="directory">/etc</filename> 下, 且只能被 <username>root</username> 读取。 - 0600 这样的权限应该就足够了, 您可以用 <command>chmod</command> 来完成修改。</para> + 一个是权威发证机构的签名文件, <filename>myca.key</filename>; + 另一个是证书本身, <filename>new.crt</filename>。 + 这些文件应该放到同一个目录中, 一般而言, 推荐放到 + <filename class="directory">/etc</filename>, + 并且只允许 <username>root</username> 读取。 + 建议把权限设置为 0700, 这可以通过 <command>chmod</command> + 工具来完成。</para> </sect2> <sect2> @@ -3539,18 +2785,19 @@ define(`confSERVER_CERT',`/etc/certs/new.crt')dnl define(`confSERVER_KEY',`/etc/certs/myca.key')dnl define(`confTLS_SRV_OPTIONS', `V')dnl</programlisting> - <para>这里 <filename role="directory">/etc/certs/</filename> - 是准备用来在本地保存证书和密钥的位置。 最后需要重新生成本地的 - <filename>.cf</filename> 文件。 这个工作可以很容易地通过在 - <filename role="directory">/etc/mail</filename> 目录中执行 - <command>make</command> + <para>这里, <filename class="directory">/etc/certs/</filename> + 是准备用来在本地保存证书和密钥的位置。 最后, + 需要重新生成本地的 <filename>.cf</filename> 文件。 + 这一工作可以简单地通过在 + <filename class="directory">/etc/mail</filename> + 目录中执行 <command>make</command> <parameter>install</parameter> 来完成。 - 然后可以执行 <command>make</command> + 接下来, 可以使用 <command>make</command> <parameter>restart</parameter> 来重新启动 <application>Sendmail</application> 服务程序。</para> - <para>如果一切正常, 则 - <filename>/var/log/maillog</filename> 中不会出现错误提示, + <para>如果一切正常的话, 在 + <filename>/var/log/maillog</filename> 中就不会出现错误提示, <application>Sendmail</application> 也应该出现在进程列表中。</para> <para>做一个简单的测试, 使用 &man.telnet.1; 来连接邮件服务器:</para> @@ -3594,9 +2841,13 @@ Connection closed by foreign host.</screen> </authorgroup> </sect1info> - <title>在 IPsec 上的 VPN</title> - <para>使用 FreeBSD 网关在两个被 Internet 分开的网络之间架设 VPN。</para> + <indexterm> + <primary>IPsec</primary> + </indexterm> + <title>IPsec 上的 VPN</title> + <para>使用 FreeBSD 网关在两个被 Internet 分开的网络之间架设 VPN。</para> + <sect2> <sect2info> <authorgroup> @@ -3637,6 +2888,11 @@ Connection closed by foreign host.</screen> 的全部功能。 此外, 为了启用硬件加速的 IPsec, 必须把下面的选项加入到内核配置中:</para> + <indexterm> + <primary>内核选项</primary> + <secondary>FAST_IPSEC</secondary> + </indexterm> + <screen> options FAST_IPSEC # new IPsec (cannot define w/ IPSEC) </screen> @@ -3647,6 +2903,16 @@ options FAST_IPSEC # new IPsec (cannot define w/ IPSEC) 联机手册以了解进一步的信息。</para> </note> + + <indexterm> + <primary>IPsec</primary> + <secondary>ESP</secondary> + </indexterm> + + <indexterm> + <primary>IPsec</primary> + <secondary>AH</secondary> + </indexterm> <para>IPsec 包括了两个子协议:</para> @@ -3665,9 +2931,18 @@ options FAST_IPSEC # new IPsec (cannot define w/ IPSEC) 以便能够验证包。</para> </listitem> </itemizedlist> + + <para><acronym>ESP</acronym> 和 <acronym>AH</acronym> 可以根据环境的不同, + 分别或者一同使用。</para> + + <indexterm> + <primary>VPN</primary> + </indexterm> - <para><acronym>ESP</acronym> 和 <acronym>AH</acronym> 根据环境的不同, - 和以分别或一同使用。</para> + <indexterm> + <primary>虚拟专用网</primary> + <see>VPN</see> + </indexterm> <para>IPsec 既可以用来直接加密主机之间的网络通讯 (也就是 <emphasis>传输模式</emphasis>); 也可以用来在两个子网之间建造 @@ -3676,15 +2951,30 @@ options FAST_IPSEC # new IPsec (cannot define w/ IPSEC) 后一种更多的被称为是 <emphasis>虚拟专用网 (VPN)</emphasis>。 &man.ipsec.4; 联机手册提供了关于 FreeBSD 中 IPsec 子系统的详细信息。</para> - <para>为了把 IPsec 支持放进内核, - 需要在配置文件中加入下面的选项:</para> + <para>要把 IPsec 支持放进内核, + 应该在配置文件中加入下面的选项:</para> + + <indexterm> + <primary>内核选项</primary> + <secondary>IPSEC</secondary> + </indexterm> + + <indexterm> + <primary>内核选项</primary> + <secondary>IPSEC_ESP</secondary> + </indexterm> <screen> options IPSEC #IP security options IPSEC_ESP #IP security (crypto; define w/ IPSEC) </screen> - <para>如果需要 IPsec 的调试支持, 还需要增加:</para> + <indexterm> + <primary>内核选项</primary> + <secondary>IPSEC_DEBUG</secondary> + </indexterm> + + <para>如果需要 IPsec 的调试支持, 还应增加:</para> <screen> options IPSEC_DEBUG #debug for IP security @@ -3693,16 +2983,21 @@ options IPSEC_DEBUG #debug for IP security <sect2> <title>问题</title> - + <para>由于对如何建立 VPN 并不存在标准, 因此 VPN 可以采用许多种不同的技术来实现, 每种技术都有其长处和弱点。 这篇文章讲展现一个具体的应用情景, 并为它设计了适合的 VPN。</para> </sect2> + + <sect2> + <title>情景: 两个网络都接入了 Internet, 希望像一个网络那样工作</title> + + <indexterm> + <primary>VPN</primary> + <secondary>创建</secondary> + </indexterm> - <sect2> - <title>情况: 两个网络都接入了 Internet, 希望像一个网络那样工作</title> - - <para>前提如下:</para> + <para>现有条件如下:</para> <itemizedlist> <listitem> @@ -3719,7 +3014,7 @@ options IPSEC_DEBUG #debug for IP security </listitem> <listitem> <para>网络的内部地址可以是公网或私有的 IP 地址, - 这并不是问题。 如果需要,您可以在网关上运行 NAT。</para> + 这并不是问题。 如果需要, 还可以在网关上运行 NAT。</para> </listitem> <listitem> <para>两个网络上的 IP 地址 @@ -3728,13 +3023,13 @@ options IPSEC_DEBUG #debug for IP security 但那毫无疑问将是管理的噩梦。</para> </listitem> </itemizedlist> - - <para>如果您发现您正打算连接两个内网使用同样私有 IP 地址范围的网络 + + <para>如果您发现您正打算连接两个内网使用同一私有 IP 地址范围的网络 (例如它们都使用 <hostid - role="ipaddr">192.168.1.x</hostid>), 则建议改掉其中一个网络的地址。</para> - + role="ipaddr">192.168.1.x</hostid>), 则其中的一个必须修改网络地址。</para> + <para>网络的拓扑结构如下:</para> - + <mediaobject> <imageobject> <imagedata fileref="security/ipsec-network" align="center"> @@ -3765,7 +3060,7 @@ options IPSEC_DEBUG #debug for IP security [ UNIX ]</literallayout> </textobject> </mediaobject> - + <para>请注意两个公网 IP 地址。 在这篇文章的其余部分我将用这些字母来表示它们。 在文章中看到这些字母的时候, 请把它们换成自己的公网 IP 地址。 另外, 在内部, 两个网关都是使用的 .1 的 IP地址, @@ -3773,14 +3068,14 @@ options IPSEC_DEBUG #debug for IP security role="ipaddr">192.168.1.x</hostid> 和 <hostid role="ipaddr">192.168.2.x</hostid>)。 所有私有网络上的机器都被配置为使用 <hostid role="ipaddr">.1</hostid> 这台机器作为它们的网关。</para> - + <para>我们希望, 从网络的观点看, 每一个网络上的机器都应该能够像在直接连接到同一路由器上一样看到对方网络上的机器 -- 尽管可能比路由器略慢一些, 并且有时会有丢包的现象。</para> - + <para>这意味着 (举例来说), 主机 <hostid role="ipaddr">192.168.1.20</hostid> 应该能够运行</para> - + <programlisting>ping 192.168.2.34</programlisting> <para>并且这能够透明地工作。 &windows; 机器应该能够看到其他网络上的机器, @@ -3843,21 +3138,21 @@ options IPSEC_DEBUG #debug for IP security role="ipaddr">192.168.2.1</hostid>。</para> </listitem> </orderedlist> - + <para>可以把上述过程理解为在两个网络间建立了一个 <quote>隧道</quote>。 两个 <quote>隧道口</quote> 是 IP 地址 <hostid role="ipaddr">A.B.C.D</hostid> 和 <hostid role="ipaddr">W.X.Y.Z</hostid>, 而隧道必须被告知哪些私有地址可以自由地在其中通过。 隧道被用来在公共的 Internet 上传递私有的 IP 数据。</para> - + <para>在 FreeBSD 上, 隧道可以通过一般的网络接口, 或 <devicename>gif</devicename> 来建立。 您也许已经猜到了, 每一台网关机的 <devicename>gif</devicename> 接口需要配置四个 IP 地址; 两个是公网 IP 地址, 另两个则是私网 IP 地址。</para> - - <para>对于 gif 设备的支持必须在两台网关机上编译进内核。 - 可以通过添加下面的设置:</para> - + + <para>对于 gif 设备的支持必须在两台网关机上编译进 &os; 内核。 + 可以通过添加下面的设置来达到目的:</para> + <programlisting>pseudo-device gif</programlisting> <para>到两边的内核配置文件中, 并重新编译、 安装和启动它们。</para> @@ -4043,25 +3338,43 @@ route_vpn="192.168.2.0 192.168.2.1 netmask 0xffffff00" <quote>安全策略</quote>。</para> </listitem> </orderedlist> - + <para>安全关联和安全策略都是由内核来维护的, 并可以通过用户态的程序来修改。 在能够这样做之前, 首先需要配置内核来让它支持 IPsec 和安全载荷封装 (ESP) 协议。 配置下面的内核选项</para> + + <indexterm> + <primary>内核选项</primary> + <secondary>IPSEC</secondary> + </indexterm> <programlisting>options IPSEC options IPSEC_ESP </programlisting> - + <para>然后重新编译、 安装最后重新启动新的内核。 在继续进行设置之前, 您需要在两台网关上都进行同样的设置。</para> + + <indexterm> + <primary>IKE</primary> + </indexterm> <para>在建立安全关联时有两种选择。 一种方法是完全手工地在两台主机之间选择加密算法、 密钥等等, 另一种方法是使用实现了 Internet 密钥交换协议 (IKE) 的服务程序来帮您完成这些任务。</para> <para>我们推荐后者。 不说别的, 它配置起来要容易得多。</para> + + <indexterm> + <primary>IPsec</primary> + <secondary>security policies</secondary> + </indexterm> + + <indexterm> + <primary><command>setkey</command></primary> + </indexterm> <para>用 &man.setkey.8; 可以编辑和显示安全策略。 打个比方, <command>setkey</command> 之于内核的安全策略表, @@ -4069,27 +3382,31 @@ options IPSEC_ESP <command>setkey</command> 还可以显示当前的安全关联, 这一点和 <command>netstat -r</command> 类似。</para> - + <para>FreeBSD 上用于管理安全关联的可供选择的服务程序有很多。 这篇文章将介绍如何使用其中的一种, racoon。 racoon 可以从 FreeBSD ports collection 安装, 它位于 security/ 分类下。 安装方法与其他软件无异。</para> + + <indexterm> + <primary>racoon</primary> + </indexterm> <para>racoon 需要在两台网关机上都运行。 需要配置 VPN 另一端的 IP, 以及一个密钥 (这个密钥可以任意选择, 但两个网关上的密钥必须一致)。</para> - + <para>两端的服务程序将相互通讯, 并确认它们各自的身份 (使用刚刚配置的密钥) 然后服务程序将生成一个新的密钥, 并用它来加密 VPN 上的数据通讯。 它们定期地改变密钥, 因此即使供给者破解了一个密钥 (虽然这在理论上并不十分可行) 他也得不到什么 -- 破解密钥的时候, 已经产生一组新的密钥了。</para> - + <para>racoon 的配置保存在 <filename>${PREFIX}/etc/racoon</filename> 中。 在那里应该能够找到一个配置文件, 不需要修改太多的设置。 raccon 配置的另一部分, 也就是需要修改的内容, 是 <quote>预先配置的共享密钥</quote>。</para> - + <para>默认的 racoon 配置文件应该可以在 <filename>${PREFIX}/etc/racoon/psk.txt</filename> 这个文件中找到。 需要强调的是, 这个密钥 <emphasis>并非</emphasis> 用于加密 VPN 连接的密钥, @@ -4098,17 +3415,18 @@ options IPSEC_ESP <para><filename>psk.txt</filename> 包含了需要打交道的每一个远程站点。 在本例中一共有两个站点, 每一个 <filename>psk.txt</filename> 都只有一行 (因为每个 VPN 接入点都只和一个端点连接)。</para> - + <para>在网关机 #1 上应该是:</para> - + <programlisting>W.X.Y.Z secret</programlisting> - + <para>这包括了远程站点的 <emphasis>公网</emphasis> IP 地址, 空格, 以及提供秘密的字符串。 - 很明显不应使用 <quote>secret</quote> 作为实际的密钥 -- 通常的口令选择策略应该应用到这里。</para> - + 很明显不应使用 <quote>secret</quote> 作为实际的密钥 -- + 通常的口令选择策略在这里也适用。</para> + <para>在网关 #2 上对应的配置是</para> - + <programlisting>A.B.C.D secret</programlisting> <para>也就是说, 对面端的公网 IP 地址, 以及同样的密钥。 @@ -4239,7 +3557,7 @@ ipfw add 1 allow udp from W.X.Y.Z to A.B.C.D isakmp <programlisting> spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P out ipsec esp/tunnel/A.B.C.D-W.X.Y.Z/require; </programlisting> - + <para>把这些命令放到一个文件 (例如 <filename>/etc/ipsec.conf</filename>) 然后执行</para> @@ -4402,7 +3720,7 @@ ipfw add 1 allow ipencap from W.X.Y.Z to A.B.C.D </listitem> </itemizedlist> - <para>前面的两部应该足以让 VPN 运转起来了。 + <para>前面的两步应该足以让 VPN 运转起来了。 两个网络上的机器都应该能通过 IP 来访问对方, 而所有的通讯都被自动地进行加密。</para> </sect3> @@ -4491,9 +3809,9 @@ user@example.com's password: <userinput>*******</userinput></screen> 指纹保存在 <filename>~/.ssh/known_hosts</filename> 中, 对于 SSH v2 指纹, 则是 <filename>~/.ssh/known_hosts2</filename>。</para> - <para>默认情况下 <application>OpenSSH</application> 服务器的配置会接受 - SSH v1 和 SSH v2 的连接。 然而, 客户端则可以选择两者之一。 - 一般认为, 第2版更加健壮和安全。</para> + <para>默认情况下, <application>OpenSSH</application> 服务器只接受 + SSH v2 连接。 然而, 客户端可以自行选择协议的版本 1 和 2 之一。 + 广为人知的一个事实是, 第 2 版的协议要更加健壮和安全。</para> <para>通过 <option>-1</option> 或 <option>-2</option> 参数, 可以强制 &man.ssh.1; 使用 v1 或 v2 的协议。</para> @@ -4662,7 +3980,7 @@ Your identification has been saved in /home/user/.ssh/identity. <para>SSH 隧道通过监听 <hostid>localhost</hostid> 上面指定端口来完成工作。 - 它将把本机主机/端口上街道的连接通过 SSH 连接转发到远程主机/端口。</para> + 它将把本机主机/端口上接收到的连接通过 SSH 连接转发到远程主机/端口。</para> <para>本例中, 位于 <hostid>localhost</hostid> 的 <replaceable>5023</replaceable> 端口 被用于转发 <hostid>localhost</hostid> 的连接到远程主机的 @@ -4721,7 +4039,7 @@ user@ssh-server.example.com's password: <userinput>******</userinput></screen> SSH 和网页浏览。</para> <para>您可能希望访问一些其它的 (也许与工作无关的) 服务, - 例如提供流式音乐的 Ogg Vorbis 服务器。 + 例如提供音乐的 Ogg Vorbis 流媒体服务器。 如果 Ogg Vorbis server 在 22 或 80 端口以外的端口播放音乐, 则您将无法访问它。</para> @@ -4783,7 +4101,8 @@ user@unfirewalled-system.example.org's password: <userinput>*******</userinput>< &unix; file system, <acronym>UFS2</acronym> 中内建了这种支持。</para> <note><para>在 <acronym>UFS1</acronym> 上配置扩展属性需要比 <acronym>UFS2</acronym> - 更多的管理开销。 在 <acronym>UFS2</acronym> 上的扩展属性的性能也要高不少。 + 更多的管理开销。 而且, 在 <acronym>UFS2</acronym> + 上的扩展属性的性能也有极大的提高。 因此, 如果想要使用访问控制表, 推荐使用 <acronym>UFS2</acronym> 而不是 <acronym>UFS1</acronym>。</para></note> @@ -4871,6 +4190,85 @@ drwxr-xr-x 2 robert robert 512 Nov 10 11:54 public_html</programlisting> </sect2> </sect1> + <sect1 id="security-portaudit"> + <sect1info> + <authorgroup> + <author> + <firstname>Tom</firstname> + <surname>Rhodes</surname> + <contrib>Contributed by </contrib> + </author> + </authorgroup> + </sect1info> + + <indexterm> + <primary>Portaudit</primary> + </indexterm> + <title>监视第三方安全问题</title> + + <para>过去几年中, 安全领域在如何处理漏洞的评估方面取得了长足的进步。 + 几乎每一个操作系统都越来越多地安装和配置了第三方工具, + 而系统被入侵的威胁也随之增加。</para> + + <para>漏洞的评估是安全的一个关键因素, + 尽管 &os; 会发布基本系统的安全公告, + 然而为每一个第三方工具都发布安全公告则超出了 &os; Project + 的能力。 在这一前提下, 一种减轻第三方漏洞的威胁, + 并警告管理员存在已知的安全问题的方法也就应运而生。 名为 + <application>Portaudit</application> 的 &os; 附加工具能够帮助您达成这一目的。</para> + + <para><filename role="port">security/portaudit</filename> port + 会下载一个数据库, 这一数据库是由 &os; Security + Team 和 ports 开发人员维护的, 其中包含了已知的安全问题。</para> + + <para>要开始使用 <application>Portaudit</application>, + 需要首先从 Ports Collection 安装它:</para> + + <screen>&prompt.root; <userinput>cd /usr/ports/security/portaudit && make install clean</userinput></screen> + + <para>在安装过程中, + &man.periodic.8; 的配置文件将被修改, 以便让 + <application>Portaudit</application> 能够在每天的安全审计过程中运行。 + 不需要进行更多的配置了。</para> + + <para>安装完成之后, 管理员必须通过运行下面的命令, + 来更新保存在本地 + <filename role="directory">/var/db/portaudit</filename> 的数据库:</para> + + <screen>&prompt.root; <userinput>portaudit -F</userinput></screen> + + <note> + <para>由于每天执行 + &man.periodic.8; 时都会自动更新数据库, 因此, + 运行这条命令是可选的。 在这里只是作为例子给出。</para> + </note> + + <para>管理员可以使用下面的命令审计通过 Ports Collection + 安装的第三方工具:</para> + + <screen>&prompt.root; <userinput>portaudit -a</userinput></screen> + + <para>下面是一个示范的输出:</para> + + <programlisting>Affected package: cups-base-1.1.22.0_1 +Type of problem: cups-base -- HPGL buffer overflow vulnerability. +Reference: <http://www.FreeBSD.org/ports/portaudit/40a3bca2-6809-11d9-a9e7-0001020eed82.html> + +1 problem(s) in your installed packages found. + +You are advised to update or deinstall the affected package(s) immediately.</programlisting> + + <para>通过访问上面给出的 <acronym>URL</acronym>, + 管理员能够了解关于那个漏洞的进一步信息。 + 这些信息通常包括受到影响的 &os; Port 版本, + 以及其他可能包含安全公告的网站。</para> + + <para>简而言之, <application>Portaudit</application> + 是一个强大的工具, 并能够配合 + <application>Portupgrade</application> port + 来非常有效地工作。</para> + </sect1> + <sect1 id="security-advisories"> <sect1info> <authorgroup> @@ -4953,15 +4351,15 @@ VII. References<co id="co-ref"></programlisting> </callout> <callout arearefs="co-category"> - <para><literal>Category</literal>(分类) 是指系统的哪一部分受到影响, - 这一栏可能是 <literal>core</literal>, <literal>contrib</literal>,或 - <literal>ports</literal> 之一。 <literal>core</literal> + <para><literal>Category</literal> (分类) 是指系统中受到影响的组建, + 这一栏可能是 <literal>core</literal>、 <literal>contrib</literal>, + 或者 <literal>ports</literal> 之一。 <literal>core</literal> 分类表示安全弱点影响到了 &os; 操作系统的某个核心组件。 <literal>contrib</literal> 分类表示弱点存在于某个捐赠给 &os; Project 的软件, 例如 <application>sendmail</application>。 - 最后是 <literal>ports</literal>, 它表示该弱点影响了 ports - collection 中的某个第三方软件。</para> + 最后是 <literal>ports</literal>, 它表示该弱点影响了 Ports + Collection 中的某个第三方软件。</para> </callout> <callout arearefs="co-module"> @@ -5039,6 +4437,66 @@ VII. References<co id="co-ref"></programlisting> </calloutlist> </sect2> </sect1> + + <sect1 id="security-accounting"> + <sect1info> + <authorgroup> + <author> + <firstname>Tom</firstname> + <surname>Rhodes</surname> + <contrib>Contributed by </contrib> + </author> + </authorgroup> + </sect1info> + <indexterm> + <primary>进程记帐</primary> + </indexterm> + <title>进程记帐</title> + + <para>进程记帐是一种管理员可以使用的跟踪系统资源使用情况的手段, + 包括它们分配给了哪些用户、 提供系统监视手段, + 并且可以精细到用户执行的每一个命令。</para> + + <para>当然, 这种做法是兼有利弊的。 它的好处是, + 查找入侵时可以迅速把范围缩小到攻击者进入的时刻; + 而这样做的缺点, 则是记帐会产生大量的日志, + 因而需要很多磁盘空间来存储它们。 + 这一节将带领管理员一步一步地配置基本的进程记帐。</para> + + <sect2> + <title>启用并利用进程记帐</title> + <para>在使用进程记帐之前, 管理员必须启用它。 + 要完成这项工作, 需要运行下面的命令:</para> + + <screen>&prompt.root; <userinput>touch <filename>/var/account/acct</filename></userinput> + +&prompt.root; <userinput>accton <filename>/var/account/acct</filename></userinput> + +&prompt.root; <userinput>echo 'accounting_enable="YES"' >> <filename>/etc/rc.conf</filename></userinput></screen> + + <para>一旦启用之后, 记帐就会开始跟踪 + <acronym>CPU</acronym> 统计数据、 命令, 等等。 + 所有的记帐日志不是以可读的方式记录的, 要查看它们, + 需要使用 &man.sa.8; 这个工具。 如果没有给出其他参数, 则 + <command>sa</command> 将按用户, 以分钟为单位显示他们所使用的时间、 + 总共的 <acronym>CPU</acronym> 和用户时间, + 以及平均的 I/O 操作数目, 等等。</para> + + <para>要显示关于刚刚发出的命令的相关信息, + 则应使用 &man.lastcomm.1; 工具。 + <command>lastcomm</command> 可以用来显示在某一 &man.ttys.5; + 上的用户信息, 例如:</para> + + <screen>&prompt.root; <userinput>lastcomm ls + <username>trhodes</username> ttyp1</userinput></screen> + + <para>将会显示出所有已知的 <username>trhodes</username> + 在 ttyp1 终端上执行 <command>ls</command> 的情况。</para> + + <para>更多的可用选项在联机手册 + &man.lastcomm.1;、 &man.acct.5; 和 &man.sa.8; 中有所介绍。</para> + </sect2> + </sect1> </chapter> <!-- |