Paranoid Penguin - 使用 Yum 进行 RPM 更新
每当安全更新可用时就更新您的 Linux 系统的软件,这是您可以做的最重要的事情之一,以减少您暴露于与错误相关的漏洞的风险。这件事非常重要,以至于我在 Linux Journal(“保持更新而不发疯”,2002年7月)和我的书 Building Secure Servers With Linux 的第 3 章中对此进行了详细的描述。
自从我写了那些文章(两年前)以来,您更新 Debian 和 SuSE 系统的方式并没有太大变化:apt-get 和 YaST 分别仍然是此任务的首选工具。但是 Red Hat 世界有一个新的值得注意的实用程序,叫做 Yum(Yellow Dog Updater, Modified 的缩写)。本月我将解释在哪里可以获得 Yum,如何设置它,以及如何使用它来简化保持您的 Red Hat、Fedora 或 Mandrake 系统最新的任务。
打补丁只是安全舞蹈中的一步
让我明确一点,保持软件补丁的最新状态是您必须 除了 其他系统加固任务之外要做的事情,而不是取而代之。这些其他任务包括但不限于:
移除不必要的软件包。
最大限度地减少以 setuid root 运行的程序数量。
尽可能以非特权用户身份运行守护进程。
尽可能在 chroot jail 中运行守护进程。
理解和使用给定守护进程支持的任何安全功能。
物理保护您的系统(例如,将其放在锁着的计算机房中)。
养成习惯观看系统和应用程序日志,以查找可疑活动。
与日志查看一样,应用安全更新必须是一个持续的过程。订阅您的发行版的安全邮件列表,并在补丁可用后立即应用它们。坏人可能不会有礼貌地等待才发动攻击。
顾名思义,Yellow Dog Updater, Modified 是从 Yellow Dog Updater, Yup 演变而来的,Yup 是 Macintosh 计算机的 Yellow Dog Linux 发行版的一部分。虽然 Yup 仅在 Yellow Dog (Macintosh) 系统上运行,但 Yum 目前可在 Red Hat、Fedora、Mandrake 和 Yellow Dog Linux 上运行,在这些系统中它已取代了 Yup。Yum 是杜克大学 Linux@DUKE 团队的一个项目;Seth Vidal 和 Michael Stenner 被认为是大部分开发工作的主要贡献者。
简而言之,Yum 对于基于 RPM 的系统所做的,与 apt-get 对于 Debian 所做的是一样的。它提供了一个简单的命令,可以用来自动安装或更新软件包,首先安装和更新满足所需软件包的依赖关系所需的任何其他软件包。
Yum 实际上包含两个命令:yum是客户端命令,而yum-arch是服务器端命令,用于创建将 Web 或 FTP 服务器转换为 Yum 仓库所需的头文件。yum-arch 命令超出了本文的范围,但是如果您想设置公共 Yum 仓库、为本地系统维护的软件包设置私有 Yum 仓库,或者甚至在您的硬盘驱动器上设置非网络 Yum 仓库,则需要使用它。yum-arch 易于使用,并且 yum-arch(8) 的 man 手册会告诉您需要知道的一切。
与 apt-rpm(apt-get 的一个流行的 RPM-based 发行版移植版本)不同,Yum 是 RPM 软件包格式的原生工具。Michael Stenner 说:“Yum 的设计宗旨是简单可靠,更侧重于保持您的机器安全和稳定,而不是客户端自定义。”
Yum 下载站点(请参阅在线资源部分)解释了要下载哪个版本的 Yum,具体取决于您使用的 Red Hat 或 Fedora Linux 的版本。如果您是 Fedora 用户,Yum 是 Fedora Core 1 的一部分,软件包 yum-2.0.4-2.noarch.rpm 在您的 Fedora 安装 CD-ROM 的 Disk 1 上。如果您使用 Mandrake 9.2,软件包 yum-2.0.1-1mdk.noarch.rpm 包含在发行版的 contrib/i586 目录中。
Yum 完全用 Python 编写。因此,为了安装任何 Yum RPM,您的系统需要 Fedora/Red Hat 软件包 python、gettext、rpm-python 和 libxml2-python 或其 Mandrake 等效软件包。很有可能,所有这些软件包都已在您的系统上。
Yum 可以从哪里拉取其 RPM?通常,这发生在 Internet 上的远程站点。由于这是一个安全专栏,我这里的重点是使用 Yum 来获取安全补丁,因此网络更新是本专栏其余部分的重点。但是,为了完整起见,Yum 可以从本地文件系统或虚拟本地文件系统(例如 NFS 挂载)读取 RPM。
无论是在远程服务器还是本地服务器上,RPM 集合都必须是 Yum 仓库。它必须包含一个名为 headers 的目录,其中包含 Yum 用来识别和满足 RPM 依赖关系的 RPM 头信息。因此,您不能随意将 Yum 指向任何旧的 Red Hat 镜像或 Mandrake CD-ROM。
如果您使用 Fedora Core 1 或 1.90,则可以将 Yum 与任何 Fedora 镜像一起使用。由于 Yum 是 Fedora 官方支持的更新机制,因此 Fedora 镜像被设置为 Yum 仓库。而且,您知道 Fedora Legacy Project 吗?Fedora 工作的这个分支为旧版 Red Hat 发行版(目前是 Red Hat 7.3、8.0 和 9.0)提供安全更新。因此,许多 Fedora 镜像也以 Yum 仓库的形式包含 Red Hat 更新。
如果有疑问,可以使用有限但方便的各种发行版 Yum 仓库列表(请参阅资源)。此列表上的每个链接都会生成一个文本块,您可以将其复制并直接粘贴到您的 /etc/yum.conf 文件中,我们稍后将深入探讨该文件。如果一切都失败了,在 Google 上搜索 mydistroname Yum 仓库是另一种查找仓库的方法。
配置 Yum 非常简单;您只需要编辑一个文件,该文件顾名思义名为 /etc/yum.conf。清单 1 显示了 Fedora Core 1 的 Yum RPM 附带的默认 /etc/yum.conf 文件。
清单 1. Fedora Core 1 的 /etc/yum.conf 文件
[main] cachedir=/var/cache/yum debuglevel=2 logfile=/var/log/yum.log pkgpolicy=newest distroverpkg=fedora-release tolerant=1 exactarch=1 [base] name=Fedora Core $releasever - $basearch - Base baseurl=http://fedora.redhat.com/releases/fedora-core-$releasever [updates-released] name=Fedora Core $releasever - $basearch - Released Updates baseurl=http://fedora.redhat.com/updates/released/fedora-core-$releasever #[updates-testing] #name=Fedora Core $releasever - $basearch - Unreleased Updates #baseurl=http://fedora.redhat.com/updates/testing/fedora-core-$releasever
如您所见,此文件由全局变量设置列表组成,后跟一个或多个 [server] 块(清单 1 中的 [base] 和 [updates-released]),每个块都指定了不同类型的 RPM 组的设置。我不会介绍每个可能的全局或服务器块设置;yum.conf(5) 的 man 手册就是为此而设的。但是,让我们讨论一些关键设置。
在全局部分,debuglevel 确定 Yum 输出的详细程度。此值范围可以从 0(无输出)到 10(最大调试输出)。清单 1 中显示了默认值 2。据我所知,此 debuglevel 仅影响标准输出,而不影响 Yum 的日志文件,日志文件的位置由 logfile 指定。不过,我喜欢将此值更改为 4,这是我通过使用yum命令的 -d 值得到的。例如,(yum -d 4 yum-commands) 等效于并覆盖 debuglevel。
同样在全局部分,pkgpolicy 指定如果给定软件包出现在多个 [server] 块中,Yum 应如何决定使用哪个版本。distroverpkg 指定您的本地发行版文件软件包的名称。您的发行版文件,例如 /etc/fedora-release 或 /etc/redhat-release,包含您的 Linux 发行版的名称和版本。
每个 [server] 块定义一组 RPM。就个人而言,我希望这些块被称为 [package-type] 块,因为它们不是按服务器区分的,而是按 RPM 组区分的。单个块可能包含许多服务器的 URL。在清单 1 中,[base] 块包含一个指向 fedora.redhat.com 上的主 Fedora 仓库的 URL。
包含相同 RPM 集合的 Fedora 镜像可以使用其他 baseurl 行列出。[server] 块中的任何行都可以使用变量 $releasever(解析为您的 Linux 发行版的版本号)和 $basearch(扩展为您的系统的 CPU 系列)。CPU 系列在这里以最通用的意义存在;Athlons 在此上下文中被认为是 i386 的一部分。
您的 Yum RPM 安装的 /etc/yum.conf 文件可能工作正常,但是您应该使用至少一个镜像站点 URL 来扩充每个默认 URL,即清单 1 中的 http://fedora.redhat.com...。这样做可以最大限度地减少由于一台服务器不可用而导致您的更新失败的可能性。请务必使用您喜欢的 Web 浏览器来测试驱动您添加到 yum.conf 的任何 URL,以确保它可以成功解析为包含名为 headers 的目录的目录。此外,请确保您的 URL 以尾部斜杠结尾。
清单 1 中另一个值得注意的地方是,缺少一个重要的 [server] 选项:gpgcheck。清单 2 显示了使用此选项的更正后的 [base] 块。
清单 2. 自定义的 [base] 部分
[base] name=Fedora Core $releasever - $basearch - Base baseurl=http://mirror.eas.muohio.edu/fedora/ ↪linux/core/$releasever/$basearch/os/baseurl= ↪http://fedora.redhat.com/releases/ ↪fedora-core-$releasever gpgcheck=1 failovermethod=priority
设置gpgcheck=1使 Yum 检查其下载的每个 RPM 中的 GnuPG 签名。为了使此操作生效,您需要将适当的 GnuPG 密钥合并到您的 RPM 数据库中。在 Fedora Core 1 系统上,这些密钥作为 fedora-release 软件包的一部分安装在您的系统上。要将它们复制到您的 RPM 数据库,请执行此命令:
rpm --import /usr/share/doc/fedora-release-1/RPM-GPG*
Therpm --import命令也可以使用 URL 作为其参数,因此如果您的 Yum 源的 GnuPG 密钥是在线的,则可以使用以下形式:
rpm --import http://your.distro.homepage/GPGsignature
其中 http://your.distro.homepage/GPGsignature 应替换为真实的 URL。
这看起来可能很麻烦,但这是值得的。多年来,对 Linux 发行商站点的几次入侵导致毫无戒心的用户下载了木马化或其他受损的软件包。利用 RPM 对 GnuPG 签名的支持是抵御此类欺诈行为的最佳防御措施。
清单 2 中另一个值得注意的更改是我指定了failovermethod=priority,这告诉 Yum 按顺序尝试此列表上的 URL,从顶部的 URL 开始。默认行为是failovermethod=roundrobin,Yum 随机选择列出的 URL 之一。就我个人而言,我更喜欢 priority 方法,因为它让我可以将更快、更近的镜像优先于我的发行版的主站点。
现在我们来到了容易的部分,使用yum命令。有两种运行 Yum 的方法,一种是从命令提示符手动运行,另一种是通过 /etc/init.d/yum 启动脚本自动运行。如果启用(您必须通过发出chkconfig --add yum命令手动执行此操作),此脚本只是触摸一个运行文件 /var/lock/subsys/yum,cron.daily 作业 yum.cron 会检查该文件。如果脚本已启用,即如果运行文件存在,则此 cron 作业首先运行 Yum 命令以检查并安装更新的 Yum 软件包,然后检查并安装所有其他系统软件包的更新。这样做时,Yum 会自动透明地解析任何相关的依赖关系。如果更新的软件包依赖于另一个软件包(即使以前不是这样),Yum 也会检索并安装另一个软件包。
对于大多数用户来说,此脚本非常强大且有用。但是,如果您的环境需要严格的变更控制程序,并且您不希望自动安装任何新软件,则应手动运行 Yum。
清单 3. 检查更新(输出略有重新格式化和截断以提高可读性)。
[root@iwazaru-fedora etc]# yum check-update Gathering header information file(s) from server(s) Server: Fedora Core 1 - i386 - Base Server: Fedora Core 1 - i386 - Released Updates Finding updated packages Downloading needed headers getting /var/cache/yum/updates-released/headers/ ↪coreutils-0-5.0-34.1.i386.hdr coreutils-0-5.0-34.1.i386 100% |=================| ↪13 kB 00:01 Name Arch Version Repo ----------------------------------------------------- XFree86 i386 4.3.0-55 updates-released XFree86-100dpi-fonts i386 4.3.0-55 updates-released XFree86-75dpi-fonts i386 4.3.0-55 updates-released XFree86-Mesa-libGL i386 4.3.0-55 updates-released
要安装单个更新,以及解析依赖关系所需的任何其他更新,请使用yum update packagename,例如yum update yum.
此示例实际上更新了 Yum 本身。如果确实有更新版本的 Yum 软件包可用,系统会提示您继续安装。如果您从脚本调用 Yum,并且希望自动回答所有此类提示,请使用 -y 选项:
yum -y update yum
check-update 命令,即 Yum 命令,在安装更新之前不是强制性的。如果您愿意,可以直接使用yum update—它执行与yum check-update.
在最后一个示例命令中,我们指定了一个要更新的软件包,yum。要为系统上所有已安装的软件包启动完整的更新会话,您可以简单地省略最后一个参数,即软件包规范:yum update.
在 Yum 检查所有可用更新并计算依赖关系后,它会向您显示它打算下载的所有更新的列表。除非您使用了 -y 选项,否则它会询问您是否下载并安装它们。
为了完整起见,这里有一个额外提示:您还可以使用 Yum 安装新软件包——您可能已经弄清楚了。对于 /etc/yum.conf 中定义的源中包含的任何软件包,您可以使用命令yum install packagename来安装该软件包的最新版本,以及它所依赖的任何内容。例如,要安装 FTP 服务器软件包 vsftpd,您将发出以下命令:yum install vsftpd.
如果您在使用 Yum 时遇到任何问题,可以在线获得充足的帮助,包括两个优秀的 FAQ。请参阅在线资源部分。如果在线文档没有帮助,还可以使用 Yum 邮件列表。但是,在发布问题之前,请务必尝试一两次 Google 搜索。在撰写本文的过程中,我找到了许多发布到 Yum 邮件列表的帖子,这些帖子解决了我的各种问题,所有这些问题都是通过 Google 找到的。
本文的资源: /article/7501。
Mick Bauer,CISSP,是 Linux Journal 的安全编辑,也是明尼苏达州明尼阿波利斯市的 IS 安全顾问。他是 Building Secure Servers With Linux (O'Reilly & Associates, 2002) 的作者。