
<chapt id="sec-services">增强系统上运行服务的安全性

<p>有两种方式来增强系统中运行的服务的安全性:

<list>

<item>使其只能通过它们应当所在的访问点(接口)访问.

<item>正确配置, 使其只能由合法的用户使用授权方式访问.

</list>

<p>限制服务, 使之只能由指定地点访问, 可以通过从内核级(如防火墙)限制其访问, 
配置其只监听指定接口(某些服务可能没有提供此类特性)或者使用其它的方法, 
例如 linux Vserver(2.4.16)补丁强制进程只能在一个借口使用.

<p>注意由 <prgn>inetd</prgn> 运行的服务(<prgn>telnet</prgn>,
<prgn>ftp</prgn>, <prgn>finger</prgn>, <prgn>pop3</prgn>...) 是
不能将服务配置的只监听一个接口的. 但是, 其替代版本<prgn>xinetd</prgn>
超级守护进程中的 <tt>bind</tt> 恰好解决了这个问题. 参阅<manref name="xinetd.conf"
section="5">.


<example>
service nntp
{
        socket_type     = stream
        protocol        = tcp
        wait            = no
        user            = news
        group           = news
        server          = /usr/bin/env
        server_args     = POSTING_OK=1 PATH=/usr/sbin/:/usr/bin:/sbin/:/bin
+/usr/sbin/snntpd logger -p news.info
        bind            = 127.0.0.1
} 
</example>

<p>以下部分将详细介绍如何根据其用途正确的配置各项服务.


<sect>ssh 安全化
<p>
如果您仍然使用 telnet, 而不是 ssh, 则需要改变对本手册的阅读方式. 
应当用 ssh 来取代所有的 telnet 远程登录. 任何时候通过嗅探互联网通讯来获取明文密码都是相当简单的, 
您应该采用使用加密算法的协议. 那么, 现在在你的系统上执行
<tt>apt-get install ssh</tt> .  

<p>鼓励您系统上的所有用户使用 ssh 取代 telnet, 或者更进一步, 卸载 telnet/telnetd. 
另外您应该避免使用 ssh 以 root 身份登录, 其替代的方法是使用 <prgn>su</prgn>
或 <prgn>sudo</prgn> 转换成 root 用户. 最后, <file>/etc/ssh</file> 目录下的 
<file>sshd_config</file> 文件, 应当作如下修改, 以增强安全性:

<list>
<item><tt>ListenAddress 192.168.0.1</tt> 

<p>使得 ssh 只监听一个指定的接口, 如果你有多个(并不想在其上边获得 ssh 服务)接口, 
或者将来会增加一块新网卡(但并不想通过它连接ssh服务).

<item><tt>PermitRootLogin no</tt>

<p>尝试任何情况先都不允许 Root 登录. 如果有人想通过 ssh 成为 root, 
需要两次登录, 并且root的密码现在仍不可能通过SSH暴力破解.

<item><tt>Listen 666</tt>

<p>改变监听端口, 这样入侵者不能完全确定是否运行了sshd守护进程(事先警告，这是模糊安全的).

<item><tt>PermitEmptyPasswords no</tt>
<p>空密码是对系统安全的嘲弄.

<item><tt>AllowUsers alex ref me@somewhere</tt>
<p>只允许某些用户通过 ssh 访问主机. <tt>user@host</tt> 也可用于限制指定用户通过指定主机访问.

<item><tt>AllowGroups wheel admin</tt>
<p>仅允许某个组的成员通过 ssh 访问主机. AllowGroups 和 AllowUsers 对于拒绝访问主机有同样的效果. 
当称它们为 "DenyUsers" 和 "DenyGroups" 时不要觉得奇怪.

<item><tt>PasswordAuthentication yes</tt>

<p>这完全取决于您的选择. 仅仅允许用户使用置于 ~/.ssh/authorized_keys 文件中的 ssh-keys 登录主机将更加安全. 
如果要达到这种效果，将其设为 "no".
<!-- FIXME: what does this mean? Is it "more secure" to set this to
"no"? (era) --> <!-- jfs, IMHO yes since you place the key of the
incoming host in your server and the authentication is done against
the key -->

<item>禁用所有的您不需要的认证方式, 如果您用不到, 例如 <tt>RhostsRSAAuthentication</tt>,
<tt>HostbasedAuthentication</tt>, <tt>KerberosAuthentication</tt> 或
<tt>RhostsAuthentication</tt>(例如), 您应该将其禁用, 即使它们是缺省设置(参阅联机帮助 <manref
name="sshd_config" section="5">).

<item><tt>Protocol 2</tt>
<p>禁用版本1协议, 因为其设计缺陷, 很容易使密码被黑掉. 更多信息, 参阅
<url id="http://earthops.net/ssh-timing.pdf" name="ssh协议问题报告"> 或
<url id="http://xforce.iss.net/static/6449.php" name="Xforce 通告">.

<item><tt>Banner /etc/some_file</tt>
<p>为用户连接到 ssh 服务器增加一个标题(它将从文件读取), 在一些国家, 登入给定系统前, 
给出未经授权或者用户监视警告信息, 将会受到法律的保护.

</list>

<p>您也可以在限制 ssh 登录的 PAM 控制文件中使用 <tt>pam_listfile</tt> 或 <tt>pam_wheel</tt> 
来限制对 ssh 服务器的访问. 例如, 您可以使某人没有列入 <file>/etc/loginusers</file> 文件,
并在 <file>/etc/pam.d/ssh</file> 中增加如下行:

<example>
auth       required     pam_listfile.so sense=allow onerr=fail item=user file=/etc/loginusers
</example>

<p>最后, 应当注意那些存放 OpenSSH 配置文件的目录. 现在, 有三种常用的 SSH 守护进程, 
ssh1, ssh2, 和 OpenBSD 用户使用的 OpenSSH. ssh1 是第一个可以使用的 ssh 守护进程, 
并且仍然有很大的用户群(甚至谣传有windows版本). ssh2 和 ssh1 相比有更多高级特性, 
但是它是基于保留源代码协议的. OpenSSH 是完全自由的 ssh 守护进程, 它支持 ssh1, 和 ssh2. 
OpenSSH 是在 Debian 系统中选择安装的 <package>ssh</package> 软件包.

<p>更多有于如何设定带有 PAM 支持的 SSH 的信息，请查阅<url
id="http://lists.debian.org/debian-security/2001/debian-security-200111/msg00395.html"
name="安全邮件列表文档">.

<sect1 id="ssh-chroot">Chrooting ssh
<p>

<p>当前的 OpenSSH 没有提供用户连接后自动完成 chroot 的方法(商业版本提供这种功能). 
但是有个项目为 OpenSSH 提供这种功能，参见<url
id="http://chrootssh.sourceforge.net">, 尽管它不在当前 Debian 的软件包中. 然而, 
您可以使用 <file>pam_chroot</file> 模块，如 <ref
id="user-restrict"> 所述.

<p>在 <ref id="chroot-ssh-env"> 中有几个选项用于设置SSH的chroot环境.

<sect1>ssh 客户端

<p>如果您使用的 SSH 客户端不能访问 SSH 服务器, 则需要确认是否支持在服务器端被强制执行的协议. 
例如, 如果您使用了只支持 version 1 协议的 <package>mindterm</package> 软件包. 
但是 sshd 服务器默认配置为只接受 version 2 协议(基于安全的原因).

<sect1>禁止文件传送

<p>如果您<em>不</em>想用户将文件传送到 ssh 服务器和从服务器向外传送文件, 
则需要限制对 <prgn>sftp-server</prgn> <em>和</em> <prgn>scp</prgn> 的访问. 
您可以通过适当的配置 <file>/etc/ssh/sshd_config</file> 来限制<prgn>sftp-server</prgn>. 
但是, 要限制 <prgn>scp</prgn> 访问, 则必需做以下两者之一:

<list>

<item>禁止用户通过 login 登录 ssh 服务器(如上所述或通过配置文件或PAM 配置).

<item>不要赋予不允许安全传送用户以合法的 shell。 
然而提供 shell 对于连接到 ssh 服务器的根本需求, 比如程序的菜单栏(ala BBS)
<!-- FIXME: What do you mean with "was useful at all" ? -->. 否则前边的选项更好.

</list>

<sect>Squid 安全化

