
<chapt>常见问题解答 (FAQ)

<p>本章介绍源自 Debian 安全邮件列表中的一些常见问题, 
当您准备发送邮件, 甚至别人告诉您去 RTFM 时, 您可以阅读它们.

<sect>Debian 操作系统的安全

<sect1>Debian 比 X 更安全吗?

<p>一个系统只会和其管理员设置的一样安全. Debian 中服务的默认安装是<em>安全</em>的, 
但是可能不象有些偏执的操作系统那样其安装的服务<em>默认是被禁用的</em>. 
无论如何, 系统管理员都需要根据本地安全策略来配置系统的安全.

<p><url id="http://securityfocus.com/vulns/stats.shtml"> 处搜集了很多操作系统安全漏洞的相关数据. 
这些数据有用吗? 当解释数据时, 站点列举了一些应当考虑的事实和警告, 不同操作系统间的漏洞数据无法相互比较.
<footnote>例如, 基于安全视点(Securityfocus)的数据, 可能看上去 Windows NT 比 Linux 更安全, 这只是观点的问题. 毕竟, Linux 通常提供的工具要比 Microsoft 的 Windows NT要多的多. <em>漏洞的数量</em>问题在 David A. Wheeler 的 
<url id="http://www.dwheeler.com/oss_fs_why.html#security" 
name="为什么 开放软件源代码 / 自由软件(OSS/FS)? 看这些数字!">
中有更详细的描述.</footnote> 并且记住一些关于 Debian 的 Bugtraq 漏洞只适用于 <em>unstable</em> 分支.

<sect2>Debian 比其它发行版安全吗(譬如 RedHat, SuSE...)?

<p>各个 Linux 发行版之间除了基本安装和包管理系统外并没有多少实质性的差别. 
多数发行版共享许多相同的程序, 主要的不同是在其稳定版中的引入软件版本的不同. 
例如, 内核, Bind, Apache, OpenSSH, XFree, gcc, zlib, 等等, 在所有的 Linux 发行版中都有.

<p>例如，RedHat 不幸的在 foo 当前版本是 1.2.3 时将其引入, 
这个版本最近发现了一个安全漏洞. 另一方面, Debian 幸运的引入的是修复了这个错误的 foo 1.2.4. 
几年前的 rpc.statd 问题就是这种情况. 

<p>在主 Linux 发行版的应急安全小组之间有着很多合作. 著名的安全更新是很少的, 
如果有的话, 一般是由开发者来完成. 安全漏洞的信息从未向其它发行版的供应商保留, 
修补通常是同上游协同完成, 或者是同 <url id="http://cert.org" name="CERT">. 
结果, 必要的安全更新通常在同一时间发布, 并且不同发行版之间的安全更新基本相同.

<p>Debian 在安全方面主要的优势在于系统通过 <prgn>apt</prgn> 完成升级非常简单. 
Debian 在安全方面还有以下方面值得考虑:

<list>

<item>Debian 比其它发行版提供更多的安全工具, 参见 <ref id="sec-tools">.

<item>Debian 的标准安装相对较小(功能较少), 因此更安全. 
从实用性上考虑, 其它发行版倾向于默认安装更多的服务, 
并且有时配置并不合理(记住<url id="http://www.sans.org/y2k/lion.htm" name="Ramen 或 Lion
worms">). Debian 的安装并不象 OpenBSD 那样受限(缺省守护进程是未被激活的), 
但这是一个很好的折中方案.

<footnote>不可否认, 一些发行版, 如 RedHat 或 Mandrake, 在它们的标准安全中也考虑了安全问题, 允许用户选择 <em>security
profiles</em>, 和使用向导帮助用户配置 <em>个人防火墙</em>.</footnote>

<item>提供了最佳的安全实践文档, 就象本篇.

</list>

<sect1>在 Bugtraq 中有很多 Debian bug. 这是否意味着它很脆弱吗?

<p>Debian 发行版号称拥有最多的软件包, 可能比任何一个操纵系统都多. 
安装的软件包越多, 潜在的安全问题就越大.

<p>越来越多的人测试原代码的缺陷. 在 Debian 中许多公告与主要软件组件的源码审计有关. 
每当诸如此类的源码审计出现漏洞, 它们将会被修复, 并向如 Bugtraq 的列表发送一个公告.

<p>通常在 Debian 中发现的 bug 同样会影响到其它发行版和开发商. 检查每个公告 (DSA) 顶端的 "Debian specific:
yes/no" 部分.

<sect1>Debian 有与安全相关的证书吗?

<p>简短的回答: 没有. 

<p>详细的回答: 证书需要花钱(特别是<em>重要</em>的安全认证), 但没有人出资来验证 Debian GNU/Linux 对应于某个等级, 
例如
<!-- NOTE: commoncriteria.org is no longer available, jfs -->
<url id="http://niap.nist.gov/cc-scheme/st/" name="Common Criteria">. 如果您对拥有一个获取证书的 GNU/Linux 发行版感兴趣, 
请提供完成认证的必需的资金.

<p>当前至少有两个对应不同的<url id="http://en.wikipedia.org/wiki/Evaluation_Assurance_Level" name="EAL">级别的发行版认证. 注意一些 CC 测试已经被整合到 <url id="http://ltp.sourceforge.net" name="Linux Testing Project">, 其可以从 Debian 的 <package>ltp</package> 软件包中找到.
 	 

<sect1>有针对 Debian 的安全化程序吗?

<p>是的. <url name="Bastille Linux"
id="http://www.bastille-unix.org">, 最初是针对其它发行版(RedHat 和 Mandrake)的，
现在用于 Debian. 将对上游版本的修改集成到了 Debian 软件包中, 命名为 <package>bastille</package>.

<p>但是, 有些人认为一个安全设置工具并不能满足一个好的管理员的需求.

<sect1>我想要运行 XYZ 服务, 应当选择哪个?

<p>Debian 的一个强大之处在于对于相同功能( DNS 服务器, 邮件服务器, ftp服务器, web 服务器, 等等)
有很多软件包可供选择. 对于新管理员确定哪个软件包更适合来说很容易被搞糊涂. 
对于给定条件的最好的选择是基于您的特点与安全需求之间的平衡. 当您在相似的软件包之间作选择时, 
应当问自己这么几个问题:

<list>

<item>上游仍在维护这个软件吗? 什么时候发行的最新版?

<item>软件包成熟吗? 版本号并<em>不能</em>告诉您它的成熟度. 设法查看软件的开发历史.

<item>软件 bug-ridden 吗? 有与其相关的安全公告吗?

<item>软件是否提供您所需要的所有功能? 是否多于您的真正需求?

</list>

<sect1>在 Debian 中如何使 XYZ 服务更安全?
<!-- Changed to XYZ in order to avoid confusion :) jfs -->

