介绍
在本教程中,您将探索一些保持Rocky Linux 8服务器堆栈的最佳实践,就像在网络安全硬化(https://andsky.com/tech/tutorials/how-to-harden-openssh-client-on-ubuntu-20-04)中一样,您可以采取许多步骤来确保您的服务器将继续安全地工作,而无需未来干预。
有许多工具和配置,你可以应用到大多数Rocky Linux服务器,除了自动为你配置的东西. 如果你正在做自己的服务器管理,手动修补你的所有环境可能是相当破坏性的和容易犯错误的。
本教程将涵盖:
- 根据应用程序管理的最佳做法测试优雅的重新启动,以最大限度地减少维护更新所带来的任何并发症
- 配置在您的机器上运行的大多数包和库的自动更新
- 实时内核补丁,以及内核更新周围的其他最佳做法
前提条件
- Rocky Linux 8 服务器和具有 sudo 特权的非根用户. 您可以在我们的 Rocky Linux 8 初始服务器设置指南中了解有关如何设置具有这些特权的用户的更多信息。
步骤 1 – 遵循应用程序管理的最佳实践
配置您的服务器自动升级的一个基本部分是确保在未计划停机或重新启动后,所有运行在服务器上的应用程序都能正确地重新启动。Linux包管理器旨在在背景中运行,以便必要的维护不会带来任何额外的负担,尽管如此,没有一个好的更新策略的最常见原因之一是担心您的服务器在重新启动后将如何行为。
在任何可能的情况下,您的堆栈中的应用程序都应该由您的服务器的 init 系统管理,这在大多数现代 Linux 发行版中是 systemd. Systemd 提供了 systemctl 命令,用于与运行服务进行交互,并根据需要自动重新启动它们。
当您运行自己的软件或从 Git 存储库部署的软件时,写自己的单元文件以与 systemd 集成不是一个坏主意,作为一个轻量级的替代方案,您可能更喜欢使用像 supervisor这样的工具。
配置完成后,请确保通过重新启动进行测试。您可以通过运行sudo shutdown now -r
来重新启动,这将清晰地阻止您的运行流程,并立即重新启动。您也可以在 hh:mm 中指定时间,或从现在开始数分钟,而不是现在
,以便在未来计划重新启动。 生产部署通常不应该需要您在任何不计划的中断后注意,所有必要的服务和终端都应该自动恢复。
现在,您已经确保您的环境不会在维护重新启动时出现任何问题,在下一步,您将学习如何计划自动升级。
步骤 2 – 配置自动升级
Rocky 的包管理器「dnf」有两种主要方法来执行完整的系统升级. 您可以运行「dnf 升级」而无需指定一个软件包来升级您的系统上的每个软件包。 您还可以运行「dnf upgrade-minimal」来升级每个软件包只到最新的bugfix 或安全补丁版本,这将执行必要的维护,同时避免任何潜在的破坏性变化。 您可以从 [dnf 文档] 阅读更多关于「dnf」的命令。
Rocky 还提供了一种名为dnf-automatic
的独特工具,可以自动检索和安装安全补丁和其他必要的升级到您的服务器。
1sudo dnf install dnf-automatic -y
’dnf-automatic’在安装后不会自动启用,而是提供几个不同的服务,您可以与 Systemd 注册以定制其行为。
- dnf-automatic – 此服务遵循
dnf-automatic
配置文件选项在/etc/dnf/automatic
. - dnf-automatic-notifyonly – 这仅通过通知您可用的更新而不是安装它们来覆盖配置文件。
- dnf-automatic-download – 这只通过下载包而不是安装它们来覆盖配置文件。
对于本教程,您将启用dnf-automatic-install
服务,但首先,您将对dnf-automatic
配置文件进行一个更改。
1sudo vi /etc/dnf/automatic
1[label /etc/dnf/automatic.conf]
2[commands]
3# What kind of upgrade to perform:
4# default = all available upgrades
5# security = only the security upgrades
6upgrade_type = security
7random_sleep = 0
8
9# Maximum time in seconds to wait until the system is on-line and able to
10# connect to remote repositories.
11network_online_timeout = 60
12
13# To just receive updates use dnf-automatic-notifyonly.timer
14
15# Whether updates should be downloaded when they are available, by
16# dnf-automatic.timer. notifyonly.timer, download.timer and
17# install.timer override this setting.
18download_updates = yes
19
20# Whether updates should be applied when they are available, by
21# dnf-automatic.timer. notifyonly.timer, download.timer and
22# install.timer override this setting.
23apply_updates = no
24…
这个文件中的大多数选项都与不同的 Systemd 服务提供的各种升级相匹配。一个例外是upgrade_type
选项,该选项默认设置为默认
。如果您要实施自动升级(最主动的配置),最好仅默认安装安全升级,以避免功能的意外变化。如上文所示,将upgrade_type
值更改为security
,然后保存和关闭文件。如果您使用vi
,则可以通过输入x
来保存和停止。
现在您可以使用systemctl
启用该服务:
1sudo systemctl enable dnf-automatic-install.timer
您可以检查以确保使用systemctl
正确运行dnf-automatic-install
服务:
1sudo systemctl status dnf-automatic-install
1[secondary_label Output]
2● dnf-automatic-install.service - dnf automatic install updates
3 Loaded: loaded (/usr/lib/systemd/system/dnf-automatic-install.service; static; vendor preset: disabled)
4 Active: inactive (dead)
5
6Jul 14 21:01:03 droplet-name dnf-automatic[40103]: No security updates needed, but 154 updates available
7Jul 14 21:01:03 droplet-name systemd[1]: dnf-automatic-install.service: Succeeded.
8Jul 14 21:01:03 droplet-name systemd[1]: Started dnf automatic install updates.
与一些Systemd服务不同,dnf-automatic
作为一个 timer 实现,而不是作为一个在背景中永久运行的服务,这意味着在激活之间预计Active: inactive (dead)
的状态,只要该服务被加载和日志反映成功运行。
您可以使用systemctl cat
查看该计时器的细节:
1sudo systemctl cat dnf-automatic-install.timer
1[secondary_label Output]
2[Unit]
3Description=dnf-automatic-install timer
4# See comment in dnf-makecache.service
5ConditionPathExists=!/run/ostree-booted
6Wants=network-online.target
7
8[Timer]
9OnCalendar=*-*-* 6:00
10RandomizedDelaySec=60m
11Persistent=true
12
13[Install]
14WantedBy=timers.target
默认情况下,服务设置为每天晚上6点左右运行,您不应该更改此值。
您现在应该有解决方案来确保您的服务器上的所有软件包都收到必备的安全更新,而无需额外干预,在最后一步中,您将学习如何保持内核更新,以及在需要时如何最好地处理服务器重新启动。
步骤 3 – 更新和修复内核
Linux 内核包含(几乎)所有正在运行的硬件驱动程序,并且负责大多数低级别的系统交互。内核更新通常只需要解决一个高级别的漏洞,如果您需要使用一个公开的新内核功能,或者如果您的内核变得如此老,以至于您可能不知道的积累错误和漏洞的风险更大。
没有通用方法自动安排Linux内核更新,这是因为内核更新历史上需要完全重新启动系统,而没有对您的环境做出假设,就无法安排重新启动。
例如,您可以使用负载平衡器自动将流量重定向到可以提供相同功能的服务器(在水平扩展部署中)(https://andsky.com/tech/tutorials/architecting-applications-for-kubernetes),而它们在单独的序列中重新启动,以避免任何可见停机时间。
允许 Livepatch 在内核更新期间确保服务器运行时间
为了避免内核升级期间的停机时间,您可以使用名为现场补丁
的Linux内核功能,该功能允许在不重新启动的情况下实施内核更新。在Rocky Linux生态系统中,有两个主要的内核现场补丁维护者:Red Hat的kpatch
,该功能为Red Hat Enterprise Linux提供现场补丁,以及支持Rocky Linux以及大多数其他主要的Linux发行版的KernelCare(https://www.kernelcare.com/)。
由于Red Hat Enterprise Linux的许可模式的运作方式,在运行Rocky Linux时,您将无法通过kpatch
接收实时内核补丁 - Rocky在许多方面就像一个未经授权的Red Hat版本一样,没有办法在运行完整授权的Red Hat实例的情况下注册内核实时补丁。
1sudo dnf install kpatch-dnf
接下来,运行dnf kpatch auto
,自动订阅实时补丁服务:
1sudo dnf kpatch auto
1[secondary_label Output]
2Last metadata expiration check: 0:00:06 ago on Thu 14 Jul 2022 09:12:07 PM UTC.
3Dependencies resolved.
4Nothing to do.
5Complete!
kpatch
会检查配置的补丁服务,如果找不到,就会顺利退出。在Red Hat上,这会进行许可证检查并在Red Hat的kpatch
服务器上注册。
结论
在本教程中,您探索了多种策略来自动更新您的Rocky Linux服务器,您还了解了包存库,内核更新和处理服务器重新启动的一些细节,这些都是DevOps和更广泛地与服务器工作的重要基础,几乎所有生产配置都建立在这些核心概念之上。
接下来,您可能需要学习如何使用 Watchtower来自动更新 Docker 容器图像。