系统管理员 101: 补丁管理

作者: Kyle Rankin

在之前的几篇文章中,我开始了“系统管理员 101”系列,旨在传授一些关于系统管理的基础知识,这些知识是当前一代的初级系统管理员、DevOps 工程师或“全栈”开发人员可能没有学到的。我本以为这个系列已经结束了,但后来 WannaCry 恶意软件爆发,暴露了 Windows 网络中仍然存在的一些糟糕的补丁管理实践。我可以想象,当一些仍然沉浸在 2000 年代 Linux 与 Windows 战争中的读者听到这次爆发时,甚至会带着一种优越感微笑。

我决定这么快重启“系统管理员 101”系列的原因是,我意识到大多数 Linux 系统管理员在补丁管理方面与 Windows 系统管理员没有什么不同。老实说,在某些方面(特别是对正常运行时间的自豪感),一些 Linux 系统管理员在补丁管理方面甚至比 Windows 系统管理员更糟糕。因此,在本文中,我将介绍 Linux 下补丁管理的一些基本原理,包括一个良好的补丁管理系统应该是什么样子,您需要部署的工具,以及整个补丁过程应该如何运作。

什么是补丁管理?

当我提到补丁管理时,我指的是您为了更新服务器上已有的软件而建立的系统。我不仅仅是在谈论跟上最新、最前沿的软件版本。即使像 Debian 这样更保守的发行版,在其“稳定”版本中坚持使用特定版本的软件,仍然会发布频繁的更新来修补错误或安全漏洞。

当然,如果您的组织决定自行开发特定软件的版本,无论是由于开发人员要求最新版本,还是您需要 fork 该软件以应用自定义更改,或者您只是喜欢给自己增加额外的工作,那么您现在就遇到了问题。理想情况下,您应该建立一个系统,该系统可以在您用于构建和打包任何其他软件的同一个持续集成系统中自动打包自定义版本的软件,但许多系统管理员仍然依赖过时的方法,即基于(希望是最新的)wiki 文档在本地机器上打包软件。无论哪种情况,您都需要确认您的特定版本是否存在安全漏洞,如果存在,请确保新的补丁可以干净地应用于您的自定义版本。

良好的补丁管理是什么样的

补丁管理首先要了解是否有软件更新。首先,对于您的核心软件,您应该订阅您的 Linux 发行版的安全邮件列表,以便在出现安全补丁时立即收到通知。如果您使用了任何非来自您的发行版的软件,您还必须找出如何及时了解该软件的安全补丁。当新的安全通知到来时,您应该查看详细信息,以便了解安全漏洞的严重程度、您是否受到影响,并评估补丁的紧迫性。

一些组织拥有纯粹手动的补丁管理系统。对于这样的系统,当出现安全补丁时,系统管理员会找出哪些服务器正在运行该软件,通常是依靠记忆,并通过登录服务器进行检查。然后,系统管理员使用服务器内置的软件包管理工具,从发行版更新软件到最新版本。然后,系统管理员移动到下一台服务器,再下一台,直到所有服务器都打上补丁。

手动补丁管理存在许多问题。首先是它使打补丁成为一项费力而繁琐的工作。打补丁工作越繁重,系统管理员就越有可能推迟或完全跳过它。第二个问题是,手动补丁管理过度依赖于系统管理员记住和回忆他或她负责的所有服务器的能力,并跟踪哪些服务器已打补丁,哪些未打补丁。这使得服务器很容易被遗忘并处于未打补丁的状态。

补丁管理越快越容易,您就越有可能去做它。您应该建立一个系统,可以快速告诉您哪些服务器正在运行特定版本的软件。理想情况下,该系统还可以推送更新。就我个人而言,我更喜欢像 MCollective 这样的编排工具来完成这项任务,但 Red Hat 提供了 Satellite,Canonical 提供了 Landscape 作为中心工具,让您可以查看整个服务器群的软件版本,并从中心位置应用补丁。

打补丁也应该是容错的。您应该能够修补一项服务并重新启动它,而不会造成任何整体停机时间。对于需要重启的内核补丁,也是同样的道理。我的方法是将我的服务器划分为不同的高可用性组,以便 lb1、app1、rabbitmq1 和 db1 都在一个组中,而 lb2、app2、rabbitmq2 和 db2 在另一个组中。这样,我就知道我可以一次修补一个组,而不会在其他任何地方造成停机。

那么,多快才算快呢?您的系统应该能够在几分钟到最多一小时内,将补丁部署到没有附带服务的小型软件(例如 ShellShock 漏洞中的 bash)。对于像 OpenSSL 这样需要您重启服务的软件,以容错方式小心翼翼地修补和重启服务的过程可能会花费更多时间,但这正是编排工具的用武之地。我在我最近的 MCollective 文章(参见 2016 年 12 月和 2017 年 1 月刊)中给出了如何使用 MCollective 来完成此操作的示例,但理想情况下,您应该建立一个系统,使其易于以容错和自动化的方式修补和重启服务。

当打补丁需要重启时,例如在内核补丁的情况下,可能需要更多时间,但同样,自动化和编排工具可以使这个过程比您想象的要快得多。我可以在一两个小时内以容错方式修补和重启环境中的服务器,如果不需要等待集群在重启之间同步备份,速度会更快得多。

不幸的是,许多系统管理员仍然坚持认为正常运行时间是值得骄傲的标志——考虑到严重的内核补丁往往每年至少出现一次,甚至更频繁,对我来说,这证明您没有认真对待安全。

许多组织仍然有那个永远不能宕机的单点故障服务器,因此,它永远不会被打补丁或重启。如果您想确保安全,您需要消除这些过时的隐患,并创建至少可以在深夜维护窗口期间重启的系统。

最终,快速而简单的补丁管理是一个成熟且专业的系统管理员团队的标志。更新软件是所有系统管理员作为其工作一部分必须做的事情,并且投入时间到使该过程变得简单快捷的系统中,所获得的回报远远超出安全性。首先,它有助于识别导致单点故障的不良架构决策。其次,它有助于识别环境中停滞不前、过时的遗留系统,并为您提供更换它们的动力。最后,当补丁管理良好时,它可以解放系统管理员的时间,并将他们的注意力转移到真正需要他们专业知识的事情上。

Kyle Rankin 是 Linux Journal 的技术编辑和专栏作家,也是 Purism 的首席安全官。他是 Linux Hardening in Hostile NetworksDevOps TroubleshootingThe Official Ubuntu Server BookKnoppix HacksKnoppix Pocket ReferenceLinux Multimedia HacksUbuntu Hacks 的作者,也是许多其他 O'Reilly 书籍的撰稿人。Rankin 经常就安全和开源软件发表演讲,包括在 BsidesLV、O'Reilly Security Conference、OSCON、SCALE、CactusCon、Linux World Expo 和 Penguicon 上。您可以在 @kylerankin 上关注他。

加载 Disqus 评论