<p>
Squid 是一款非常流行的 proxy/cache 服务器, 并且涉及一些应该被考虑的安全问题. 
Squid 的默认配置文件拒绝所有的用户请求. 但是 Debian 的软件包, 允许源自 'localhost' 的访问, 
您只需要正确的配置您的浏览器就可以了. 您应当通过在 <file>/etc/squid.conf</file> 中定义一个访问控制, 
来配置 squid, 以允许可信任的用户, 主机, 网络访问, 有关定义ACL规则的更多信息参见 <url name="Squid 用户指南" 
id="http://squid-docs.sourceforge.net/latest/html/book1.html">. 注意, debian 提供了 Squid 的最小化配置, 
其只允许 <em>localhost</em> 使用您的代理服务器(使用默认端口3128), 您需要根据需求定制 <file>/etc/squid.conf</file> 
文件. 推荐的最小化配置(在软件包中提供)如下:

<example>
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl SSL_ports port 443 563
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443 563     # https, snews
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl Safe_ports port 901         # SWAT
acl purge method PURGE
acl CONNECT method CONNECT
(...)
# Only allow cachemgr access from localhost
http_access allow manager localhost
http_access deny manager
# Only allow purge requests from localhost
http_access allow purge localhost
http_access deny purge
# Deny requests to unknown ports
http_access deny !Safe_ports
# Deny CONNECT to other than SSL ports
http_access deny CONNECT !SSL_ports
#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#
http_access allow localhost
# And finally deny all other access to this proxy
http_access deny all
#Default:
# icp_access deny all
#
#Allow ICP queries from eveyone
icp_access allow all
</example>

<p>您还应当基于系统资源来配置 Squid, 包括高速缓存(<tt>cache_mem</tt>项), 
本地缓存文件, 及其占用的空间大小(<tt>cache_dir</tt>项).

<p>注意, 如果配置不当, 某些人也许可以通过 Squid 传递邮件消息, 因为HTTP和SMTP协议设计的非常相似. 
Squid 的默认配置文件拒绝访问 25 端口. 如果您希望允许连接 25 端口, 仅需要将其加入 Safe_ports 列表即可. 
但是, 这里推荐 <em>NOT</em>.

<p>只有正确的设定和配置 proxy/cache 服务器才能保证您的站点安全. 其它必要的任务是分析 Squid 的日志, 
以确保所有的都正常运转. 在 Debian GNU/Linux 中有一些软件包帮助管理员完成这些工作. 在 woody(Debian 3.0) 中提供以下软件包:

<list>
<item><package>calamaris</package> - Squid 或 Oops 代理的日志分析工具.
<item><package>modlogan</package>  - 日志分析工具组件.
<!-- This one is no longer available?
<item><package>sarg</package> - Squid Analysis Report Generator.
-->
<item><package>squidtaild</package> - Squid 日志监控程序.
</list>

<p>当以加速方式使用 Squid 时, 它又象一个web服务器. 这里的选项代码越复杂, 
则越不可靠. 默认 Squid 不是被配作 web 服务器的, 所以这一点您不需要担心. 
注意, 如果您要使用这一特性, 则需要确认这是真正必要的. 也可以从<url name="Squid
用户指南 第9章"
id="http://squid-docs.sourceforge.net/latest/html/c2416.html">查询关于加速模式的更多信息.

<sect id="ftp-secure">FTP 安全化

<p>
如果您真的必须使用 FTP(没有使用 sslwarp 或插入 SSL 或使用 SSH 通道), 
则应当 chroot ftp 为 ftp 用户的主目录, 这样用户就不会看到其目录以外的东西. 
否则他们就可以遍历您的文件系统, 就象他们拥有这样的 shell 一样. 您应当在 
<file>proftpd.conf</file> 中的global 部分增加以下行以启用 chroot 的这个特点:

<example>
DefaultRoot ~
</example>

<p>通过 <tt>/etc/init.d/proftpd restart</tt> 重起 proftpd, 
然后检查您是否能从您的主目录逃出来.

<P>使用  ../../.. 以防止 Proftp DoS 攻击, 增加以下行到 <file>/etc/proftpd.conf</file> 文件:

<tt>DenyFilter \*.*/</tt>

<p>要记住, FTP 使用明码传送登录和认证密码(如果你提供的是匿名公共服务, 那么这不算什么问题), 
不过在 Debian 中于此有更好的选择. 例如, <prgn>sftp</prgn>(<package>ssh</package>提供). 
也有一些基于其它系统的有关 SSH 的自由软件: 例如 <url
id="http://www.chiark.greenend.org.uk/~sgtatham/putty/" name="putty">
和 <url id="http://www.cygwin.com" name="cygwin">.

<!-- contributed by Jesus Climent --> 
<p>但是, 当您维护一个用户通过 SSH 访问的 FTP 服务器时, 您可能会碰到一个典型问题. 
用户在 SSH-secured 系统里访问匿名 FTP 服务器时可能会试图登入 <em>FTP服务器</em>. 
当访问被拒绝时, 密码则会以明码的方式在网络上传送. 为了避免这一点, ProFTPd 的开发者 TJ Saunders, 
创建了阻止拥有合法 SSH 账号的用户访问匿名 FTP. 可以从 <url
id="http://www.castaglia.org/proftpd/#Patches" name="ProFTPD
Patches"> 获取更多信息和补丁. Debian 中也提交了这个补丁, 参见
<url id="http://bugs.debian.org/145669" name="Bug #145669">.

<sect>对 X 窗口系统的安全访问
<p>
今天, 越来越多的使用一台服务器带多台工作站的公司会使用 X 终端. 
这可能是很危险的, 因为您需要允许文件服务器连接到客户端(从 X 的观点来看就是 X 服务器. X 的关键词是客户和服务器). 
如果听从大多数(糟糕的)文档的建议, 在您的机器上键入 <tt>xhost +</tt>. 这将允许任何 X 客户端连接您的机器. 
基于安全的考虑, 您则应当使用 <tt>xhost +hostname</tt> 命令, 仅允许指定的主机连接.

<p>
一种更安全的方案, 就是 X 使用 ssh 通道并加密 <!-- FIXME: add "and compress" --> 整个会话.
当您ssh到其他机器时, 这一切都是自动完成的. 
<!-- This has to be enabled in <file>/etc/ssh/ssh_config</file> by -->
<!-- setting <tt>X11Forwarding</tt> to <tt>yes</tt>. -->
为了取得这样的效果, 您必需同时配置 ssh 的客户端和服务器端. ssh客户端, 
在 <file>/etc/ssh/ssh_config</file> 中将 <tt>ForwardX11</tt> 设为 <tt>yes</tt>. 
服务器端，在 <file>/etc/ssh/sshd_config</file> 文件中, 将 <tt>X11Forwarding</tt> 设为 <tt>yes</tt>, 
并且安装 <package>xbase-clients</package> 软件包, 因为设定伪 X 显示时, ssh 服务器要使用<file>/usr/X11R6/bin/xauth</file>. 
<!-- discovered this when setting up two minimally installed boxes -->
使用 SSH 时, 您应当完全丢弃基于 xhost 的访问控制. 
<!-- FIXME: check. The text said "has to be disabled" [sic] -->

<p>
为取得最佳的安全性, 如果您不需要从其它机器的 X 登录, 简单的键入以下命令, 以关掉对于 tcp 端口 6000 的绑定:

<example>$ startx -- -nolisten tcp</example>


<p>在 Xfree 4.1.0 中这是缺省的( Debian 3.0 提供的 Xserver). 如果您运行的是 
Xfree 3.3.6 (即您安装的是 Debian2.2 )您可以编辑<file>/etc/X11/xinit/xserverrcc</file>以获取这种功能:

<example>
#!/bin/sh
exec /usr/bin/X11/X -dpi 100 -nolisten tcp
</example>

<p>如果您使用 XDM, 设定 <file>/etc/X11/xdm/Xservers</file>  为:
<tt>:0 local /usr/bin/X11/X vt7 -dpi 100 -nolisten tcp</tt>. 如果您使用Gdm, 
确保 <file>/etc/gdm/gdm.conf</file> 中 <tt>-nolisten tcp</tt> 选项类似如下设置(在 Debian中, 这是默认设置):

<example>
[server-Standard]
name=Standard Server
command=/usr/bin/X11/X -nolisten tcp
</example>

<p>您还可以为<prgn>xscreensaver</prgn>锁设置默认系统超时. 既使用户能忽略它, 
您应该编辑 <file>/etc/X11/app-defaults/XScreenSaver</file> 配置文件, 修改锁定行:
<example>
*lock:                  False
</example>
<p>(在Debian中是默认设置) 为:
<example>
*lock:                  True
</example>

