如何保持Ubuntu20.04服务器更新

来自菜鸟教程
跳转至:导航、​搜索

介绍

在本教程中,您将探索一些使 Ubuntu 20.04 服务器堆栈保持最新的最佳实践。 就像 网络安全强化 一样,您可以采取许多步骤来确保您的服务器将继续安全地工作而无需未来的干预。

除了自动为您配置的工具和配置之外,您还可以将许多工具和配置应用于大多数 Ubuntu 服务器。 如果您自己进行服务器管理,手动修补所有环境可能会非常具有破坏性且容易出错。

本教程将涵盖: 按照应用程序管理的最佳实践测试正常重启,以尽量减少维护更新带来的任何复杂性 为机器上运行的大多数包和库配置自动更新 实时内核补丁,以及围绕内核更新的其他最佳实践

先决条件

  • 一个 Ubuntu 20.04 服务器和一个具有 sudo 权限的非 root 用户。 您可以在我们的 Initial Server Setup with Ubuntu 20.04 指南中了解有关如何设置具有这些权限的用户的更多信息。

如果您想在浏览器中使用交互式终端来试验本教程中的命令,请单击下面的 Launch an Interactive Terminal! 按钮。

启动交互式终端!

第 1 步 – 遵循应用程序管理的最佳实践

为自动升级配置服务器的一个基本部分是确保服务器上运行的所有应用程序能够在计划外停机或重新启动后正确重新启动。 Linux 包管理器设计为在后台无中断运行,因此必要的维护不会带来任何额外的开销。 尽管如此,没有一个好的更新策略的最常见的原因之一是担心你的服务器在重新启动后会如何表现。

在可能的情况下,堆栈中的应用程序应由服务器的 init 系统管理,在包括 Ubuntu 在内的大多数现代 Linux 发行版上都是 systemd。 Systemd 提供 systemctl 命令用于与正在运行的服务交互并根据需要自动重新启动它们。 几乎所有通过包管理器安装并设计为在后台运行的软件都应该自动提供 systemd 服务和配置单元文件作为最佳实践。

在运行您自己的软件或从 Git 存储库部署的软件时,编写自己的单元文件以便与 systemd 集成并不是一个坏主意。 作为一种轻量级的替代方案,您可能更喜欢使用 supervisor 之类的工具。 您还可以使用系统的 cron 调度程序和 @reboot 语法。

配置到位后,请确保通过重新启动对其进行测试。 您可以通过运行 sudo shutdown now -r 重新启动,这将完全停止正在运行的进程并立即重新启动。 您还可以在 hh:mm 中指定时间,或从现在开始的分钟数,而不是 now,以便安排将来重新启动。 在任何计划外中断后,生产部署通常不需要您注意,所有必要的服务和端点都应自动恢复。

既然您已确保您的环境在维护重新启动后不会出现任何问题,那么在下一步中,您将了解如何安排自动更新。

第 2 步 – 配置无人值守升级

Ubuntu 的包管理器 apt 具有完善的工作流程,可用于执行完整的系统升级。 首先,运行 apt update 以刷新软件包列表,然后运行 apt upgrade 而不指定软件包以升级系统上的每个软件包。 如果您与第三方软件包有任何版本冲突,或者您有意保持某些软件包未升级,则此工作流程可能会略有不同,但核心命令是相同的。

Ubuntu 提供了一个名为 unattended-upgrades 的独特工具,以便为您的服务器自动检索和安装安全补丁和其他重要升级。 大多数 Ubuntu 服务器都会自动安装和配置此工具,但您可以使用以下 apt 命令安装它:

sudo apt update
sudo apt install unattended-upgrades

安装后,您可以使用 systemctl 检查以确保 unattended-upgrades 服务正在运行:

