保持更新,避免崩溃
安全是一个不断变化的目标,追逐它可能会让人感到眼花缭乱。在像 Linux 这样强大的系统中,最无情和繁琐的安全任务之一是保持其无数应用程序、命令和库的最新状态。正如任何订阅 BugTraq 邮件列表的人都可以证明的那样,新的软件漏洞不断被发现、利用和修补。但是,考虑到典型的 Linux 发行版安装了数百个软件包,您又如何才能跟上呢?
坏消息是,您无法完全跟上。即使您有一种方法可以立即修补每个漏洞和事件报告邮件列表中发布的每个新漏洞,您迟早也会成为事件报告的主题;有些漏洞在被利用之前不会成为常识。
好消息是,既然您不可能完全跟上,那么您所做的任何进步都是一种胜利。如果您因为一个三周前的软件漏洞而被入侵,那么至少您比那些因为三年前的漏洞而被入侵的人更精英。(另一方面,无论哪种方式您都被入侵了。)
不过,从严肃的角度来看,从纯粹的统计学角度来看,未修补的错误越少意味着可利用的漏洞越少。尽管这项任务看起来多么吃力不讨好和永无止境,但确实值得尝试保持您的 Linux 软件的最新状态。幸运的是,最新版本的流行 Linux 发行版包含用于自动化此任务的大量新工具,包括 SuSE 的 YaST2、Red Hat 的 up2date 和 Debian 的 apt-get。(其中一些工具甚至很安全!)
我将从一个关键建议开始,这是我经过多年的怀疑后得出的结论:在可能的情况下,坚持使用您的发行版支持的软件包。对很多人来说,这听起来可能很明显;如果不必从源代码构建,为什么要这样做呢?但对于我们这些老派类型的人来说,从源代码构建既是一种习惯,也是一种技能。也许这是因为早在 1990 年代初期(您知道,在 Slashdot 或动力飞行之前),Linux 的软件比现在少得多,这意味着我们运行的许多东西都必须从其他平台上开发的源代码构建。此外,将 Linux 打包成发行版的整个概念还不够成熟:发行版更少,而且它们的变化频率也低得多。
(您是否曾经因为您全新的内核与您的发行版中较旧版本的 ps 不向后兼容而不得不从源代码编译 ps?我们中的一些人经历过。我们每天还必须走十英里去上学,穿过充满蛇的沼泽等等。)
但现在情况不同了。别误会我的意思:我并不是说我们都应该成为二进制软件包的奴隶。有时您需要应用程序的最新版本中可用的功能,但在您的发行版版本中没有;有时您想要一个比您的发行版提供的一刀切的庞然大物更精简的构建。但是,在大多数时候坚持使用二进制软件包有一些重要的优势。
第一个是便利性:从单个站点下载一大组应用程序比从每个应用程序的开发人员站点下载更快更简单(这就是我们首先拥有发行版的原因),并且安装二进制软件包比从头开始编译更快,也更不容易出错。便利性不是我们 *nix 狂热分子承认重视的东西,但事实就是如此。
软件包的第二个优势是稳定性:主要的发行版打包商在决定是否在其发行版中包含给定的应用程序,以及如果包含,哪个版本最稳定以及哪些编译时选项最适合其发行版时,会进行大量的测试和研究。这方面曾出现过明显的例外,但如今大多数发行版在质量保证方面都做得相当好。
稳定性无疑是安全性的一个重要因素:哪里有错误,哪里就有漏洞。即使是没有明显安全影响的错误,也经常可以被利用进行拒绝服务攻击(其目的是使系统崩溃,而某些错误确实有效地做到了这一点)。
这使我们想到了应用程序安全中更令人沮丧的悖论之一:尽管互联网上一些最广泛的漏洞源于维护不善的应用程序(即,过时和/或已知易受攻击的版本),但更新的版本并不总是更好。多年来,安全社区正确地抨击了微软在承认和提供针对其产品中安全漏洞的补丁方面行动迟缓。但是,当微软确实提供了一个快速补丁,但该补丁会影响稳定性时,我们同样会痛苦地抱怨,因为这可能会削弱修复原始错误所带来的任何好处。
暂且忽略稳定性本身的可取性,请自问一下:假设一个应用程序有一个晦涩的缓冲区溢出条件,理论上可以利用它来获得 root 权限(但只能由一位精通汇编语言且具备 RC4 流密码工作知识的熟练程序员利用),而您使用引入拒绝服务机会的代码对其进行修补,即使是注意力缺陷的脚本小子也可以利用——您真的获得了多少安全性?这个问题的答案会因具体情况和您询问的对象而异,但重要的一点是,软件升级通常会产生自身的影响。
我正在反复强调这一点,但这一点很重要,因为它揭穿了即时软件更新是某种万能药的概念。(此外,这个问题已经在我的脑海中存在很长时间了;我花了多年时间才完全理解为什么,例如,最新版本的 OpenBSD 仍然附带 BIND v.4.9.8 的 hack 版本,这在计算机/狗年中确实非常古老。)
这一点也很重要,因为回到我最初的主题,让您的 Linux 发行商做出艰难的修补决定是有道理的,因此,在您的发行版发布官方(并且希望经过测试)的补丁之前,等待修补易受攻击的应用程序也是有道理的,当然,当您依赖二进制软件包而不是冷冰冰的源代码时,这是协议的一部分。跟上 Linux 发行商的应用程序更新已经够困难的了;我只能想象,自己修补和重新编译所有关键应用程序,并焦虑地等待看看修补是否破坏了其他任何东西,这将是多么徒劳。
因此,总结一下这些智慧的珍珠(至少我希望它们是珍珠,而不是其他一些小的球形分泌物):保持更新是一种美德,使用二进制软件包是一种有益的懒惰形式(向 Larry Wall 致敬),并且依靠您的 Linux 发行商提供的二手安全更新而不是“当牛仔”根本不是懒惰,而是谨慎。
在谈论自动更新工具之前,让我们先谈谈不同类型的系统。连接到 Internet 的堡垒主机比防火墙后面的桌面系统更迫切需要立即应用安全更新。在决定要在哪些系统上花费必要的时间和精力来严格保持最新状态,以及您愿意在哪些系统上通过不那么一丝不苟来承受一点风险时,请运用常识。
关于系统的角色,另一个需要考虑的问题是,您可以在哪些主机上舒适地运行基于 X 的更新工具,例如 YaST2。一般来说,堡垒主机(公共可访问的主机)不应运行 X。如果您真的喜欢 YaST2 的易用性和整体便利性,请在内部系统上运行它,将其配置为保存更新,并通过 scp 将这些更新推送到您的堡垒主机。
从 Red Hat 6.2 开始,您可以使用 up2date 自动识别、下载和安装更新的软件包。up2date 可以在文本或 X 模式下运行,因此上面描述的“我可以在哪里运行它?”难题实际上并不适用。
在您可以运行 up2date 之前,您需要对其进行配置。幸运的是,有两种方便简单的工具可以做到这一点。首先,您需要使用 rhn_register 在 Red Hat Network (RHN) 上创建一个帐户。如果未带参数调用,rhn_register 将在 X 模式下运行,但您可以通过向其传递 --nox 标志在文本模式下运行它
bash-# rhn_register --nox
您可以免费向 RHN 注册一个系统,但注册到同一帐户的后续系统需要付费。您希望在其上运行 up2date 的每个主机都必须进行 RHN 注册。但是,没有什么可以阻止您在一台计算机上运行 up2date,保存更新的软件包并通过 scp 或其他安全方式将其推送到您的其他 Red Hat 系统,并在这些系统上手动安装它们。
您需要了解的关于 RHN 的另一件事是,默认情况下,注册到 RHN 的系统会将有关其网络配置和硬件的信息,以及所有已安装软件包及其版本的完整列表发送给 RHN。这允许您安排从 RHN 发送到您的自动更新,和/或在您的系统上安装的软件包有更新可用时,向您发送自定义电子邮件。
这两个 RHN 功能可能对您非常有吸引力,如果其中任何一个功能使您能够执行定期安全更新,我个人不会批评您。但是,我个人对在没有必要的情况下向陌生人提供有关我的系统设置的详细列表感到不舒服。并不是说我有任何具体理由不信任 Red Hat Network 的优秀专业人士;只是我宁愿不必须信任他们。
毕竟,对我来说,订阅 Redhat-Watch-list 真的没什么大不了的,Red Hat 使用 Redhat-Watch-list 来宣布新更新 (listman.redhat.com),并自己决定是否有必要运行 up2date。如果有必要,即使我没有在 Red Hat 存储任何系统信息,up2date 也会自动确定哪些更新适用于我的系统。因此,我自己的做法(和建议)是取消选择 rhn_register 选项“包括有关硬件和网络的信息”和“在我的系统配置文件中包括此系统上安装的 RPM 软件包”。
在您向 Red Hat Network 注册您的系统后,您需要运行 up2date-config(图 1)。与 rhn_register 一样,如果您希望在文本模式下运行它,此命令支持 --nox 标志。up2date-config 在很大程度上是不言自明的,但有几个设置值得一提。