<p>FIXME: 增加关于如何禁用用户桌面的屏幕保护程序的信息(这也许包含敏感信息).

<p>更多 X 窗口安全的信息参阅
<url
name="XWindow-User-HOWTO"
id="http://www.tldp.org/HOWTO/XWindow-User-HOWTO.html">
(<file>/usr/share/doc/HOWTO/en-txt/XWindow-User-HOWTO.txt.gz</file>).


<p>FIXME: 增加debian-security 线程关于修改 XFree 3.3.6 的配置文件信息.  

<sect1> 检查您的显示管理器
<p>
如果您只想安装一个用于本地应用的显示管理器(拥有友好的图形登录界面), 
应确保 XDMCP (X管理控制协议)被禁用. 在XDM中您可以在 <tt>/etc/X11/xdm/xdm-config</tt> 中加入如下行:

<example>
DisplayManager.requestPort:     0
</example>

<p>通常, 在 Debian 中所有显示管理器缺省被配置成不启用始XDMCP.


<sect>安全打印控制(lpd 和lprng 的问题)

<p>想象一下, 您刚开始工作, 打印机就开始无休止的往外吐纸, 这是因为某些人控制了打印守护进程. 
很讨厌，不是吗?  

<!-- Info based on Dale Southard's post to debian-security april 11th 2002-->
<p>任何 Unix 打印构架, 都必需有一个方法获取客户端数据并传送给主机的打印服务器, 
传统的 <prgn>lpr</prgn> 和 <prgn>lp</prgn>, 客户命令拷贝或将数据建立符号链接到 spool 目录
(这就是这些程序通常是 SUID 或 SGID 的原因).

<p>为了避免出现问题, 您应该保持打印机服务器特别的安全. 这意味着需要将打印服务器配置为只允许由被信任的服务器连接.
在您的 <file>/etc/hosts.lpd</file> 文件中加入允许的服务器, 即可实现这一点.

<p>但是, 即便如此, <prgn>lpr</prgn> 守护进程仍会接收任何对 515 端口的连接. 
您应当考虑屏蔽来自 networks/hosts 的连接, 他们是不允许使用打印服务的(<prgn>lpr</prgn> 守护进程不能设定为只监听指定 IP 地址). 

<!-- FIXME
<p>Of course, you could also take the lpr/lprng sources
and change them so that the connect function is only done to "127.0.0.1".
apt-get source lpr
and patch the bind (finet) call
-->

<p>和<prgn>lpr</prgn>相比, <prgn>Lprng</prgn> 应当是更好的选择，因为它可以配置为遵从IP存取控制. 
并且可以指定绑定端口(虽然有些古怪). 

<!-- FIXME: ask Craig Small about his post in debian-private 19th october 2001 
-->

<p>如果您的系统配有一台打印机, 但是您并不想将其网络共享. 那么您可以考虑使用其他的打印系统
比如 <package>cups</package> 提供的系统或基于用户权限的 <file>/dev/lp0</file> 设备提供的 <url name="PDQ"
id="http://pdq.sourceforge.net/">.

<p><package>cups</package>, 通过http协议将打印数据传送至服务器. 这就意味着客户端程序并不需要任何特殊的权限, 
而是仅需要服务器监听端口就可以了.

<p>但是, 如果您仅希望在本地使用 <prgn>cups</prgn>, 则可以通过修改<file>/etc/cups/cupsd.conf</file>
以将其绑定到回送端口:

<example>
Listen 127.0.0.1:631
</example>

<P>此配置文件有许多诸如允许或禁止网络和主机的其他安全选项. 然而, 如果您并不需要这些, 
则仅需要限制监听端口即可. <prgn>Cups</prgn> 也是通过 HTTP 端口来传送文档数据, 
如果您不想对外部攻击者透露潜在有用信息的话(端口是开放的), 可以增加如下行:

<example>
&lt;Location /&gt;
  Order Deny,Allow
  Deny From All
  Allow From 127.0.0.1
&lt;/Location&gt;
</example>

<p>也可以修改此配置文件以增加诸如 SSL/TLS 证书和加密的特性. 可以在 http://localhost:631/ 或 <url id="cups.org"> 处获取操作手册.  