sudo systemctl status unattended-upgrades.service
Output● unattended-upgrades.service - Unattended Upgrades Shutdown
     Loaded: loaded (/lib/systemd/system/unattended-upgrades.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2022-02-14 17:51:49 UTC; 3h 4min ago
       Docs: man:unattended-upgrade(8)
   Main PID: 829 (unattended-upgr)
      Tasks: 2 (limit: 1137)
     Memory: 10.6M
     CGroup: /system.slice/unattended-upgrades.service

unattended-upgrades 的默认配置将自动检索 Ubuntu 存储库中包含的大多数软件包的错误修复和安全更新。 但是,如果您使用旧版本的某些软件包以避免上游更改,或者您的服务器使用除 Ubuntu 之外的第三方软件包存储库,您可以进一步配置 unattended-upgrades 服务。

其配置存储在 /etc/apt/apt.conf.d/50unattended-upgrades 中。 使用 nano 或您喜欢的文本编辑器打开此文件:

sudo nano /etc/apt/apt.conf.d/50unattended-upgrades

该文件有很好的注释,您可以看到许多行代码注释(以 // 开头)解释其功能。 第一个配置块处理哪些包将被自动更新,匹配 Ubuntu 包存储库名称的模板。 核心存储库和 -security 存储库中的文件将默认更新,但包含 -updates-proposed-backports 存储库的行被注释掉默认出。

默认情况下禁用这些存储库,因为它们更有可能包含对已安装软件包的重大更改。 为了手动启用它们以进行无人值守升级,您可以从这些行中删除 // 注释符号。

/etc/apt/apt.conf.d/50unattended-upgrades

// Automatically upgrade packages from these (origin:archive) pairs
//
// Note that in Ubuntu security updates may pull in new dependencies
// from non-security sources (e.g. chromium). By allowing the release
// pocket these get automatically pulled in.
Unattended-Upgrade::Allowed-Origins {
        "${distro_id}:${distro_codename}";
        "${distro_id}:${distro_codename}-security";
        // Extended Security Maintenance; doesn't necessarily exist for
        // every release and this system may not have it installed, but if
        // available, the policy for updates is such that unattended-upgrades
        // should also install from here by default.
        "${distro_id}ESMApps:${distro_codename}-apps-security";
        "${distro_id}ESM:${distro_codename}-infra-security";
//      "${distro_id}:${distro_codename}-updates";
//      "${distro_id}:${distro_codename}-proposed";
//      "${distro_id}:${distro_codename}-backports";
};
…

在文件的下方,有许多带有 true / false 配置切换的选项。 例如,有一个开关可以在安装需要重新启动才能生效的软件包后自动重新启动。 您可以通过删除 // 注释符号并将 false 更改为 true 来启用此选项。 但是,这样做会导致您的服务器在不可预知的时间间隔变得不可用。 如果启用此选项,请确保您的应用程序或用户可以容忍停机时间。

/etc/apt/apt.conf.d/50unattended-upgrades

// Automatically reboot *WITHOUT CONFIRMATION* if
//  the file /var/run/reboot-required is found after the upgrade
//Unattended-Upgrade::Automatic-Reboot "false";

完成编辑后保存并关闭文件。 如果您使用的是 nano,请按 Ctrl+X,然后在出现提示时按 Y,然后按 Enter。

如果您对配置进行了更改,请重新加载 unattended-upgrades 服务以使其生效:

sudo systemctl reload unattended-upgrades.service

您现在应该有适当的解决方案,以确保您服务器上的所有软件包在没有任何额外干预的情况下接收必要的安全更新。 在最后一步中,您将学习如何保持内核更新,以及如何在必要时最好地处理服务器重启。

第 3 步 - 更新和实时修补内核

与其他软件包相比,您需要更新系统内核的频率较低。 Linux 内核包含(几乎)所有正在运行的硬件驱动程序,并负责大多数低级系统交互。 内核更新通常只有在需要解决一个引人注目的漏洞时才需要,如果您需要使用公开的新内核功能,或者如果您的内核已经变得太旧以至于累积错误和漏洞的风险更大你可能不知道。

没有自动调度 Linux 内核更新的通用方法。 这是因为内核更新在历史上需要一个完整的系统重新启动,如果不对您的环境做出假设,安排重新启动是不可能的。 许多服务器预计将提供尽可能接近 24/7 的可用性,并且重新启动可能需要未知的时间,或者需要手动干预。

如果您愿意忍受一些停机时间,更新内核很简单:您的无人值守 apt 更新可以配置为安装和准备新内核以及其他软件包,并且在重新启动后,您的服务器应该自动使用新内核. 大多数生产部署都需要额外的复杂性来重新启动,以确保服务可用性。 例如,您可以使用负载均衡器自动将流量重定向到可以在 水平扩展部署 中提供相同功能的服务器,同时它们按顺序单独重新启动,以避免任何可见的停机时间。

在内核更新期间启用 Livepatch 以确保服务器正常运行时间

为避免内核升级期间停机,您可以使用 Linux 内核的一项称为实时修补的功能。 此功能可以在不重新启动的情况下实施内核更新。 内核实时补丁有两个主要维护者:Canonical,他们为 Ubuntu 提供自己的 Livepatch Service,以及 KernelCare,除了大多数其他主要的 Linux 发行版之外,他们还支持 Ubuntu。 两者都需要注册才能使用,并且只有 Canonical 的服务是免费供个人使用的。

您可以在 https://auth.livepatch.canonical.com/ 上注册 Livepatch 密钥。 注册后即可安装canonical-livepatch snap包。 Snap 是另一个与 apt 一起运行的 Ubuntu 软件包管理器。

请注意,如果您在此页面上使用交互式终端,由于测试环境的限制,您将无法运行本节中的命令。


sudo snap install canonical-livepatch

您可以使用他们网站上的密钥通过一行命令启用 canonical-livepatch

sudo canonical-livepatch enable your-key

输出应包含消息 Successfully enabled device. 该服务应从现在开始在后台运行,无需任何进一步干预,您可以使用 canonical-livepatch status 检查其状态:

sudo canonical-livepatch status
Outputlast check: 55 seconds ago
kernel: 5.4.0-26.30-generic
server check-in: succeeded
patch state: ✓ all applicable livepatch modules inserted
patch version: 84.1
tier: updates (Free usage; This machine beta tests new patches.)
machine id: d56589e7fa994005a266d4caf9b9dcf7

您现在已经为您的服务器配置了自动内核更新,这意味着不再需要重新启动以维护安全和最新的环境。

结论

在本教程中,您探索了多种策略来保持 Ubuntu 服务器自动更新。 您还了解了软件包存储库、内核更新和处理服务器重启的一些细微差别。 这些都是 DevOps 和更广泛地使用服务器的重要基础,几乎所有的生产配置都建立在这些核心概念之上。

接下来,您可能想了解更多关于 Ubuntu 中的 包管理的信息。 如果您想了解有关 Snap 包格式的更多信息,请访问我们的教程 如何在 Ubuntu 18.04 上打包和发布 Snap 应用程序。