图 1. Red Hat 的 up2date-config 工具
首先,如果您要从中央系统下载、存储和分发更新(如上所述),您将需要选择“安装后,将二进制软件包保留在磁盘上”选项,并指定(或至少注意)“软件包存储目录:”的默认值。如果您使用 --nox 标志运行 rhn_register,则这些选项分别标记为 keepAfterInstall 和 storageDir。
其次,请务必不要取消选择“使用 GPG 验证软件包完整性”选项(默认情况下已选中),除非您的系统非常慢。RPM 软件包格式的一个更巧妙的功能是它支持内部 GPG 签名,该签名可用于验证 RPM 的完整性。up2date 可以自动为您执行此操作,前提是您的系统上安装了 GnuPG。如果是,您还可以像这样手动验证 RPM 软件包的 GPG 签名
rpm --checksig /path/packagefilename.rpm
当然,您应该将 /path/packagefilename.rpm 替换为您要检查的 RPM 文件的完整路径。
迟早会有人破解 Red Hat 镜像站点,并将一些基本软件包替换为木马版本;当这种情况发生时,我们这些经常检查有效 RPM 签名的人将不太可能受到伤害。
一旦您向 RHN 注册并运行 up2date-config,您就可以运行 up2date 本身(图 2)。关于这一点没有什么可说的;up2date 的全部意义在于简单性和便利性,因此您不需要我告诉您如何单击其清晰标记的按钮。