<p>在本文档中您会找到一些在 Debian GNU/Linux 中使一些服务(FTP,Bind)更安全的方法. 
这里所没有提供的, 您可以查看程序的文档, 或常用的 Linux 信息. 大多数的用于 Unix 系统的安全指南同样适用于 Debian. 
很多情况下, Debian 中服务 X 的安全设置于在其它 Linu x发行版相同行(或 Un*x ，就此而言).

<sect1>如何删除服务的所有标语?

<p>例如, 如果您不希望用户连接到您的 POP3 进程, 并检索您系统的信息, 
您或许想删除(或修改)服务所显示给用户的标语.<footnote>注意, 这是'含糊的安全性', 从长远的观点来说可能没有什么用.</footnote>所用方法与您运行的指定服务的软件有关. 
例如 <prgn>postfix</prgn>, 你可以在 <file>/etc/postfix/main.cf</file> 中设置 SMTP 标语: 
<example> 
  smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU) 
</example>

<p>其它软件并不象这样容易修改. 如果要修改 <package>OpenSSH</package> 的显示版本则需要重新编译. 
注意不要删除标语的第一部分(<tt>SSH-2.0</tt>). 客户端用它来确认您的软件包所支持的协议版本.

<sect1>所有的 Debian 软件包都安全吗?

<p>Debian 安全小组不可能分析 Debian 中所有的软件包的潜在漏洞, 
因为没有足够的资金用于整个项目的源代码的安全审计. 但是, 
Debian 可受益于上游开发者.

<!-- FIXME kernel-audit doesn't exist on sourceforge:
或其他项目如 <url name="Linux
Kernel Security Audit Project"
id="http://kernel-audit.sourceforge.net/"> 或 <url name="Linux
Security-Audit Project" id="http://www.lsap.org/"> 的代码审计.
-->

<p>实际上，Debian 开发者可能发布一个含有木马的软件包, 并且无法将其检查出来. 
即使将其引入 Debian 的一个分支, 也不可能报告出木马可能运行的所有可能的状况. 
这就是为什么 Debian 含有<em>"无保证"</em>条件许可的原因.

<p>但是，Debian 用户事实上应当对有广泛用户的稳定版本有足够的信心, 
其多数问题可以通过使用被发现. 对于一个重要的系统并不推荐安装未经测试的软件(如果无法提供必要的代码审计). 
无论如何, 如果含有安全漏洞的软件被引入发行版, 通过包含软件包确认的使用过程, 
这种问题最终可能将追踪到开发者. Debian 项目不轻易采取了这种方法.

<sect1>为什么一些日志文件/配置文件设为完全可读(world-readable), 这样不是不安全吗?

<p>当然，您可以修改系统的缺省 Debian 许可. 当前关于日志文件和配置文件的策略是完全可读(world readable), 
<em>除非</em>它们提供的是高度机密的信息.

<p>如果您作修改,那么就要小心:

<list>

<item>进程也许不能写入日志, 如果您限制了它们的权限.

<item>一些软件可能不能工作了, 如果它们依靠的配置文件不可读. 
例如, 如果您移除了 <file>/etc/samba/smb.conf</file> 的完全可读权限, 
普通用户将无法运行 <prgn>smbclient</prgn> 程序.

</list>

<p>FIXME: 检查策略里的写权限部分. 一些软件包(即, ftp 守护进程)似乎强制执行不同的权限.

<sect1>为什么 /root/(或 UserX)的权限是755?

<p>实际上，其他用户存在同样的问题. 因为 Debian 的安装不在这个目录下放置<em>任何</em>文件, 
那里没有任何需要保护的机密信息. 对于您的系统来说, 如果您觉得权限过于宽松, 可以考虑设为750. 
对于其他用户,参阅 <ref id="limit-user-perm">.

<p> Debian 安全邮件列表 <url
id="http://lists.debian.org/debian-devel/2000/debian-devel-200011/msg00783.html"
name= "thread"> 涉及许多这方面的问题.

<sect1>在安装 grsec/防火墙后，我开始接收到许多控制信息! 怎么删除他们?

<p>如果您正在接受控制台信息, 并已经配置了 <file>/etc/syslog.conf</file> 
将日志信息转向其他文件或指定 TTY, 那么您可能会看到直接发送到控制台的信息.

<p>任何一个内核的缺省控制台日志级别都为 7, 这意味着任何低优先级信息都会出现在控制台. 
通常, 防火墙(日志规则)和一些其它的安全工具的日志优先级较低, 因此, 会被直接发送到控制台.

<p>您可以使用 <prgn>dmesg</prgn>(<tt>-n</tt> 选项,参阅 <manref section="8"
name="dmesg">), 以减少控制台信息, 其检测和<em>控制</em>内核的 ring buffer. 
可以通过修改 <file>/etc/init.d/klogd</file> 在下次重起后对其产生修改, 由:

<example>
  KLOGD=""
</example>

<p>改为:

<example>
  KLOGD="-c 4"
</example>

<p>如果仍然出现, 为 <tt>-c</tt> 设置更小的数字. 
在 <file>/usr/include/sys/syslog.h</file> 中可以找到关于不同日志级别的描述:

<example>
  #define LOG_EMERG       0       /* system is unusable */
  #define LOG_ALERT       1       /* action must be taken immediately */
  #define LOG_CRIT        2       /* critical conditions */
  #define LOG_ERR         3       /* error conditions */
  #define LOG_WARNING     4       /* warning conditions */
  #define LOG_NOTICE      5       /* normal but significant condition */
  #define LOG_INFO        6       /* informational */
  #define LOG_DEBUG       7       /* debug-level messages */
</example>

<sect1>操作系统的用户与组

<sect2>所有系统用户都是必需的吗?