<P>FIXME: 增加更多内容(文章 <url name="Amateur Fortress
Building" id="http://www.rootprompt.org"> 提供一些非常有趣的观点).  

<p>FIXME: 检查在 Debian 中 PDG 的可用性, 如果可以, 建议其做好更好的打印系统.

<p>FIXME: 检查 Farmer/Wietse 是否可以作为打印守护进程的替代, 以及其是否在 Debian 系统中可用.

<sect>邮件服务的安全化

<p>如果您的服务器并不是一个邮件系统, 那么您并不需要一个邮件守护进程监听传入连接, 
但是也许您希望本地邮件能够有序的分发，比如，为 root 用户接收从报警系统传来的邮件.

<p>如果您安装了<prgn>exim</prgn>, 并不需要其作为守护进程, 因为标准 <prgn>cron</prgn> 
任务可以刷新邮件队列. 配置方法, 参阅<ref id="disableserv">.

<sect1>配置 Nullmailer

<p>也许您需要一个本地邮件守护进程, 以便可以将本地邮件发送到其他系统. 
当您管理几个系统, 并且不想连到每个系统去阅读本地邮件时, 那么这是很普通的需求. 
所有单个系统的登录可以通过一台中央 syslog 服务器集中起来, 邮件被发送到一台中央邮件服务器.

<p>这就需要正确的配置一个<em>只读</em>系统. 守护进程配置为仅监听回送地址.

<P>FIXME: 应当升级到 exim4, 它是 sarge 和以后版本(最小的默认配置仅监听 localhost)中默认的邮件传输代理.

<p>在 Debian 3.0 系统中, 使用<package>exim</package>, 您必须将 smtp 守护进程从 <prgn>inetd</prgn> 中删除:
<example>
$ update-inetd --disable smtp
</example>

<p>并将邮件守护进程配置为仅监听回送接口. 在 <prgn>exim</prgn> 中(缺省的MTA)
您可以通过编辑 <file>/etc/exim.conf</file> 加入如下行来完成配置:

<example>
local_interfaces = "127.0.0.1"
</example>

<p>重起两个守护进程(inetd 和 exim)后, exim 将只对 127.0.0.1:25 监听. 
注意, 要首先禁用 inted, 否则 exim 将不能启用, 因为 inetd 守护进程仍然处理传入连接.

<p>对于 <prgn>postfix</prgn> 来说应当编辑 <file>/etc/postfix/main.conf</file>:

<example>
inet_interfaces = localhost
</example>

<p>如果您只是希望处理本地邮件, 这种方法比 tcp-wrapping 邮件或增加防火墙规则来限制访问更好. 
但是, 如果您仍需要监听其他接口, 则应当考虑由 inetd 装载并增加一个 tcp wrapper, 
并用 <file>/etc/hosts.allow</file> 和 <file>/etc/hosts.deny</file> 来限制访问. 并且, 
如果你正确的设置了日志纪录, 则当未被授权的访问试图攻击您的邮件守护进程时，将会被告知.

<p>无论如何, 在 SMTP 级别拒绝邮件转发, 您应当编辑 <file>/etc/exim/exim.conf</file> 加入如下行:

<example>
receiver_verify = true
</example>

<p>既使您的邮件服务器不会转发信息, 这种配置对于中转测试器来说也是必须的, 可以通过 <url
id="http://www.abuse.net/relay.html"> 来检测您的服务器有无中转能力.

<p>如果您希望设定为 只读 , 那么您可以考虑修改邮件守护进程, 使其<em>只</em>完成将邮件转发到远端邮件服务器的功能. 
对此, Debian 同时提供了 <package>ssmtp</package> 和 <package>nullmailer</package>. 无论如何, 
您可以自己评估一下每个Debian提供的邮件传输代理
<footnote>
在 Debian 中查找邮件守护进程列表:
<example>
$ apt-cache search mail-transport-agent
</example>
<p>这个列表将不会包括 <prgn>qmail</prgn>, 它只在<package>qmail-src</package>软件包中做为源代码发行.
</footnote>.
来确定哪个更适合自己的系统用途.

<sect1> 提供对邮箱的安全访问

<p>有一些 POP3 和 IMAP 守护进程可以满足您远程访问邮箱的需求
<footnote>在 Debian中您可以这样获取支持这些协议的 服务器/守护进程 列表:
<example>
$ apt-cache search pop3-server
$ apt-cache search imap-server
</example>
</footnote>. 但是, 如果您要提供 IMAP 访问, 那么应当注意这是一个普通文件存储协议, 
通过它可以获取 shell 权限, 因为用户可以检索所有文件.

<p>例如, 可以尝试配置您的 inbox 路径为 {server.com}/etc/passwd, 如果可以成功, 
则说明您的 IMAP 守护进程没有正确的配置以阻止此类访问.

<p>在 Debian 中, <prgn>cyrus</prgn> 的 IMAP 服务器(在 <package>cyrus-imapd</package> 软件包中)
通过将所有存取权限存储在文件系统里的一个访问限制的数据库中来避免这种漏洞. 
并且, <prgn>uw-imapd</prgn>(或者安装 <package>uw-imapd</package>, 如果您的IMAP客户端支持，
安装 <package>uw-imapd-ssl</package> 更好)可以配置为 chroot 用户的邮件路径, 但默认没有启用. 
所提供文档对如何配置有更详细的说明.

<p>再有, 也许您想运行一个不必在本地系统创建合法用户(需要授予 shell 访问权限)的 IMAP 服务器, 
<package>courier-imap</package>(用于 IMAP)和 <package>courier-pop</package>(用于 POP3)还有 <package>cyrus-imapd</package>(用于 POP3 和 IMAP)
都可以提供包括本地账号的认证方法. <prgn>cyrus</prgn> 可以使用任何一种可由 PAM whileas <prgn>teapop</prgn> 
配置的认证方法来通过数据库(譬如 <package>postgresql</package> 和 <package>mysql</package>)完成用户认证.


<p>FIXME: 检查: <package>uw-imapd</package> 也可以配置为通过 PAM 完成用户认证.

<sect1>安全的接收邮件
<p>
阅读/接收邮件通常是使用明文协议. 如果您使用 POP3 或 IMAP 来接收邮件, 
则将会在网络上明文传送您的密码, 那么, 从现在起几乎所有的人都可以阅读您的邮件了. 
故而, 应当使用 SSL(安全套接字层)来接收邮件. 另一种选择是 ssh, 如果您在作为 POP 或 IMAP 服务器的主机上拥有一个 shell 账号的话. 
这里有一个简单的 <file>fetchmailrc</file> 范例:

<example>
poll my-imap-mailserver.org via "localhost"
  with proto IMAP port 1236
      user "ref" there with password "hackme" is alex here warnings 3600
    folders
      .Mail/debian
    preconnect 'ssh -f -P -C -L 1236:my-imap-mailserver.org:143 -l ref
     my-imap-mailserver.org sleep 15 &lt;/dev/null &gt; /dev/null'
</example>

<p>其中 preconnect 是重要的一行. 其生成一个 ssh 会话, 并创建必要的通道, 
自动将本地 1236 端口连接至 IMAP 服务器, 并且是加密的. 另一种可行的方案是使用带有 ssl 特性的 fetchmail.

<p>如果您想象 POP 和 IMAP 一样提供加密邮件, <tt>apt-get install stunnel</tt>, 然后用如下方式启动您的守护进程:

<example>
stunnel -p /etc/ssl/certs/stunnel.pem -d pop3s -l /usr/sbin/popd
</example>


<p>这个命令将为端口(-d)提供守护进程(-l)并使用指定ssl证书(-p).



<sect id="sec-bind">增强 BIND 的安全性

<p>有很多不同的方式用于完成域名服务器守护进程的安全化, 这仅与考虑方式有关:

<list>

<item>正确的配置守护进程, 使其不会被外部误用(参见<ref id="configure-bind">). 
这包括限制来可能自客户端的查询: 区域转换和递归查询.

<item>限制守护进程对服务器自身的访问, 这样即使其被破坏, 对系统的损害也是有限的. 
这包括以无特权用户的身份来运行守护进程(参见 <ref id="user-bind">)
和对其进行 chroot(参见 <ref id="chroot-bind">)

</list>

<sect1 id="configure-bind">配置Bind以防误用

<p>您应当限制一些 DNS 服务器对外部提供的信息。 以防止一些您不想透露的关于
您的组织的信息被外部检索. 这包括增加以下内容: 
<em>allow-transfer</em>, <em>allow-query</em>,
<em>allow-recursion</em> 和 <em>version</em>.
您可以在全局部分(作用域为整个域服务)或者每个基本域来做此限制. 
这些信息在 <package>bind-doc</package> 软件包中提供, 安装后就可从
 <file>/usr/share/doc/bind/html/index.html</file> 获取更多相关信息.

<p>设想一下, 您的服务器同时与互联网和您的内部(您的内部IP是192.168.1.2)网(一台基本的 multi-homed 服务器)相连, 
您不想为互联网提供任何服务, 而只是为内部主机提供 DNS 查询服务. 您可以在 <file>/etc/bind/named.conf</file> 
中加入如下内容, 以实现这种限制:

<example>
options {
	    allow-query { 192.168.1/24; } ;
	    allow-transfer { none; } ; 
	    allow-recursion { 192.168.1/24; } ;
	    listen-on { 192.168.1.2; } ;
	    forward { only; } ;
	    forwarders { A.B.C.D; } ;
};
</example>

<p>
<em>listen-on</em> 选项使 DNS 仅绑定到内部地址接口, 但即使此接口和与互联网相连的相同(例如, 您正在使用 NAT), 
也只会接收源自您的内部网络的主机的查询. 如果系统有多个接口, 并且没有指定<em>listen-on</em>项, 
以确保只有内部用户可以查询, 那么因为此端口外部攻击者也可以访问，所以他们将设法对 DNS 服务器攻击(或利用缓冲溢出攻击).
因此如果 DNS 服务器只为自身提供服务, 则应当配置其只监听 127.0.0.1.
</p>

<p>
version.bind 记录了当前所运行 bind 程序的版本. 这个信息经常被自动扫描器和
寻找脆弱的bind攻击对象的恶意个人所利用. 通过在version.bind 中提供错误的或不提供信息,
来减少可能的针对其发布版本的攻击.以如下方式,使用<em>version</em>来指定
您要提供的版本信息: <example> options { ... various options here ...
version "Not available."; }; </example>

<p>改变 version.bind 的记录并不能对避免攻击提供实质性的保护. 
但是可以被认为是一个有用的保障.
</p>

<p>下边是一个 <file>named.conf</file> 配置文件的例子:

<example>
acl internal {
        127.0.0.1/32;           // localhost
        10.0.0.0/8;             // internal
        aa.bb.cc.dd;            // eth0 IP
};

acl friendly {
        ee.ff.gg.hh;            // slave DNS
        aa.bb.cc.dd;            // eth0 IP
        127.0.0.1/32;           // localhost
        10.0.0.0/8;             // internal
};

options {
        directory "/var/cache/bind";
        allow-query { internal; };
        allow-recursion { internal; };
        allow-transfer { none; };
};
// From here to the mysite.bogus zone 
// is basically unmodified from the debian default
logging {
        category lame-servers { null; };
        category cname { null; };   
};

zone "." {
        type hint;
        file "/etc/bind/db.root";
};

zone "localhost" {
        type master;
        file "/etc/bind/db.local";
};

zone "127.in-addr.arpa" {
        type master;
        file "/etc/bind/db.127";
};

zone "0.in-addr.arpa" {
        type master;
        file "/etc/bind/db.0";
};

zone "255.in-addr.arpa" {
        type master;
        file "/etc/bind/db.255";
};

// zones I added myself
zone "mysite.bogus" {
        type master;
        file "/etc/bind/named.mysite";
        allow-query { any; };
        allow-transfer { friendly; };
};
</example>

<P>请(再次)检查关于 Bind 的错误跟踪系统, 特别是<url name="Bug #94760 (有关区域转换的授权控制列表)"
id="http://bugs.debian.org/94760">.如果您认为自己能增加有用信息, 请为错误报告贡献您的力量.

<sect1 id="user-bind">管理 BIND 用户

<p>关于限制 BIND 的权限, 您必须清楚, 如果由非 root 用户运行 BIND, 则 BIND 
无法自动监测新的接口, 例如在您的笔记本上插入一个 PCMCIA 卡. 
关于这个问题的更多信息参见 named 文档目录下的 README.Debian 文件
(<file>/usr/share/doc/bind/README.Debian</file>). 最近发现很多关于 BIND 的安全方面的问题, 
因此在可能的时候切换用户是比较有用的. 我们将在这里做详细的讲解, 然而如果您想自动完成这些设置, 
可以尝试一下 <ref id="bind-chuser"> 提供的脚本.

<p>为了可以使用其它用户来运行 BIND, 首先应为此创建一个单独的用户和组
(每个非root运行的服务都使用 nobody 或 bogroup <em>不</em>是一个好主意). 
在下边的例子中, 将会使用<tt>named</tt>这个用户和组. 键入如下内容:
<example>
addgroup named
adduser --system --home /home/named --no-create-home --ingroup named \
      --disabled-password --disabled-login named
</example>

<p>注意, 用户 named 将会是一个限制. 如果您需要, 或者其它的原因, 有一个较少的限制的设定:
<example>
adduser --system --ingroup named named
</example>


<p>使用您喜欢的编辑器编辑 <tt>/etc/init.d/bind</tt>, 修改开始行
<example>
start-stop-daemon --start
</example>

为<footnote>注意, 根据您的 bind 的版本, 可能没有 <tt>-g</tt> 选项, 如果您使用 woody 并安装了 bind9 (9.2.1-2.woody)就更需注意.</footnote>

<example>
start-stop-daemon --start --quiet --exec /usr/sbin/named -- -g named -u named
</example>

<P>修改 Bind 所使用文件的权限, 这包括 <file>
/etc/bind/rndc.key</file>:

<example>
-rw-r-----    1 root     named          77 Jan  4 01:02 rndc.key
</example>

在 bind 创建 pidfile 的地方,使用, 例如 <file>/var/run/named</file> 来替代 <file>/var/run</file>:

<example>
$ mkdir /var/run/named
$ chown named.named /var/run/named
$ vi /etc/named.conf
[ ... update the configuration file to use this new location ...]
options { ...
        pid-file "/var/run/named/named.pid";
};
[ ... ]
</example>

<p>同时, 为避免作为 root 运行，修改<tt>reload</tt>行:

<example>
reload)
       /usr/sbin/ndc reload