图 2. up2date 会话的一部分
但是,我将重复我之前的建议:注册 Redhat-Watch-list,并在宣布有适用于您系统的更新时运行 up2date。通过使用如此流畅且用户友好的工具,您几乎没有理由不这样做。
如果您使用 SuSE Linux,您可以使用更易于使用的工具来进行自动更新:YaST2 及其在线更新模块(图 3)。

图 3. 从 YaST2 运行在线更新
与 Red Hat 的 up2date 不同,您无需向 SuSE 注册即可运行此程序,也无需使用或编辑单独的文件来配置它。在线更新是独立的,在在线更新会话的前几个屏幕中,您可以根据需要更改其配置(例如,您可以选择比 SuSE 的美国 ftp.suse.com 服务器地理位置更近的下载站点)。
为了了解何时运行在线更新,您应该订阅 SuSE 的 suse-security-announce 邮件列表。与 Redhat-Watch-list 一样,这是一个低容量的电子邮件列表,因此不必担心 SuSE 会用琐碎的注释向您发送垃圾邮件。要订阅,请访问 www.suse.com/en/support/mailinglists/index.html。
老实说,关于 YaST2/在线更新,我没有什么其他需要告诉您的了,除了我遇到的一个小问题(实际上是最终用户错误,但很容易犯)。如果您从 xterm 或“运行命令”对话框手动调用命令 yast2,并且您的 X 会话不是以 root 身份运行的,则在线更新将失败,并返回关于无法在指定的 FTP 服务器上找到更新列表的误导性错误。
事实并非如此;实际上,YaST2 需要以 root 身份运行,以便在从 FTP 站点获取此文件后写入该文件。这并不意味着您必须仅从 root X 会话运行 YaST2;这意味着如果您不这样做,您应该使用 SuSE 为 YaST2 自动创建的菜单项,在这种情况下,系统将提示您输入 root 密码,并且在线更新将正常工作。
在我对 up2date 和 YaST2 的热情中,我还没有提到另一种更新 RPM 文件的简单方法:rpm 命令本身,它在 Red Hat(及其衍生产品)和 SuSE 上同样有效。说明此方法的最简单方法是举例说明。
假设您收到有关虚构的 SuSE 或 Red Hat 软件包 blorpflap 的漏洞和可用更新的通知,并且您使用通知中提供的 URL 将更新的 RPM 下载到本地路径 /usr/pkg/updates/blorpflap-3.2-3.rpm。首先,您应该验证其有效性
rpm --checksig /usr/pkg/updates/blorpflap-3.2-3.rpm
当然,要使其工作,您的发行版的签名密钥需要位于您的 GnuPG 公钥环上。有关使用 GnuPG 的教程,请参阅我在 2001 年 9 月和 10 月的 Linux Journal 中关于 GnuPG 的两部分系列文章。
如果 GPG 签名检查正常(或者如果您假设它正常,您可以自行承担风险——以上步骤是可选的),请安装更新
rpm -Uvh /usr/pkg/updates/blorpflap-3.2-3.rpm
-U 当然是 update(实际上是 update 或 install)的缩写,它适用于先前安装的软件包的更新和新软件包;-v 使操作详细,我喜欢它;-h 告诉 rpm 打印出一个小的进度条。
我们本月介绍的最后一个工具是 Debian 的 apt-get。似乎 Debian 的特点一样,apt-get 不那么花哨,但在某些方面甚至比其他发行版的花哨的 GUI 驱动的同等工具更容易使用。简而言之,更新 Debian 系统上所有 deb 软件包只有两个步骤:1) 更新您的软件包列表,2) 下载并安装新的软件包。这两个步骤都由 apt-get 执行,调用两次
bash-# apt-get update bash-# apt-get -u upgrade
第二个命令告诉 apt-get 使用 wget 下载更新的软件包,然后安装它们。
要接收有关 Debian 安全漏洞和更新的电子邮件通知,请填写 www.debian.org/MailingLists/subscribe 上的在线表格订阅 debian-security-announce。每当您收到有关适用于您系统的漏洞的通知时,请运行 apt-get。
顺便说一句,尽管我非常喜欢 apt-get,但还是缺少一个重要功能:GPG 签名验证。这是因为不幸的是,deb 软件包格式不支持签名,并且 Debian 软件包目前没有随附外部签名一起分发。据报道,未来版本的 deb 格式将支持 GPG 签名。
本月就到这里。祝您保持更新,保持理智!
Mick Bauer (mick@visi.com) 是 Upstream Solutions, Inc. 的网络安全顾问,该公司位于明尼苏达州明尼阿波利斯。他是即将出版的 O'Reilly 图书《Building Secure Servers With Linux》的作者,“Network Engineering Polka”的作曲家,以及一位自豪的家长(有孩子)。