介绍
在本教程中,您将探索一些最佳实践,以保持您的Ubuntu 22.04服务器堆栈的更新,就像 网络安全硬化一样,您可以采取许多步骤来确保您的服务器将继续安全地工作,而无需未来干预。
有许多工具和配置,你可以应用于大多数Ubuntu服务器,除了自动为你配置的东西. 如果你正在做自己的服务器管理,手动修补你的所有环境可能是相当破坏性的和容易犯错误的。
本教程将涵盖:
- 根据应用程序管理的最佳做法测试优雅的重新启动,以最大限度地减少维护更新所带来的任何并发症
- 配置在您的机器上运行的大多数包和库的自动更新
- 实时内核补丁,以及内核更新周围的其他最佳做法
前提条件
- Ubuntu 22.04 服务器和具有 sudo 特权的非 root 用户. 您可以在我们的 Ubuntu 22.04 初始服务器设置 指南中了解有关如何设置具有这些特权的用户的更多信息。
步骤 1 – 遵循应用程序管理的最佳实践
配置您的服务器自动升级的一个基本部分是确保在未计划停机或重新启动后,所有运行在服务器上的应用程序都能正确地重新启动。Linux包管理器旨在在背景中运行,以便必要的维护不会带来任何额外的负担,尽管如此,没有一个好的更新策略的最常见原因之一是担心您的服务器在重新启动后将如何行为。
在任何可能的情况下,您的堆栈中的应用程序都应该由您的服务器的 init 系统管理,这在大多数现代 Linux 发行版中是 systemd。Systemd 提供了 systemctl 命令,用于与运行服务进行交互,并根据需要自动重新启动它们。
当运行自己的软件,或从Git存储库部署的软件时,写自己的单元文件,以便与systemd集成,这不是一个坏主意,作为一个轻量级的替代方案,你可能更喜欢使用一个工具,如 supervisor。
配置完成后,请确保通过重新启动进行测试。您可以通过运行sudo shutdown now -r
来重新启动,这将清晰地阻止您的运行流程,并立即重新启动。您也可以在 hh:mm 中指定一个时间,或从现在开始数分钟,而不是现在
,以便在未来计划重新启动。 生产部署通常不应该需要您在任何不计划的中断后注意,所有必要的服务和终端都应该自动恢复。
现在,您已经确保您的环境不会在维护重新启动时出现任何问题,在下一步,您将学习如何计划自动更新。
步骤 2 – 配置未经监督的升级
Ubuntu 的软件包管理器apt
有一个完善的工作流程,用于执行完整的系统升级. 首先,您运行apt update
来更新您的软件包列表,然后,您运行apt upgrade
而无需指定软件包来升级系统上的每个软件包。
Ubuntu 为您的服务器提供了一个独特的工具,称为未经监督的升级
,以便自动检索和安装安全补丁和其他必不可少的升级。
1sudo apt update
2sudo apt install unattended-upgrades
安装后,您可以检查是否使用systemctl
运行未经监督升级
服务:
1sudo systemctl status unattended-upgrades.service
1[secondary_label Output]
2● unattended-upgrades.service - Unattended Upgrades Shutdown
3 Loaded: loaded (/lib/systemd/system/unattended-upgrades.service; enabled; vendor preset: enabled)
4 Active: active (running) since Mon 2022-02-14 17:51:49 UTC; 3h 4min ago
5 Docs: man:unattended-upgrade(8)
6 Main PID: 829 (unattended-upgr)
7 Tasks: 2 (limit: 1137)
8 Memory: 10.6M
9 CGroup: /system.slice/unattended-upgrades.service
默认配置未经监督的升级
会自动检索包含在 Ubuntu 存储库中的大多数软件包的错误修复和安全更新,但是,如果您正在使用一些软件包的较旧版本以避免上游更改,或者如果您的服务器除了 Ubuntu 之外还使用第三方软件包存储库,您可以进一步配置未经监督的升级
服务。
它的配置存储在 /etc/apt/apt.conf.d/50unattended-upgrades
. 使用 nano
或您最喜欢的文本编辑器打开此文件:
1sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
该文件有很好的注释,你可以看到许多行代码评论(从//
开始)解释其功能。第一个配置块处理哪些包将自动更新,匹配Ubuntu包仓库名称的模板。核心仓库和安全
仓库中的文件将默认更新,但包含更新
、提议
和后端
仓库的行将默认地评论。
这些存储库是默认禁用的,因为它们更有可能包含对您安装的包的破坏性更改. 为了让它们手动进行未经监督的升级,您可以从这些行中删除//
评论符号。
1[label /etc/apt/apt.conf.d/50unattended-upgrades]
2// Automatically upgrade packages from these (origin:archive) pairs
3//
4// Note that in Ubuntu security updates may pull in new dependencies
5// from non-security sources (e.g. chromium). By allowing the release
6// pocket these get automatically pulled in.
7Unattended-Upgrade::Allowed-Origins {
8 "${distro_id}:${distro_codename}";
9 "${distro_id}:${distro_codename}-security";
10 // Extended Security Maintenance; doesn't necessarily exist for
11 // every release and this system may not have it installed, but if
12 // available, the policy for updates is such that unattended-upgrades
13 // should also install from here by default.
14 "${distro_id}ESMApps:${distro_codename}-apps-security";
15 "${distro_id}ESM:${distro_codename}-infra-security";
16// "${distro_id}:${distro_codename}-updates";
17// "${distro_id}:${distro_codename}-proposed";
18// "${distro_id}:${distro_codename}-backports";
19};
20…
更进一步的文件,有许多选项与真实
/假
配置转移. 例如,有一个转换自动重新启动后安装需要重新启动的包,以便生效. 您可以通过删除//
评论符号并改变假
到真
来启动此选项。
1[label /etc/apt/apt.conf.d/50unattended-upgrades]
2// Automatically reboot *WITHOUT CONFIRMATION* if
3// the file /var/run/reboot-required is found after the upgrade
4//Unattended-Upgrade::Automatic-Reboot "false";
如果你正在使用nano
,按Ctrl+X
,然后在提示时,Y
,然后输入。
如果您对配置进行了更改,请重新启动无监督升级
服务以使其生效:
1sudo systemctl restart unattended-upgrades.service
您现在应该有解决方案来确保您的服务器上的所有软件包都收到必备的安全更新,而无需额外干预,在最后一步中,您将学习如何保持内核更新,以及在需要时如何最好地处理服务器重新启动。
步骤 3 – 更新和修复内核
Linux 内核包含(几乎)所有正在运行的硬件驱动程序,并且负责大多数低级别的系统交互。内核更新通常只需要解决一个高级别的漏洞,如果您需要使用一个公开的新内核功能,或者如果您的内核变得如此老,以至于您可能不知道的积累错误和漏洞的风险更大。
没有通用方法自动安排Linux内核更新,这是因为内核更新历史上需要完全重新启动系统,而没有对您的环境做出假设,就无法安排重新启动。
如果你愿意忍受一些停机时间,那么更新你的内核很简单:你的未经监督的apt
更新可以配置为与其他包一起安装和准备新内核,重新启动后,你的服务器应该自动使用新内核。大多数生产部署需要额外的复杂性来重启,以确保服务可用性。
允许 Livepatch 在内核更新期间确保服务器运行时间
为了避免内核升级期间的停机时间,您可以使用名为现场补丁
的Linux内核功能,该功能允许在不重新启动的情况下实施内核更新。内核现场补丁的主要维护者有两种:Canonical,它为Ubuntu提供自己的Livepatch服务(https://ubuntu.com/security/livepatch)和KernelCare(https://www.kernelcare.com/),它支持Ubuntu以及大多数其他主要的Linux发行版。
您可以在 https://auth.livepatch.canonical.com/注册一个 Livepatch 键。 注册后,您可以安装canonical-livepatch
快递包。 Snap 是另一个运行在apt
旁边的 Ubuntu 包管理器。
1sudo snap install canonical-livepatch
您可以使用他们的网站的密钥启用canonical-livepatch
一行命令:
1sudo canonical-livepatch enable your-key
输出应包含成功启用设备
消息,服务应从现在起在背景中运行,无需进一步干预,您可以使用canonical-livepatch status
检查其状态:
1sudo canonical-livepatch status
1[secondary_label Output]
2last check: 50 seconds ago
3kernel: 5.15.0-25-generic
4server check-in: succeeded
5patch state: ✓ all applicable livepatch modules inserted
6patch version: 84.1
7tier: updates (Free usage; This machine beta tests new patches.)
8machine id: 2565a9e7fc9f4405a167e4caf9b9dcf3
您现在已经为您的服务器配置了自动内核更新,这意味着不再需要重新启动以保持安全和最新的环境。
结论
在本教程中,您探索了多种策略来自动更新您的Ubuntu服务器,您还了解了包存库,内核更新和处理服务器重新启动的一些细节,这些都是DevOps和更广泛地与服务器合作的重要基础,几乎所有生产配置都建立在这些核心概念之上。
接下来,您可能想了解更多关于 Ubuntu 中的包管理。 如果您想了解更多关于 Snap 包格式的信息,请访问我们的教程 如何包装和发布 Snap 应用程序 。