</example>

<p>为:
<example>
reload)
        $0 stop
        sleep 1
        $0 start
</example>

<p>注意: 您也许还需要修改 <tt>restart</tt> 行, 这与您的 Debian 的版本有关. 
这在 Debian 的 bind <tt>1:8.3.1-2</tt> 版中对此做了修正.

<p>
现在您所需要做的是通过  '/etc/init.d/bind restart' 重启 bind, 
并检查您的 syslog 中的类似如下两条的内容:
<p>
<example>
Sep  4 15:11:08 nexus named[13439]: group = named
Sep  4 15:11:08 nexus named[13439]: user = named
</example>


如果要了解有关为什么 bind 作为非 root 用户无法运行的信息, 请检查关于 bind 的错误跟踪系统, 
具体见 <url name="Bug #50013: bind 不应当作为 root 运行"
id="http://bugs.debian.org/50013"> 和 <url name="Bug #132582: 缺省安装的潜在危险"
id="http://bugs.debian.org/132582">, 
<url name="Bug #53550" id="http://bugs.debian.org/53550">, 
<url name="Bug #128120" id="http://bugs.debian.org/52745">, 和
<url name="Bug #128120" id="http://bugs.debian.org/128129">
如果您认为自己能增加有用信息, 请为错误报告贡献您的力量.


<sect1 id="chroot-bind">使名称服务器运行于 chroot 环境