<p>是也不是. Debian 使用预定义用户(如 <url name="Debian 策略"
id="http://www.debian.org/doc/debian-policy/"> or
<file>/usr/share/doc/base-passwd/README</file>中所述,用户id(UID) &lt; 99)
以缓和安装某些服务时, 需要适当的 user/UID 的需求. 如果您不打算安装新的服务, 
您可以将您系统中没拥有任何文件和运行任何服务的用户安全的删除. 
无论如何, Debian 预留从0到99的 UID, 从100到999的 UID 由安装的软件包创建(当软件包被清除时也会被删除).

<p>执行下面的命令(以 root 运行, 因为普通用户没有足够的权限遍历敏感目录)
可以很容易的找到不拥有任何文件的用户:

<!-- Took the liberty to make this script more secure ... >:^) // era -->
<example>
  cut -f 1 -d : /etc/passwd | \
  while read i; do find / -user "$i" | grep -q . && echo "$i"; done
</example>

<p>这些用户由 <package>base-passwd</package> 提供. 
更多有关 Debian 中如何处理用户的信息参阅相关文档. 下边是默认用户(带有一个对应组)的列表:

<list>

<item>root: Root 是(典型的) 超级用户.

<item>daemon: 一些非特权守护进程运行时需要象 daemon.daemon
(如, <prgn>portmap</prgn>, <prgn>atd</prgn>, 或许还有其它)一样对磁盘文件进行写操作. 
守护进程以 nobody.nogroup 运行时不需要拥有任何文件. 更复杂或更安全的守护进程以指定用户运行. 
daemon 用户也可用于本地安装 daemon.

<item>bin: 因为历史的原因被保留下来.

<item>sys: 同 bin. 但是，sys 组拥有 /dev/vcs* 和 <file>/var/spool/cups</file>.

<item>sync: 用户 sync 的 shell 是 <file>/bin/sync</file>. 
因而，如果它的密码被设置对容易事猜测(譬如 "" ) ，任何人都可以通过控制台 sync 系统. 既使他们没有帐户.

<item>games: 许多游戏被 SETGID 为 games, 这样就可以对它们的高分值文件进行写操作. 这是策略里边的解释.

<item>man: 程序(有时)以用户 man 运行, 这样可以将 cat 的页面写入 <file>/var/cache/man</file>.

<item>lp: 由打印机守护进程使用.

<item>mail: <file>/var/mail</file> 目录下的信箱由 mail 组拥有, 这是策略中的解释. 
用户和组同时也被其它各种各样的 MTA 使用.

<item>news: 各种各样的新闻服务器以及其它相关的程序(譬如 <prgn>suck</prgn>)以各种各样的方式使用 news 用户和组. 
在 news spool 中的文件通常为 news 用户和组拥有. 用于投递新闻的程序,如 inews 就是典型的 SETGID news.

<item>uucp: uucp 用户和组由 UUCP 子系统使用. 其拥有 spool 和配置文件. 属于 uucp 组的用户,可以运行 uucico.

<item>proxy: 如 daemon, 此用户和组由一些没有指定用户id, 
但是需要拥有文件的守护进程(具体的, proxy 守护进程)使用. 例如, proxy 组由 <prgn>pdnsd</prgn> 使用, 
<prgn>squid</prgn> 以proxy用户运行.

<item>majordom: 在Debian系统中, 因为历史的原因, <prgn>Majordomo</prgn> 有一个静态分配的 UID. 新的系统中没有. 

<item>postgres: <prgn>Postgresql</prgn> 数据库由这个用户和组拥有. 因为安全的原因, 
目录 <file>/var/lib/postgresql</file> 下的所有文件由此用户拥有.

<item>www-data: 一些 web 服务器以 www-data 运行. www-data 用户*不*允许拥有 web 的内容, 
否则一台被入侵的 web 服务器可能被 rewrite 到别的站点. web 服务器写出的数据包括日志文件, 由 www-data 用户拥有.

<item>backup: 这样, 备份/恢复的任务可以委派没有完全 root 权限的用户.

<item>operator: operator 是过去(和现在)唯一可以不依赖于 NIS/NFS 远程登陆而'用户'账号.

<item>list: 邮件列表文件和数据由此用户和组拥有. 一些邮件列表程序也是以此用户运行.

<item>irc: 由 irc 守护进程使用. 因为 <prgn>ircd</prgn> 的一个 bug, 
需要分配一个静态用户, 启动时, 它将自身 SETUID() 给一个指定 UID.

<item>gnats.

<item>nobody, nogroup: 不需要拥有任何文件的守护进程以用户 nobody 和组 nogroup 的方式运行. 
因此, 此用户和组在一个系统上不会拥有任何文件.

</list>

<p>其它没有相关用户的组:

<list>

<item>adm: adm 组由系统监控任务使用. 这个组的成员对 <file>/var/log</file> 
下的许多日志文件有读权限. 并且可以使用 xconsole. 过去, <file>/var/log</file> 
就是 <file>/usr/adm</file>(后来是 <file>/var/adm</file>). 这是这个组名字的由来.

<item>tty: TTY 设备由这个组拥有. 这样可以将 write 和 wall 操作传到其它人的 TTY 上.

<item>disk: raw 对磁盘的访问, 等同于 root 的访问.

<item>kmem: 此组可以读取 /dev/kmem 和类似的文件, 这是BSD的一个主要遗留痕迹, 
任何需要直接读去系统内存的程序都需要 SETGID 为 kmem.

<item>dialout: 对串口的全部和直接访问. 此组的成员可以对调制解调器, dial anywhere 等进行再配置. 

<item>dip: 此组的标准名称为"Dial-up IP", 此组的成员允许使用<prgn>ppp</prgn>, <prgn>dip</prgn>,
<prgn>wvdial</prgn>, 等一类的工具, 进行拨号连接. 这个组的用户不允许配置调制解调器, 但是可以运行使用它的程序.

<item>fax: 允许成员使用fax软件收/发传真.

<item>voice: Voicemail, 对于使用调制解调器作为电话答录机的系统非常有用.

<item>cdrom: 这个组可以用来在本地分配给用户对 CDROM 的访问权限.

<item>floppy: 这个组可以用来在本地分配给用户对软驱的访问权限.

<item>tape: 这个组可以用来在本地分配给用户对磁带机的访问权限.

<item>sudo: 当使用 <prgn>sudo</prgn> 时, 这个组的成员不需要键入密码. 参阅
<file>/usr/share/doc/sudo/OPTIONS</file>.

<item>audio: 这个组可以用来在本地分配给用户对 audio 设备的访问权限.

<item>src: 这个组拥有源代码，包括 <file>/usr/src</file> 目录下的文件. 
可以用来在本地给用户分配管理系统源代码的能力.

<item>shadow: 这个组可以读取 <file>/etc/shadow</file>. 需要访问这个文件的一些程序需要 SETGID 为 shadow.

<item>utmp: 这个组可以对 <file>/var/run/utmp</file> 和类似的文件进行写操作. 
需要对此类文件进行写操作的程序需要 SETGID 为 utmp.

<item>video: 这个组可以用来在本地分配给用户对 video 设备的访问权限.

<item>staff: 允许用户添加对系统((<file>/usr/local</file>, <file>/home</file>)的本地修改, 而不需要特权. 
与 "adm" 组相比, 更 monitoring/security.

<item>users: 当 Debian 系统使用默认的私有用户组系统(每个用户都有他们自己的组)时, 有些更愿使用传统的组系统, 所有用户都是此组的一个成员.

</list>

<sect2>adm 组和 staff 组之间有什么区别?

<p>'adm' 组的成员通常为管理员, 这个组的权限允许他们不用 <prgn>su</prgn> 就能读取日志文件.  
'staff' 组则通常为 help-desk/junior sysadmins, 允许成员在 <file>/usr/local</file> 目录下操作, 
和在 <file>/home</file> 目录下创建目录.

<sect1>为什么我创建新用户时, 会同时出现一个新组?(或为什么 Debian 为每个用户创建一个所属组?)

<p>在 Debian 中, 缺省设置为每个用户都有一个私有组. 传统的 UN*X 方案为每个用户指定了<em>用户</em>组. 
创建的其它的组用于限制对不同项目目录下的共享文件的访问. 当单个用户操作多个项目时, 
如果某个用户创建了一个文件, 文件的管理将变的困难, 它同它所属的主要组联系在一起(如,'users').

<p>Debian 的方案是通过为每个用户指定一个他们自己的组解决了这一问题; 
这样可以带有一个合适的 umask(0002)并且对给定项目目录设置了 SETGID 位, 
在此目录下创建的文件都被正确的指定了组. 这使得处理多个项目更加简单, 因为不必切换所属的组或 umask.

<p>然而, 您也可以通过修改 <file>/etc/adduser.conf</file> 来改变这一特性. 
修改 <em>USERGROUPS</em> 变量为 'no', 这样当创建用户时就不会伴随产生一个新组了. 
也可以设置 <em>USERS_GID</em> 为所有用户都属于的组的GID.

<sect1>关于服务和开启端口的问题

<sect2>为什么所有的服务安装后都被激活了?

<p>这只是解决问题的一种方法, 既考虑到了安全性, 又兼顾对用户的友好.
除非管理员将其激活, OpenBSD 将禁用所服务. 与此不同除非将其禁用, 
Debian GNU/Linux 会激活所有安装的服务(更多信息参见 <ref id="disableserv">). 
在您安装了服务之后, 不是这样吗?

<p>对于标准安装, 哪个是更好的解决方案, 在 Debian 的邮件列表(debian-devel 和 debian-security)上有更多的讨论, 
然而, 到目前为止(2002年3月), 仍然没有达成共识.

<sect2>我能删除 <prgn>inetd</prgn> 吗?

<p><prgn>Inetd</prgn> 是不好删除的, 因为 <package>netbase</package> 
依赖于提供它的软件包(<package>netkit-inetd</package>). 如果您想将其除去, 
可以将其禁用(参见 <ref id="disableserv">),或者使用 <package>equivs</package> 软件包卸载这个包

<sect2>为什么我的111端口是打开的?

<p>端口111是 sunrpc 的 portmapper，它是 Debian 的基本安装的默认部分, 
因为不必知道何时用户的程序需要 RPC 才能正确运行. 无论如何, 它主要由 NFS 使用. 
如果您不需要它, 您可以依照 <ref id="rpc"> 的说明将其删除.

<P>在 portmap 软件包的 5-5 以后版本中, 确实可以安装 portmapper 并使其只监听 localhost(通过修改 <file>/etc/default/portmap</file>)

<sect2><prgn>identd</prgn>(port 113)的主要用途是什么?

<p>Identd 服务是一个认证服务, 用于鉴别某个 TCP/IP 远程服务连接的拥有者的身份.  
一个典型的例子, 当用户连接到远程主机, 远程主机上的 <prgn>inetd</prgn> 
向113端口发回一个查询到, 索取用户信息, 通常由 mail, FTP 和 IRC 服务器使用, 
也可用于跟踪您本地系统中的哪个用户试图攻击一个远程系统.

<p>关于 <prgn>identd</prgn> 安全性有更广泛的讨论(参见 <url
id="http://lists.debian.org/debian-security/2001/debian-security-200108/msg00297.html"
name="mailing list archives">). 通常, <prgn>identd</prgn> 在多用户系统上比在单用户工作站上更有用. 
如果对您没用, 可将其禁用, 这样就不会对外部开放此服务了. 如果要用防火墙屏蔽 identd 端口, 
<em>请</em>使用一条 reject 策略,而不是 deny 策略, 否则, 使用 <prgn>identd</prgn> 的连接将会挂起, 
直至超时(参见   <url
id="http://logi.cc/linux/reject_or_deny.php3" name="reject 与 deny
的问题">).

<sect2>使用 1 到 6 端口的是什么服务,如果删除?

<p>运行命令 <tt>netstat -an</tt>, 您会看到:

<example>
  Active Internet connections (servers and established)
  Proto Recv-Q Send-Q Local Address           Foreign Address         State
  PID/Program name
  raw        0      0 0.0.0.0:1               0.0.0.0:*               7
  -
  raw        0      0 0.0.0.0:6               0.0.0.0:*               7
  -
</example>

<p>您<em>不会</em>看到进程对 TCP/UDP 端口 1 到 6 的监听. 
事实上, 您会发现一个进程监听 <em>raw</em> socket 协议1(ICMP)到6(TCP). 
这通常是木马和一些入侵检测系统,如 <package>iipl</package>, <package>iplogger</package> 和
<package>portsentry</package> 的特征. 如果您有这种软件包, 简单的将其删除. 
如果没有, 尝试使用 netstat 的 <tt>-p</tt>(进程)选项查看那些进程使用了这些监听.

<sect2>我发现端口 XYZ 打开了, 可以将其关闭吗?

<p>是的，当然可以. 您所开放的端口应当遵循您的个人站点关于对其它网络提供公共服务的策略. 
检查由 <prgn>inetd</prgn> 打开的端口(参见 <ref id="inetd">), 或由于安装的其它软件包打开的端口, 
并采取适当的措施(即,配置 inetd, 删除这个软件包, 避免其启动时运行).

<sect2>从 <file>/etc/services</file> 中删除服务, 是否对我的主机的安全有帮助?

<p><em>否</em>, <file>/etc/services</file> 只是在真实名称和指定端口号之间提供一种映射. 
从此文件中删除服务名并不能(通常)阻止运行的服务. <file>/etc/services</file> 
修改后一些守护进程可能不能运行了, 但这样做并不规范. 正确的禁用服务的方法, 参见 <ref
id="disableserv">. 

<sect1>常见安全问题

<sect2>我的密码丢了，无法访问系统了!

<p>您所需要做的恢复步骤与您是否采纳了限制访问 <prgn>lilo</prgn> 和系统的 BIOS 的建议有关.

<p>如果您两个都做了限制, 则进行下一步前, 您需要禁用只能从硬盘启动的 BIOS 设定. 
如果你连 BIOS 的密码也忘了, 就需要打开机箱, 取下BIOS 的电池, 将 BIOS 的设置复位.

<p>一旦您设定了从 CD-ROM 或软盘启动,尝试以下步骤:

<list>

<item>由救援盘启动内核

<item>转到虚拟控制台(Alt+F2)

<item>挂接 /root 所在硬盘分区

<item>编辑(Debian2.2 救援盘提供 <prgn>ae</prgn> 编辑器, Debian3.0 提供与 
<prgn>vi</prgn> 很相似的 <prgn>nano-tiny</prgn>)<file>/etc/shadow</file> 并修改:

<example>
  root:asdfjl290341274075:XXXX:X:XXXX:X::: (X=any number)
</example>

<p>为:

<example>
  root::XXXX:X:XXXX:X:::
</example>

</list>

<p>这将删除遗忘的 root 密码, 包含在用户名之后第一个冒号分割的部分. 
保存修改, 重起系统, 以 root 使用空密码登录. 记得重新设置密码. 
这样就可行了, 除非您更严谨的配置了系统, 即您不允许用户使用空密码登录, 
或不允许 root 由控制台登录.

<p>如果使用这些特性, 则您将需要以单用户模式进入. 如果对 LILO 做了限制, 
则您需要在 root 重新设置了上述之后再次运行 <prgn>lilo</prgn>. 
这相当棘手, 因为你的 <file>/etc/lilo.conf</file> 需要根据 root(/)文件系统来调整,
而不是真正的硬盘


<p>一旦没有了 LILO 限制，尝试以下步骤:

<list>

<item>在系统 BIOS 完成之前按下 Alt, shift 或 Control 键, 您会得到 LILO 提示符.

<item>在提示符后键入 <tt>linux single</tt>, <tt>linux init=/bin/sh</tt> 或 
<tt>linux 1</tt>.

<item>这样您会得到一个单用户模式下的 shell 提示符(将提示键入密码, 但是您已经知道了)

<item>使用 mount 命令, 重新以 read/write 模式挂接 root(/) 分区. 
<example>
  # mount -o remount,rw / 
</example>

<item>使用 <prgn>passwd</prgn> 命令修改超级用户密码(因为您就是超级用户, 所有不会要求您提供原密码).

</list>

<sect1>如何配置不需要分配用户 shell 账号的服务?

<p>例如，想配置 POP 服务, 并不一定非要为每个访问用户设置一个用户账号. 
最好的方法是使用外部服务(象 Radius, LDAP 或 SQL 数据库), 配置基于目录的认证. 
仅仅需要安装对应的 PAM 库(<package>libpam-radius-auth</package>,
<package>libpam-ldap</package>, <package>libpam-pgsql</package> 和
<package>libpam-mysql</package>), 阅读文档(对于新手, 参阅 <ref id="auth-pam">), 
并基于您的选择配置 PAM-enabled 服务. 编辑 <file>/etc/pam.d/</file> 
目录下对应您选择服务的文件, 修改
<example> 
  auth   required    pam_unix_auth.so shadow nullok use_first_pass 
</example> 
为, 例如, 对于 ldap 来说: 
<example>
  auth   required    pam_ldap.so 
</example>

<!-- FIXME: check if this i right (jfs) -->

<p>就 LDAP 目录而论，为了使用 LDAP 认证, 一些服务需要在您的目录中提供 LDAP 方案. 如果您使用关系数据库，可以在配置 PAM 模块时, 使用一个有趣的设定. 
例如, 如果您有一个带有如下表属性的数据库:

<example>
  (user_id, user_name, realname, shell, password, UID, GID, homedir, sys, pop, imap, ftp)
</example>

<p>通过标记服务的属性布尔字段, 就可以启用或禁用对于不同服务的访问, 
仅仅需要在下列文件插入合适的内容:

<list>

<item><file>/etc/pam.d/imap</file>:<tt>where=imap=1</tt>.

<item><file>/etc/pam.d/qpopper</file>:<tt>where=pop=1</tt>.

<item><file>/etc/nss-mysql*.conf</file>:<tt>users.where_clause =
user.sys = 1;</tt>.

<item><file>/etc/proftpd.conf</file>:<tt> SQLWhereClause "ftp=1"</tt>.

</list>

<sect id="vulnerable-system">我的系统存在漏洞!(您确认吗?)

<sect1 id="vulnasses-false-positive">漏洞评估扫描器 X 说我的 Debian 系统存在漏洞!

<p>许多漏洞评估扫描器在 Debian 系统上使用不能给予肯定的回答, 
因为它们通过版本检查来确定给定软件包是否存在漏洞, 
并不真正的进行安全漏洞测试. 因为 Debian 在修正软件漏洞后并不修改软件版本信息
(很多时候, 修复一个更新版本仅仅是移植), 一些工具认为一个更新了的 Debian 系统是存在漏洞的, 即使并不是这样.

<p>如果您认为您的系统已经更新了最新的安全补丁, 可以与 DSA(参见  <ref id="dsa">)
公布的安全漏洞数据库相参考, 识别虚假信息, 如果您使用的工具包括 CVE 参考.

<sect1>我在系统日志中看到一次攻击. 我的系统被入侵了吗?

<p>一条攻击记录并不意味着您的系统出现安全问题, 但您应当采取一些常见步骤来确定是否被入侵了
(参阅 <ref id="after-compromise">). 同时, 应当注意这样一个事实, 查看日志中的攻击记录, 
也许这就意味着您的系统已经存在漏洞了(执著的攻击者也许已经尝试了您所看到的以外的其它漏洞).

<sect1>我在日志中发现了奇怪的 'MARK' 行: 我被入侵了吗??

<p>您也许在系统日志中发现了如下内容:

<example>
  Dec 30 07:33:36 debian -- MARK --
  Dec 30 07:53:36 debian -- MARK --
  Dec 30 08:13:36 debian -- MARK --
</example>

<p>这并不能表明任何入侵, 用户更换 Debian 发行版也许会奇怪的发现这种内容. 
如果您的系统不是高负载(或者提供很多服务), 这些内容可能会出现在您的日志中. 
这只表明您的 <prgn>syslogd</prgn >守护进程运行正常,摘自 <manref
section="8" name="syslogd">:

<example>
       -m interval
              The syslogd logs a mark timestamp  regularly.   The
              default interval between two -- MARK -- lines is 20
              minutes.  This can be  changed  with  this  option.
              Setting the interval to zero turns it off entirely.
</example>

<sect1>在日志中发现有用户使用'su': 我被入侵了?

<p>有可能您在日志中发现如下类似内容:
<example>
  Apr  1 09:25:01 server su[30315]: + ??? root-nobody
  Apr  1 09:25:01 server PAM_unix[30315]: (su) session opened for user nobody by (UID=0)
</example>

<p>不必太担心. 检查这些内容是否与 <prgn>cron</prgn> 有关
(通常为 <file>/etc/cron.daily/find</file> 或
<prgn>logrotate</prgn>):

<example>
  $ grep 25 /etc/crontab
  25 6    * * *   root    test -e /usr/sbin/anacron || run-parts --report
  /etc/cron.daily
  $ grep nobody /etc/cron.daily/*
  find:cd / && updatedb --localuser=nobody 2>/dev/null
</example>

<sect1>我在日志中发现 'possible SYN flooding': 我被攻击了?

<p>如果您在日志中发现了如下类似内容:

<example>
  May 1 12:35:25 linux kernel: possible SYN flooding on port X. Sending cookies.
  May 1 12:36:25 linux kernel: possible SYN flooding on port X. Sending cookies.
  May 1 12:37:25 linux kernel: possible SYN flooding on port X. Sending cookies.
  May 1 13:43:11 linux kernel: possible SYN flooding on port X. Sending cookies.
</example>

<p>用 <prgn>netstat</prgn> 检查服务器是否存在大量的连接, 例如:

<example>
  linux:~# netstat -ant | grep SYN_RECV | wc -l
     9000
</example>

<p>这表明对您的系统的 X 端口(通常是对应公共服务, 如 web 服务器, 或邮件服务器)进行了拒绝服务(DoS)攻击. 
您应当激活内核中的 TCP syncookies, 参阅 <ref id="tcp-syncookies">. 但是, 应当注意, 这样即使您能避免系统被搞瘫, 
一个 DoS 攻击仍能湮没您的网络(由于资源标示被耗尽, 系统也许暂时无法应答 TCP 连接, 直至超时). 
最有效的解决方法是联系您的网络提供商.

<sect1>在日志中发现了奇怪的 root 会话: 我被入侵了?

<p>在 <file>/var/log/auth.log</file> 文件中, 也许您会发现如下类似内容:

<example>
  May 2 11:55:02 linux PAM_unix[1477]: (cron) session closed for user root
  May 2 11:55:02 linux PAM_unix[1476]: (cron) session closed for user root
  May 2 12:00:01 linux PAM_unix[1536]: (cron) session opened for user root by
  (UID=0)
  May 2 12:00:02 linux PAM_unix[1536]: (cron) session closed for user root
</example>

<p>这与执行的 <prgn>cron</prgn> 任务有关(在这个例子中,每5分钟一次). 
确定哪个程序对应这些任务, 检查如下目录中的内容: <file>/etc/crontab</file>, <file>/etc/cron.d</file>,
<file>/etc/crond.daily</file> 和 root 的 <file>crontab</file> 目录.

<sect1>我被入侵了, 怎么办?

<p>这种情况下,也许您应当采取如下措施:

<list>

<item>检查您的系统是否更新了公布漏洞的安全补丁. 如果您的系统存在漏洞, 
那么系统被入侵的机会就会增加. 如果漏洞已经被人所知了一段事件, 那么机会进一步增加, 
因为通常许多攻击活动与较旧的漏洞有关. 这是 <url
id="http://www.sans.org/top20/" name="SANS 排名前20的安全漏洞"> 的链接.

<item>阅读本文档, 尤其 <ref id="after-compromise"> 部分.

<item>寻求帮助. 您可以使用 Debian 安全邮件列表, 寻求如何恢复/修补您的系统的建议.

<item>通知本地 <url id="http://www.cert.org" name="CERT">(如果有的话, 您也许可以直接与其取得联系). 
这可能对您没有什么帮助, 但至少通知 CERT 正在进行的攻击. 这些信息对于确定 <em>blackhat</em> 
社区使用何种工具或攻击非常有用.

</list>

<sect1>如何跟踪攻击?

<p>查看日志(如果还未被篡改), 使用入侵检测系统(参见 <ref id="intrusion-detect">), 
<prgn>traceroute</prgn>, <prgn>whois</prgn> 和其它简单的工具(包括事故分析), 
您也许能跟踪到攻击源. 这种方法是否有效与您的安全策略, 以及<em>您</em>认为什么是攻击有关. 
远程扫描是攻击吗? 漏洞探测是攻击吗?

<sect1>Debian 系统中的程序 X 存在漏洞, 我该怎么办?

<p>首先，花一点时间检查在公开的安全邮件列表(如 Bugtraq)或其它论坛上是否公布了这个漏洞. 
Debian 安全小组会跟踪这些列表, 也许他们也没有意识到这个问题. 
如果您在 <url id="http://security.debian.org"> 看到相关通告, 就不必采取进一步行动了.

<p>如果似乎没有公布什么相关信息, 请发送邮件至 
<url id="mailto:team@security.debian.org" name="team@security.debian.org">, 
包括受影响包的有关信息, 以及有关漏洞的详细描述信息(proof of concept code is also OK). 
这样就会与 Debian 安全小组保持联系.

<sect1>软件包的版本号表明我仍在使用一个存在漏洞的版本!

<p>Debian 对引入稳定版的版本进行 back port 安全修复, 而不是升级到新的版本. 
原因是要确保稳定版尽可能少的变动, 因为一个安全修复不会产生太大的变动或意想不到冲突. 
您可以通过查看软件包的更新记录来确定是否在使用这个软件包的一个安全版本, 
或者用 Debian 安全公告上声明的版本与其确切版本号(上游版本 -斜线- debian 版本)相比较.

<sect1>特定软件

<sect2><package>proftpd</package> 存在拒绝服务攻击漏洞.

<p>在您的配置文件中增加 <tt>DenyFilter \*.*/</tt>, 更多信息参见
<url id="http://www.proftpd.org/critbugs.html">.

<sect2>安装 <package>portsentry</package> 后，打开了很多端口.

<p>这是 <prgn>portsentry</prgn> 的工作方式. 它打开大约二十个未使用的端口用于确定端口扫描.

<sect id="debian-sec-team-faq">有关 Debian 安全小组的问题

<p>您可以从 <url id="http://www.debian.org/security/faq.en.html" 
name="Debian Security FAQ"> 获取相关信息. 这包括自11月19日以来信息, 
以及在 debian 安全邮件列表中出现的其它常见问题.


<!-- FIXME: should this be included in the FAQ? -->
<sect1>什么是 Debian 安全公告(DSA)?

<p>这是由 Debian 安全小组(参见下面)提供的有关 Debian GNU/Linux 的软件包中发现和修复安全漏洞的信息. 
被签名的 DSA 信息由 Debian 小组发送到邮件列表 (debian-security-announce), 并在Debian的网站上张贴(首页和 <url
id="http://www.debian.org/security/" name="security area">).

<p>DSAs 包括受影响的软件包, 被发现的安全漏洞, 从何处获更新软件包(以及它们的 MD5)等信息.

<!-- FIXME: update from web page automatically -->

<sect1>公告的署名未通过验证!

<p>这是很可能是您用户端的问题. <url id="http://www.debian.org/security/faq.en.html" 
name="debian-security-announce"> 列表有一个过滤器只允许源自安全小组成员并含有正确签名的信息被张贴.

<p>很有可能您使用的客户端邮件软件对信息有所改动, 因此破坏了签名. 
确保您的软件没有做任何 MIME 编码或解码, 或 tab/space 转换.

<p>已知的有 fetchmail(启用 mime 解码选项, formail (仅是源于 procmail 3.14 的) 和 evolution.

<sect1>Debian 中如何处理安全问题?

<p>一旦安全小组接受了事件通知, 一个或多个成员将对其检查, 看是否对 Debian 的稳定版本产生影响(即, 是否是一个漏洞). 
如果我们的系统存在漏洞, 我们将修复这个问题. 如果软件包的维护者还未联系安全小组, 那么将与其取得联系. 最后, 
对这个修补进行测试, 然后准备新的软件包, 它们是在稳定平台上编译的, 然后上载. 所有这些完成以后, 发布一个公告.

<sect1>为什么您的系统中混有那个软件包的老版本?

<p>在为修复安全问题制作一个新软件包时, 最重要的准则是尽可能少的变动. 
我们的用户和开发者一旦确定下来就依靠一个确切的版本工作, 
我们做的任何变动都可能使某个用户的系统崩溃. 对于库来说更是如此: 
确保从未没修改应用程序接口(API)或应用级二进制接口(ABI), 不管变动多么细微. 

<p>这意味着, 更新为新的上游版本不是好的解决办法, 反而移植是更好的选择. 
通常如果需要, 上游维护者都愿提供帮助, 如果 Debian 安全小组不能提供帮助的话.

<p>在某些情况下, 移植一个安全修复是不太可能的, 例如, 当大量源码需要修改和重写时. 
这时就不得不引入新的上游版本, 但是这必须由安全小组预先协调完成.

<sect1>security.debian.org 的修复软件包的策略是什么?

<p>在 stable 发行版中,  Security breakage 只是证明一个软件包在 security.debian.org 上的正确性. 其它没有什么作用. 一个 breakage 的大小在这里并不是真正的问题. 通常安全小组会和软件包的维护者一起制定软件包. 一些人(相信)应当跟踪问题并且得全部需要的编译的软件包, 并提交给安全小组, 即使是细微也要提交给 security.debian.org. 参阅下边的内容.

<sect1>软件包的版本号表明，我正在运行一个存在漏洞的版本!

<p>我们将一个版本的移植安全修复引入稳定版, 而不是升级到新的版本. 
我们这样做的原因是确保一个发行版的变动尽可能的少, 一个安全修复不至于改变或使现有系统崩溃. 
您可以通过检查软件包的更新日志, 或比较在 Debian 安全公告中声明的确切版本号来确定您是否在使用一个软件包的安全版本

<sect1 id="sec-unstable">对于 <tt>testing</tt> 和 <tt>unstable</tt> 版本其安全问题如何操作?

<p>简单的回答: 没有. testing 和 unstabl 变动很快, 安全小组没有所需的资源来为其提供支持. 
如果您需要一台安全(并且稳定)的服务器, 强烈建议您使用 stable 版. 当然, 安全人员在修复了 stable
版本中的问题后, 也会尽力修复 testing 和 unstable 中的问题.

<!-- Note: the following paragraph is not in the FAQ (jfs) -->
<p>然而，某些情况下，unstable 版中的安全问题会更快的得到解决, 
因为通常可以更快的从上游得到修复(其它版本, 比如稳定版中, 则通常需要移植).

<!-- The following section is not on the FAQ -->
<sect1 id="sec-older">我使用的是旧版的 Debian, 还能从 Debian 安全小组获取支持吗?

<p>不. 很不幸, 安全小组不能同时处理 stable 版(非官方的, 也是 unstable), 和其它老版本. 
但是, 您可以期待新的 Debian 发行版发行后, 一段限制时间(通常为几个月)后的一个安全更新.

<sect1>为什么没有 security.debian.org 的非官方镜像?

<p>security.debian.org 的目的就是尽可能快, 尽可能简单的获取安全更新. 
镜像会增加不必要的麻烦, 同时，如果非官方镜像没有及时更新的话，就可能会误事.

<sect1> 我已经查看了 DSA 100 和DSA 102，DSA 101的内容是?

<p>一些供应商(主要是 GNU/Linux, 但也包括基于 BSD 的)协调一些问题的安全公告并协商一个时间表, 
这样所有的供应商都可以在同一时间发布公告. 为了照顾需要更多时间的供应商(比如供应商需要对软件包进行冗长的 QA测试或需要提供对多个平台的支持或需要发行二进制代码). 我们自己的安全小组同时也需要提前准备公告. 时常，在张贴需要发布的公告以前,还时常需要涉及其它安全问题. 因此临时省略了一个或一些公告编号. 
<!--
<p>In some cases, the Debian Security Team prepares advisories in
advance, and holds the advisory number until the advisory can be
released. Hence, the gaps in DSA numbers.
-->

<sect1>如何联系安全小组?

<p>可以发送安全信息到 <url id="mailto:security@debian.org" name="security@debian.org">, 
这将会被所有 Debian 开发者收到. 如果有机密信息, 请发送到 <url id="mailto:team@security.debian.org"
name="team@security.debian.org"> 这只有成员可以阅读. 如果需要对电子邮件加密, 可以使用Debian安全联络密钥 
(密钥编号 <url id="http://pgpkeys.pca.dfn.de:11371/pks/lookup?search=0x363CCD95&amp;op=vindex" name="0x363CCD95">	 <!-- This old link doesn't work any more <url id="http://blackhole.pca.dfn.de:11371/pks/lookup?op=get&amp;exact=on&amp;search=0x363CCD95" name="0x363CCD95"> -->). 

<sect1>在 security@debian.org 和
debian-security@lists.debian.org 之间有什么不同?

<p>当您发送邮件到 security@debian.org 时, 它们将被发送到开发者邮件列表(debian-private). 
所有 Debian 开发者都订阅此邮件列表, 并且保密(即不会在公网公布). 公共邮件列表, debian-security@lists.debian.org, 
对任何 <url id="http://www.debian.org/MailingLists/" name="订阅"> 此邮件列表的用户公开, 并提供文档
<url id="http://lists.debian.org/search.html" name="检索">.

<!-- The following items are not included in the Debian Security Team FAQ -->
<sect1>如何为 Debian 安全小组贡献力量?
<p>
<list>

<item>帮助本文档, 修补 FIXME 部分, 或提供内容. 文档是很重要的, 
可以减少对通常问题重复性回答. 将此文档翻译为其它语言也是很大的帮助.

<item>打包应用程序, 这对检查和增强 Debian GNU/Linux 系统的安全性也有帮助. 
如果您不是开发者, 可以撰写 <url name="WNPP bug"
id="http://www.debian.org/devel/wnpp/">, 申请您认为有用但当前没有提供的程序.

<item>审查 Debian 中的应用程序, 或帮助解决安全缺陷, 并向 security@debian.org 提供问题报告. 
其它项目象 <url name="Linux Kernel Security Audit Project"
id="http://kernel-audit.sourceforge.net/"> 或 <url name="Linux
Security-Audit Project" id="http://www.lsap.org/"> 都能增加 Debian GNU/Linux 的安全性, 
因此为这些项目提供帮助最终也是有益的.

</list>

<p>任何一种情况, 在向 security@debian.org 提交报告之前, 请回顾每个问题. 
如果您能提供补丁, 这个过程会更快. 不要简单的转发 Bugtraq 邮件, 因为已经接收了类似邮件. 
当然, 提供附加信息也是不错的想法.

<sect1>安全小组有哪些人组成?

<p>Debian 安全小组当前由五名成员和两名秘书组成. 安全小组自己任命成员加入.

<sect1>Debian 安全小组检查 Debian 中的每个新的软件包吗?

<p>否, Debian 安全小组不对每个新软件包进行检查, 也没有完成检查恶意新软件包的自动(lintian)检查,
因为这些检查自动完成几乎不可能. 然而, 维护者对于其引入 Debian 的软件包负完全责任, 
并且所有软件包首先有授权的开发者签名. 此开发者负责分析他们所维护的软件报的安全性.

<sect1>Debian 修复漏洞 XXXX 需要多少时间?

<p>一旦发现漏洞, Debian 安全小组就会迅速的张贴公告, 并为 stable 版构建修补程序. 
<url id="http://lists.debian.org/debian-security/2001/debian-security-200112/msg00257.html"
name="张贴于 Debian 安全邮件列表"> 的报告显示2001年 Debian 安全小组修复安全相关漏洞的平均时间是35天. 
但是, 超过50%的漏洞修复时间在10以内, 超过15%在公告发布的<em>当天</em>被修复.

<p>但是，在问这个问题时, 可能忘了:

<list>

<item>DSAs 张贴前:

<list>

<item>为 Debian 支持的<em>所有</em>平台构建软件包
(系统内核部分要花费一些时间, 特别要考虑 stable 发行版支持的平台的数目).

<item>软件包需要经过周密的测试, 以确保没有引入新的缺陷.

</list>

<item>DSA 在张贴前(在 incoming 队列, 或镜像), 软件包需要构建完毕.

<item>Debian 是一个基于志愿的项目.

<item>Debian 基于"无保证"条款.

</list>

<p>如果您想更加详尽的分析 Debian 安全小组在漏洞上消耗的时间, 
应当考虑新的 DSA(参见<ref id="dsa">)在 <url
id="http://security.debian.org" name="安全站点"> 上的张贴, 
使用 metadata 生成它们, 包括与漏洞数据库建立连接, 您应当从 web 服务器(从
 <url id="http://cvs.debian.org" name="CVS">)上下载源代码或
使用 HTML 页面来确定 Debian 修复漏洞所花费的时间, 并且与公共数据库相比较.