<p>为了达到 BIND 的最佳安全性, 现在在您的守护进程周围创建一个 chroot jail(参阅 <ref
id="chroot">. 有一个简单的办法: <tt>-t</tt> 选项(参阅 <manref name="named" section="8"> 
联机手册，或<url id="http://www.nominum.com/content/documents/bind9arm.pdf"
name="Bind's 9 documentation (PDF)"> 的第100页). 这样 bind 将被 chroot 到一个指定目录, 
而不需为设定 chroot jail 或为动态库担心. chroot 涉及到的文件是:

<example>
dev/null
etc/bind/       - 保存 named.con f文件和所有的服务区域文件
sbin/named-xfer - 如果您做名称转换的话
var/run/named/  - 保存pid和名称服务缓存, 此目录对 named 用户应当可写
var/log/named   - 如果配置将日志写入一个文件, 需要对 named 用户可写
dev/log         - 如果 named 配置为通过它记录日志，syslogd 将在此处监听

</example>


<p>Bind 守护进程必须对 named 文件有访问权限才能正常运行. 
因为这些配置文件通常都在 <tt>/etc/named/</tt> 目录下, 所以这很容易办到. 
应当考虑到，对于区域文件只需要有只读权限，除非这是第二或缓存名称服务器. 
如果是这样，您则需要给必要的区域以写权限(以便从主服务器进行区域转换).

<p>您也可以在 <url name="Chroot-BIND-HOWTO"
id="http://www.tldp.org/HOWTO/Chroot-BIND-HOWTO.html"> (关于 Bind 9)和 <url name="Chroot-BIND8-HOWTO"
id="http://www.tldp.org/HOWTO/Chroot-BIND8-HOWTO.html"> (关于 Bind 8)处找到有关Bind chrooting的信更多息. 
通过安装 <package>doc-linux-text</package>(text 版) 或 <package>doc-linux-html</package>(html版)
也可以得到同样的文档. 其它一些有价值的文档<url id="http://web.archive.org/web/20011024064030/http://www.psionic.com/papers/dns/dns-linux">.
<p>如果您想在 Debian(potato) 中为 Bind 8.2.3 设定完全的 chroot jail(即，不仅仅是用 <tt>-t</tt>), 
应确保您有以下文件:

<example>
dev/log - syslogd 在此处监听
dev/null
etc/bind/named.conf 
etc/localtime
etc/group - 只有一行: "named:x:GID:"
etc/ld.so.cache - 由 ldconfig 生成  
lib/ld-2.1.3.so
lib/libc-2.1.3.so
lib/ld-linux.so.2 - ld-2.1.3.so 的符号连接 
lib/libc.so.6 - libc-2.1.3.so 的符号连接
sbin/ldconfig - 设定 chroot 完成后将被删除
sbin/named-xfer - 如果做名称转换
var/run/
</example>

<p>并修改 <prgn>syslogd</prgn> 监听 #CHROOT/dev/log, 
并使 named 服务器可将 syslog 写入本地系统日志.

<p>如果您想避免动态链接库的问题, 您可以静态编译 bind. 
可以使用 <prgn>apt-get</prgn> 带 <tt>source</tt> 选项下载. 这样可以下载所需正确编译的软件包. 
您需要做类似如下操作:

<!-- FIXME: Does bind use autoconf? -->
<example>
$ apt-get --download-only source bind build-dep bind
$ cd bind-8.2.5-2
(edit the Makefile.in so CFLAGS includes the '-static' option 
before the @CFLAGS@ definition substituted by autoconf)
$ dpkg-buildpackage -rfakeroot
$ cd ..
$ dpkg  -i bind-8.2.5-2*deb
</example>

<p>安装后完成后, 您需要将文件移到 chroot jail
<footnote>当调用 <prgn>dpkg</prgn> 的时候, 除非您使用 <tt>instdir</tt> 选项, 否则可能会变的更复杂</footnote>
下，在<file>/etc/init.d</file> 目录下维护一个 <tt>init.d</tt> 脚本, 
这样系统就会自动启动名称服务器, 并脚本中调用 <prgn>start-stop-daemon</prgn> 处
加入 <tt>--chroot /location_of_chroot</tt>.

<p>有关如何设定chroot的更多信息，参见 <ref id="chroot">.

<p>FIXME, 合并源自以下地址的信息
<url id="http://people.debian.org/~pzn/howto/chroot-bind.sh.txt">,
<!-- <url id="http://people.pdxlinux.org/~karlheg/"> (Bind9 on Debian),-->
<url id="http://www.cryptio.net/~ferlatte/config/"> (Debian-specific),
<url id="http://www.psionic.com/papers/whitep01.html">, 和
<url id="http://csrc.nist.gov/fasp/FASPDocs/NISTSecuringDNS.htm">
<!--
和
<url id="http://www.acmebw.com/papers/securing.pdf">.
-->
<sect>增加 Apache 的安全性

<p>FIXME: 增加内容: 有关 Apache 正常安装时提供的模块(在 /usr/lib/apache/X.X/mod_* 处)
和可能被安装的在 ibapache-mod-XXX 软件包中的模块.

<p>如果只是想在内部使用(为了测试, 对 <package>doc-central</package> 的访问, 等等)
而不想对外部提供服务, 您可以限制对 Apache 服务器的访问. 在 <file>/etc/apache/http.conf</file> 
中设定 <tt>Listen</tt> 或直接 <tt>BindAddress</tt>.

<p>使用监听:
<example>
Listen 127.0.0.1:80
</example>
<p>使用地址绑定:
<example>
BindAddress 127.0.0.1
</example>

<p>然后通过 <tt>/etc/init.d/apache restart</tt> 重启 Apache, 您会发现它只监听回送接口.

<p>无论如何, 如果您并不使用 Apache 提供的全部功能, 您可以考虑一下 Debian 中提供的其它 web 服务器, 如<package>dhttpd</package>.


<p><url name="Apache 文档"
id="http://httpd.apache.org/docs/misc/security_tips.html">提供了有关 Apache web 服务器的许多安全措施的信息
(在 Debian 的 <package>apache-doc</package> 包中提供了同样的文档). 
<!--<url name="InterSect Alliance" 
id="http://www.intersectalliance.com/">提供的<url name="Apache 安全配置文档" 
id="http://www.intersectalliance.com/projects/ApacheConfig/index.html">也同样非常有用.-->

<p><ref id="chroot-apache-env"> 提供了更多的有关设置 chroot jail 以对 Apache 实现更多限制的信息.

<sect1>禁止用户发布 web 内容

<p>在 Debian 中缺省的 Apache 安装允许用户在 <file>$HOME/public_html</file> 目录下发布 web 内容. 
此内容可以远程通过形如 http://your_apache_server/~user 的 URL 检索到.

<p>如果您不想使用此项功能, 则必须修改配置文件
<file>/etc/apache/http.conf</file> 注释掉以下内容:

<example>
LoadModule userdir_module /usr/lib/apache/1.3/mod_userdir.so
</example>

但是如果模块是静态连接(运行 <tt>apache -l</tt> 来检测 ), 则您必须增加如下内容:

<example>
Userdir disabled
</example>

<p>注: <tt>disabled</tt> 关键字功能在 Apache 1.3 以后才有. 如果您使用了一个老版本的 Apache, 
则需要修改配置文件, 加入如下内容:

<!-- This can be removed since woody provides Apache 1.3 -->

<example>
&lt;Directory /home/*/public_html&gt;
    AllowOverride None
    Order deny,allow
    Deny from all
&lt;/Directory&gt;
</example> 

<p>攻击者仍然可以使用用户枚举, 因为 web 服务器的回答是 <em>403 访问拒绝</em>, 而不是 <em>404 网页不存在</em>.

<sect1>日志文件权限

<p>Apache 日志文件从 1.3.22-1 开始, 其拥有者是 'root' 用户和组 'adm', 权限为640, 
这允许 rotation 后对其进行修改. 这意味着入侵者通过 web 服务器访问系统, 不能(未做权限提升)删除旧的日志文件记录.

<!-- FIXME: what do you mean with "this permissions are changed after -->
<!-- rotation -->

<sect1>发布 web 文件

<p>Apache 的文件位于 <file>/var/www</file> 目录下. 安装完成后, 
缺省的文件提供一些关于系统的信息(主要是在一个 Debian 系统运行的 Apache). 
缺省 web 页面默认属于 root 用户和 root 组. 同时 Apache 进程以 www-data 用户和 www-data 组身份运行. 
这样应该可以减轻通过网络服务器摧毁站点的攻击者对系统的损害程度. 
当然, 您应当用自己的网页替换默认页面(或许它提供了您不想对外公布的信息).


<p>


<sect>增强 finger 的安全性
<p>如果您想要运行finger服务, 首先考虑一下这是不是必须的. 检查一下, 您会发现 Debian 提供了很多 finger 守护进程
(主要源自 <prgn>apt-cache search fingerd</prgn> 的输出): 
<list>
<item>cfingerd - 可配置的 finger 守护进程
<item>efingerd - unix 下的另一个 finger守护进程, 对输出做了优化.
<item>ffingerd - 一个安全的 finger 守护进程
<item>fingerd - 远程用户信息服务器.
<item>BSD-like 带有 qmail 支持的 finger 守护进程.
</list>
<p>如果您打算将 finger 守护进程用于公共服务, 推荐使用 <package>ffingerd</package>. 
无论如何, 当您通过 inetd, xinetd 或 tcpserver 配置它时, 建议您: 限制同时运行进程数, 
限制指定主机(使用 tcp wrappers)对 finger 守护进程的访问, 使它只监听您需要的接口.


<!--
# This is quite personal, IMHO, since this is due to the fact that 
# root privileges are dropped on startup. I prefer an attacker to erase
# a service's log files than to erase all of my system's logs. Anyhow, this
# can be improved by changing user permissions after rotation.
-->



<sect id="chroot">常用 chroot 和 suid

<p><prgn>chroot</prgn> 是一个最强大的限制守护进程或用户或其它服务的工具. 
设想一下, 在您的目标附近设置屏障, 使目标无法逃脱(通常, 在许多条件下, 仍然允许逃逸). 
如果您对某个用户和服务并不信任, 您可以为其建立一个 root 交换环境.  
当您需要拷贝所有的可执行文件和库到屏障中去时, 需要使用一些磁盘空间. 
这样即使用户进行了恶意破坏, 其损害范围也被限制在屏障中.

<!-- Consider removing this:
<p>A good example for this case is, if you do not authenticate against
<file>/etc/passwd</file> but use LDAP or MySQL instead. So your
ftp-daemon only needs a binary and perhaps a few libraries. A 
<prgn>chroot</prgn>ed environment would be an excellent security improvement; 
if a new exploit is found for this ftp-daemon, then attackers can only exploit
the UID of the ftp-daemon-user and nothing else. 
-->

<p>许多服务作为守护进程运行, 就受益于这样的设置. 您使用的 Debian 发行版所安装的守护进程不尽相同, 
然而, chrooted <footnote> 它试图让它们在 <em>minimum priviledge</em> 下运行, 这包括使用它们的用户而不是root 用户运行守护进程
</footnote> 必然是缺省安装.</p>

<p>这包括: 名称服务器(譬如 <prgn>bind</prgn>)，web 服务器(譬如 <prgn>apache</prgn>)，
邮件服务器(譬如 <prgn>sendmail</prgn>)以及 ftp 服务器(譬如 <prgn>wu-ftpd</prgn>). 
近年来通常认为 BIND 的复杂性在于其暴露在攻击之下(参见 <ref id="sec-bind">).

<p>但是, Debian 确实提供了一些用于设置 <prgn>chroot</prgn> 环境的软件, 参阅
 <ref id="auto-chroot">.


<p>无论如何, 如果您在您的系统上运行一项服务, 都需要尽可能的保证其安全性, 
这包括取消其 root 权限, 在限制的环境下运行(如 chroot jail)或者用更安全的方法.</p>

<p>但是, 应当注意的是, 以root用户运行的 <prgn>chroot</prgn> jail 是有可能被破坏的.
因此, 应当确保服务以非特权用户运行. 通过限制其环境, 您可以限制服务可访问文件的读/执行权限, 
因此您也就限制了利用本地系统的漏洞提升权限的可能性. 即使如此您也无法确保一个聪明的攻击者以某种方法突破 chroot jail.
只有使用公认的安全性好的服务器, 才是增加安全性的很好的手段. 即使一个很小的漏洞, 如开放文件句柄, 
也可能被熟练的攻击者利用来攻破系统. 最后, <prgn>chroot</prgn> 并不是设计作为一个安全工具, 而是一个测试工具.</p>

<sect1 id="auto-chroot">自动配置 chroot 环境

<p>有几个程序可以完成 chroot 服务器和服务的自动配置. 
Debian(2002年3月)当前在 <prgn>chrootuid</prgn> 软件包中提供的是 
Wietse Venema 的 <package>compartment</package> 和 <package>makejail</package>
以及 <prgn>chrootuid</prgn>. 这些程序可以用来设定任何可执行程序的限制环境
(即使一个限制用户也可以运行 <prgn>chrootuid</prgn>). 

<p>使用这些工具可以很容易的设置 chroot 环境. 例如 <prgn>makejail</prgn> 程序, 
可以使用很小的一个配置文件创建和更新一个 chroot jail (它提供了<prgn>bind</prgn>, <prgn>apache</prgn>,
<prgn>postgresql</prgn> 和 <prgn>mysql</prgn> 的示例配置文件). 
它试图猜测并在屏障中装入守护进程<prgn>strace</prgn>, <prgn>stat</prgn> 所需的所有文件, 
以及 Debian 的依赖包. 更多信息参见: <url
id="http://www.floc.net/makejail/">. <prgn>Jailer</prgn> 是一个<url
id="http://www.balabit.hu/downloads/jailer/"> 提供的一个小工具, 同时也能找到  Debian GNU 包.

 
<!--
<p><package>deb.pl</package> 对于创建 chroot(或jail)也很有用, 这是一个用于分析依赖文件的脚本 .
-->
<sect>明文密码
<p>
您应当设法避免在网络中象 FTP/Telnet/NIS/RPC 一样接收和发送明文密码. 
作者建议大家使用 ssh 代替 telnet 和 ftp.

<p>记住, 从 telnet 转到 ssh, 但是仍然使用其它的明文协议并不能为您增加任何安全性!
最好的办法是删除 ftp, telnet, pop, imap, http, 而是用他们各自的使用加密的服务. 
您可以考虑将它们删除, 而使用它们的 SSL 版本, ftp-ssl, telnet-ssl,
pop-ssl, https ...

<p>以上的大多数提示适用于每个 unix 系统(您会在阅读其它的 Linux 和类 Unix 的安全文档时发现您会发现这些提示).

<sect>禁用 NIS 

<p>如有可能尽量不要使用 NIS, 网络信息服务, 因为它允许密码分享. 
如果您的对应设置遭到破坏, 这将是非常危险的.

<p>如果需要在不同的机器之间使用密码共享, 您也许需要考虑其它的选择. 
例如, 您可以配置一个 LDAP 服务器, 并在您的系统上配置 PAM, 用于连接 LDAP 服务器进行用户身份认证. 
在 <url
name="LDAP-HOWTO" id="http://www.tldp.org/HOWTO/LDAP-HOWTO.html">
(<file>/usr/share/doc/HOWTO/en-txt/LDAP-HOWTO.txt.gz</file>) 中您可以找到详细的配置.

<p>更多 NIS 安全方面的内容参见<url
name="NIS-HOWTO" id="http://www.tldp.org/HOWTO/NIS-HOWTO.html">
(<file>/usr/share/doc/HOWTO/en-txt/NIS-HOWTO.txt.gz</file>).


<p>FIXME (jfs): 增加有关在 Debian中如何做相应设置的内容.

<sect id="rpc">增强 RPC 服务的安全性

<p>当不需要 RPC 服务时, 您应当将其禁用.

<p>远程过程调用(RPC)是程序用来请求位于其它计算机上的服务的协议. 
<prgn>portmap</prgn> 服务是通过将 RPC 程序号映射到 DARPA 端口号来控制 RPC 服务的; 如果要调用 RPC 就必须运行它.

<p>基于 RPC 的服务在安全漏洞方面有个很坏的记录, 尽管 portmapper 本身没有(但仍为远程攻击者提供了信息). 注意一些DDoS(分布式拒绝服务)攻击就是利用 RPC 以客户端/处理者的身份进入系统的.


<p>如果您使用基于 RPC 的服务, 则只需要 RPC. 常见的基于 RPC 的服务有 NFS(Network File System)
和 NIS(Network Information System). 有关 NIS 的信息参阅前面的章节. 依赖  <package>fam</package> 
软件包的 File Alteration Monitor (FAM) 同样是一个 RPC 服务, 因此也依赖于 <package>portmap</package>.

<p>另一方面, NFS 服务在某些网络中又非常重要, 因此您需要在安全性和可用性之见寻找平衡.
更多 NIS 安全方面的信息, 参见 <url
name="NFS-HOWTO" id="http://www.tldp.org/HOWTO/NFS-HOWTO.html">
(<file>/usr/share/doc/HOWTO/en-txt/NFS-HOWTO.txt.gz</file>).

<sect1>完全禁用 RPC 服务

<p>禁用 portmap 相当简单. 有几种方法可以做到. 在 Debian 3.0 系统和以后版本中
最简单的办法就是不安装 <package>portmap</package> 软件包, 如果您使用的
是其它版本则可以参照 <ref
id="disableserv"> 的操作, 这源于程序是作为 <package>net-base</package>
包存在的(在不破坏系统的前提下无法将其删除).

<p>这实际上是删除在 <tt>/etc/rc${runlevel}.d/</tt> 下的每个与 portmap 相关的符号连接, 
其中一些需要您手动删除. 另一种可行的方法是 <tt>chmod 644
/etc/init.d/portmap</tt>, 但是这在启动时会抛出错误信息. 您也可以在 <file>/etc/init.d/portmap</file> 
脚本中剔除 <tt>start-stop-daemon</tt> 部分.

<sect1>限制对 RPC 服务的访问
  	 
<p>很不幸, 某些情况下从系统中删除 RPC 服务是不可能的. 一些本地桌面服务(特别是 SGI 的 <package>fam</package>)是基于 RPCU的, 因此需要本地 portmapper. 这就意味着某些情况下, 用户安装桌面环境(例如 GNOME)就需要安装 portmapper. 

<p>有几种限制访问 portmapper 和 RPC 服务的方法:

 	 <list>
  	 <item>使用本地防火墙(参阅 <ref id="firewall-setup">)阻止对这些服务使用端口的访问.
  	 <item>使用  tcp wrappers 阻止对这些服务的访问, 因为 portmapper(和一些 RPC 服务)编译时要用到
  	 <file>libwrap</file> (参阅 <ref id="tcpwrappers">). 这就意味着您可以通过 tcp wrappers 配置 
	的 <file>hosts.allow</file> 和 <file>hosts.deny</file> 来阻止对它们的访问.
  	 <item>从 5-5 版开始,  <package>portmap</package> 软件包就可配置为只监听回送接口. 可以通过修改
	 <file>/etc/default/portmap</file>, 去掉以下行的注释:
  	 <tt>#OPTIONS="-i 127.0.0.1"</tt> 然后重启 portmapper 来完成. 这样就可以在允许本地 RPC 
	服务工作的同时, 阻止远程系统对它们的访问(参阅, <ref id="limit-bindaddr">.
  	 </list>

<sect id="firewall-setup">增加防火墙

<p>Debian GNU/Linux 操作系统拥有 Linux 内核提供的此内置功能. 
这就意味着如果你安装是一个 potato(Debian 2.2 ) 系统(缺省内核是2.2)
你就已经拥有了内核中的 <prgn>ipchains</prgn> 防火墙, 前提是您安装了 <package>ipchains</package> 软件包, 
因为优先级的缘故, 它应该是已经被安装了. 如果你安装的是 woody(Debian 3.0)系统(缺省内核是2.4), 
您将拥有 <prgn>iptables</prgn>(netfilter)防火墙. <prgn>ipchains</prgn> 和 <prgn>iptables</prgn>
之间主要的差别是后者基于安全的小包检测, 这将提供更加安全(并更加容易构建)的过滤配置.

<sect1>为本地系统构建放火墙

<p>您可以使用防火墙规则来完成本地系统访问的安全化, 甚至可以用它来限制对外部的通讯. 
防火墙规则还可以用于保护那些没有正确配置,  <em>不能</em>对某一网络, IP地址等等提供服务的进程..

<p>然而, 本手册中, 此方法的提出, 主要是因为其保护一个系统并不<em>仅仅</em>是基于防火墙的性能, 
一个系统的安全源于多个层面, 一旦所有的服务完成安全化设置, 防火墙应该是最后一层. 
您应该很容易的设想, 如果一个系统的保护仅仅基于一个内置防火墙, 一旦管理员不管出于什么原因, 
删除了防火墙规则(可能因为设置, 喜好, 人为错误), 如果在此系统中没有其它保护措施的话, 这个系统将完全对攻击者敞开.

<p>另一方面, 本地系统拥有防火墙规则还能防止其它一些破坏性事情发生. 
即使提供的服务做了安全化配置, 一个防火墙也能为错误的配置或者新安装的
还未来得及配置的服务提供保护, 并且一个紧凑的配置, 除非防火墙的代码被删除, 将会防止木马侵害. 
注意, 入侵者并不一定要超级用户权限才能控制装有木马的系统(因为对于绑定端口, 
如果它不是私有端口, 并且没有被禁用, 这将是允许的.

<p>因而，一个合适的防火墙设置应该带有默认的拒绝策略,即:

<list>

<item>只允许许可的机器访问本地许可的服务.

<item>只允许通过您的系统访问外部服务(DNS, web browsing, pop, email....)  
<footnote>与其他系统的个人防火墙不同, Debian 
GNU/Linux (仍然)没有提供防火墙生产接口用于定制限制每个进程和用户的规则, 然而, iptables 代码可用于完成这一任务(参阅 <manref name="iptables" section="8"> 联机手册)</footnote>

<item>forward 规则设为拒绝(除非您有其它系统的保护, 参阅下边).

<item>其它的连入连出都是禁止的.

</list>

<sect1>使用防火墙保护其它系统

<p>安装带有防火墙规则的 Debian 防火墙还以用来保护对于其<em>后边</em>的系统的访问, 
限制其暴露于 Internet. 防火墙可以配置用于阻止外部系统对本地非公开服务(端口)的访问. 
例如, 对于一个邮件服务器, 只有端口25(提供邮件服务)需要提供外部访问. 
即使是包括公共服务的其它服务, 放火墙也可配置来接收传送给它的数据包(这就是众所周知的 <em>filtering</em>).

<p>您甚至可以将一台 Debian GNU/Linux 机器设置为网桥防火墙. 
即, 对于网络来说完全透明的过滤防火墙, 因为其缺少IP地址, 无法对其直接攻击. 
根据安装的内核, 当配置内核和一个新的网络<em>过滤器</em>选项时, 
您可能需要安装网桥防火墙补丁以支持<em>802.1d以太网桥</em>, 
具体的网桥防火墙设置参阅<ref id="bridge-fw">.

<sect1>配置防火墙

<p>当然, 放火墙的配置和其依赖的系统和网络有关. 系统管理员在着手配置以前, 
必须知道其要连入的网络和要保护的系统, 需要被访问的服务, 是否有其它网络
(如 NAT 和路由)也要需要考虑. 在配置防火墙时要小心谨慎, 就如 
Laurence J. Lane 在<package>iptables</package>软件包中所讲:

<p><em>工具很容易被误用, 可能导致一个不健全的网络对于一个电脑系统的不正常的访问. 
一个远程系统管理员将被屏蔽在数百或数千英里之外的系统之外并不罕见. 
甚至有可能将自己屏蔽在自己身边的系统之外. 请谨慎使用.</em>

<p>记住: 仅仅安装 <package>iptables</package>(或者旧版的防火墙代码)并不能给您任何保护, 
只不过是提供了一个软件. 要想拥有一个防火墙, 您就必须<em>配置</em>它!

<p>如果您对防火墙了解不多, 你可以参阅 <package>doc-linux-text</package> 
软件包(其它格式的文档也有提供)中提供的 Firewalling-HOWTO . 更多要点,参见 
<ref id="references">.

<sect2>以 Debian 的方式 

<p>如果您使用的是 Debian 3.0, 请注意, 系统中已经安装了 <package>iptables</package> 
软件包. 2.4.4 以上内核 netfilter 都提供了支持. 因为刚刚完成安装, 
系统并不<em>知道</em>任何防火墙规则(防火墙规则和具体的系统有关), 
您必须起用iptables. 然而，系统提供了配置好了的脚本以便管理员设定防火墙规则, 
然后仿照它生成初始化脚本, 并用它设定防火墙. 

<p>为此, 您必须:

<list>

<item>配置软件随系统启动. 新的版本(从1.2.6.a-1开始)安装时会做寻问. 
以后您可以使用 <tt>dpkg-reconfigure -plow iptables</tt> 重新配置. <em>注</em>: 
老的版本通过编辑 <file>/etc/default/iptables</file> 设置变量 <tt>enable_iptables_initd</tt> 
为 <em>true</em> 来完成.

<item>使用 iptables 创建防火墙设置, 您可以使用命令行(参见<manref name="iptables" section="8">)
或者使用Debian防火墙软件包(参见<ref
id="firewall-pack">)提供的一些工具. 您需要创建一套防火墙规则在防火墙处于<em>激活</em>状态时使用, 
另一套在防火墙<em>非激活</em>状态下使用(可能是空规则).

<item>将您创建的规则保存到 <tt>/etc/init.d/iptables
save_active</tt> 和 <tt>/etc/init.d/iptables save_inactive</tt> 中
以备使用.

</list>

<p>一旦您将防火墙设置保存到了 <file>/var/lib/iptables/</file> 目录下, 
在系统启动时(或者使用 <em>start</em> 和 <em>stop</em> 参数运行 initd 脚本时)将被执行.
请注意缺省的 Debian 设置在多用户级别(2到5)启动防火墙. 并且, 其在单用户级别(1)是停止的, 
这如果和您的安全策略不匹配,可以进行修改.

<p>如果你对于如何手动设定防火墙没有什么概念, 可以参照 <package>iptables</package> 
在<file>/usr/share/doc/iptables/html/</file>下提供的<em>Packet Filtering HOWTO</em> 
and <em>NAT HOWTO</em>. 并且, 
配置文件 <file>/etc/default/iptables</file> 提供了更多的关于这个软件包的信息.

<sect2 id="firewall-pack">使用防火墙软件包

<p>手工设定防火墙对于一个管理员新手(有时甚至是专家)可能有点复杂. 然而, 
自由软件社区开发了很多可以用来轻松设置本地防火墙的工具. 警告: 
其中某些工具仅用于本地(即所谓的<em>个人防火墙</em>)安全保护设置. 
而另一些则更具多样性, 可用于复杂规则配置用于保护整个网络.

<p>Debian 系统中可用于设定防火墙规则的一些软件:

<list>
<item><package>firestarter</package>, 适用于最终用户, 其包括一个向导, 可以快速定义一个防火墙规则.
<item><package>knetfilter</package>
<item><package>fwbuilder</package>, 提供图形界面, 包括复杂的策略, 可用于包括 iptables 在内的各种防火墙平台,
和路由访问列表. 所有的 fwbuilder 的功能都可以通过命令行获取.
<item><package>shorewall</package> 提供了IPsec支持, 流量控制支持, 防火墙规则定义.
<item><package>mason</package>, 可根据您的系统"可见"的网络流量生成防火墙规则.
<item><package>bastille</package> (在安全化步骤中, 可以使用新版本的 bastitle, 以添加防火墙规则在系统启动是运行)
<item><package>guarddog</package>, 一个基于 KDE 防火墙配置软件包(可用于替代 knetfilter 软件包)
<item><package>ferm</package>
<item><package>fwctl</package>
<item><package>easyfw</package>
<item><package>firewall-easy</package>
<item><package>ipac-ng</package>
<item><package>gfcc</package>
<item><package>lokkit</package> 或 <package>gnome-lokkit</package>
</list>

<p>后边的这些软件包:  gfcc,firestarter 或 knetfilter 提供使用 GNOME(前两个)或 KDE(最后一个)的管理用户图形界面, 
与列表中的其它可能更面向管理员的软件包相比, 其更加面向用户(即, 最终用户).

<p>事先警告, 一些软件包在概述部分通常介绍防火墙脚本会在系统启动时运行, 
这无容置疑会和通常的配置(如果配置了的话)相冲突, 可能出现无法预料的后果. 
通常, 防火墙脚本是您配置的系统最后一个运行的脚本(这也许不是您所希望的). 
参考软件包的文档, 并使用其中一个设置. 通常, 其它程序可以帮助您配置防火墙脚本的程序是一个不错的办法.

<p>FIXME: 增加更多有关这些软件包的信息

<p>FIXME: 检查有关 Debian 防火墙的信息, 以及和其它发行版相比做了何种修改.

<p>FIXME: 在什么地方启用常用的防火墙代码 (有关 debian 防火墙的常见问题解答?)

<p>FIXME: 增加有关 Debian 中 <url
id="http://www.balabit.hu/downloads/zorp/debian/" name="Zorp"> 的信息
(参阅 <url id="http://bugs.debian.org/88347" name="Bug
#88347">). 提供了 Debian 软件包, 但是其基于 Debian 发行版中尚未提供的libqlib1.3.
