本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
安全部署更新的最佳实践
Amazon Linux 2023 (AL2023) 具有多项功能,旨在帮助安全地将更新部署到操作系统,并能够知道两次更新之间发生了哪些变化,并在必要时轻松恢复到旧版本。本节探讨了Amazon从十多年内部和外部使用 Amazon Linux 中吸取的经验教训。
警告
运行 dnf --releasever=latest update 并非最佳实践,很可能导致操作系统更新首先在生产环境中进行测试。
与其使用latest,不如使用特定的 AL2 023 发行版。这确保您在生产实例上部署的更改与先前测试的更改一致。例如,dnf --releasever=2023.9.20251117 update将始终更新到 2023.9.20251117 版本。
有关更多信息,请参阅《 AL2023 用户指南》中的 “更新 AL2 023” 部分。
如果不对操作系统更新的部署安全性进行规划,则操作系统更新 application/service 与操作系统更新之间意外负面交互的影响可能会大得多,最高可达并包括完全中断。与任何软件问题一样,问题发现得越早,对最终用户的影响就越小。
重要的是不要陷入两个根本错误的认知陷阱:
操作系统供应商在操作系统更新中永远不会犯错。
您所依赖的操作系统的特定行为或接口,与操作系统供应商认为应被依赖的行为和接口一致。
即操作系统供应商和您都认同更新可能存在问题。
不要依赖良好意愿,应建立系统确保部署安全性包含任何操作系统更新。
不建议通过部署到生产环境来测试新的操作系统更新。最佳实践是将操作系统视为部署的另一组成部分,并考虑应用您认为适用于生产环境任何其他变更的相同部署安全机制。
最佳实践是在部署到生产系统之前测试所有操作系统更新。部署时,建议采用分阶段发布并结合良好的监控。分阶段发布可以确保即使出现问题(即使不是立即出现),影响也仅限于实例集的一部分,同时可以在进行进一步调查和缓解时停止继续部署更新。
减轻操作系统更新带来的负面影响通常是首要任务,随后才是在任何可能出现问题的地方解决问题。当操作系统更新的引入与负面影响相关联时,能够回退到先前已知正常的操作系统版本是一个强大的工具。
Amazon Linux 2023 引入了 通过版本化存储库实现确定性升级,这是一个强大的新功能,旨在确保对操作系统(或单个程序包)版本的任何更改都是可重复的。因此,如果在从一个操作系统版本迁移到下一个版本时遇到问题,可以使用简单易用的机制来坚持使用已知正常工作的操作系统版本,同时找出解决问题的方法。
在 AL2 023 中,每当我们发布新的软件包更新时,都会有一个新版本需要锁定,而新 AMIs 版本则锁定到该版本。AL2023 发行说明涵盖了每个版本中的更改,并适用于 AL2023 的 Amazon Linux 安全通告涵盖了软件包更新中解决的安全问题。
例如,如果您受到 2023.6. 20241028 版本中存在的问题的影响,则可以立即恢复使用先前版本 2023.6.20241010 的 AMIs 和容器镜像。在这种情况下,某个程序包中存在一个错误,该错误在随后的 2023.6.20241031 发布版本中得到了修复,但借助 通过版本化存储库实现确定性升级,任何受影响的人都可以立即采取简单措施来缓解:只需使用先前的映像即可。
通过版本化存储库实现确定性升级还可确保任何正在进行的操作系统更新部署,无论是就地部署还是通过启动新的映像 AMIs 或容器映像,都不会受到随后发布的操作系统更新的影响。
对于我们的第一个示例,实例集 A 是一个大型实例集,在部署从 2023.5.20241001 到 2023.6.20241010 发布版本的更新过程进行到一半时,2023.6.20241028 发布版本发布了。通过版本化存储库实现确定性升级 意味着实例集 A 的部署将继续进行,其应用的更新内容不会有任何改变。
基于波浪或分阶段的部署策略(例如首先部署到实例集的 1%,然后是 5%、10%、20%、40%,直到达到 100%)的目的,是能够在更广泛推广之前以有限的方式测试变更。此类部署策略通常被认为是部署任何生产变更的最佳实践。
采用波浪式部署策略,且实例集 A 更新至 2023.6.20241010 的阶段正处于同时部署到大量主机时,得益于使用 通过版本化存储库实现确定性升级,2023.6.20241028 的发布对正在进行的部署没有影响。
如果实例集 B 运行的是较旧版本(例如 2023.5.20240708),并已开始将更新部署至 2023.6.20241028,且实例集 B 受到该版本中问题的影响,这将在部署早期被发现。此时,可以决定是暂停任何推广,直到该问题的修复可用,还是在此期间开始部署实例集 A 正在运行的相同版本 2023.6.20241010,以便实例集 B 获得 2023.5.20240708 到 2023.6.20241010 之间的所有更新。
务必注意,未能及时进行操作系统更新可能会导致问题。新更新可能包含与您环境相关的错误修复和安全修复。有关更多信息,请参阅Amazon Linux 2023 中的安全性与合规性和在 AL2023 中管理程序包和操作系统更新。。
配置部署系统使其能够轻松获取新的操作系统更新,在部署到生产环境之前进行测试,并使用波浪式部署等机制来最小化任何负面影响,这一点非常重要。为了能够减轻操作系统更新的任何负面影响,重要的是要知道如何让您的部署系统指向先前已知正常的操作系统版本,并且在问题解决后,不再锁定到旧的已知正常版本,而是迁移到新的已知正常版本。
为次要更新做准备
为操作系统的较小更新(例如 AL2 023的新单点版本)做准备工作将仅限于零努力。请务必阅读 AL2023 发行说明,了解即将发生的任何变化。
程序包的支持周期结束可能涉及迁移到较新版本的语言运行时(例如 AL2023 中的 PHP)。最佳实践是提前规划,在支持周期结束前从容地迁移到新的语言运行时版本。
对于像 pcre 版本 1 这样的程序包,也有机会提前规划并将您的任何代码迁移到其替代品,在此例中是 pcre 版本 2。最佳实践是尽快这样做,以便为任何意外情况留出时间。
在没有直接替代品的情况下,例如 Berkeley DB (libdb),您可能需要根据您的使用案例做出选择。
为主要更新做准备
更新到操作系统的新主要版本几乎普遍被认为需要规划、需要投入工作以适应已更改或已弃用的功能,并且在部署前需要进行测试。通常可以更渐进式地为下一个 Amazon Linux 2023 主要版本做准备,例如在进行下一个主要版本迁移之前,先解决任何对已弃用或已移除功能的使用问题。
例如,从023移动 AL2 到 AL2 023时,阅读该AL2 中弃用、AL2023 中移除的功能部分可能会导致许多安全而小的步骤,这些步骤可能会在使用时发生, AL2 以便为 AL2 023做准备。例如,任何 Python 2.7 已被 Python 3 所取代 的使用(操作系统使用之外的情况,例如在 yum 程序包管理器中)都可以迁移到 Python 3,为使用 AL2023 中的 Python 做准备。如果使用 PHP, AL2 (通过 PHP 8.2 E AL2 x tra)和 AL2 023 都提供 PHP 8.2,因此 PHP 版本迁移和操作系统迁移不必同时进行。
在使用 AL2 023 的同时,也可以为今天的亚马逊 Linux 2023 的下一个主要版本做准备,同时使用 AL2 023。本AL2023 中已弃用的功能节介绍了 AL2 023 年已弃用且即将移除的功能和软件包。
例如,将任何剩余的 System V init (sysvinit) 使用(例如 init 脚本)迁移到其 systemd 等效项,将使您为未来做好准备,同时也允许您使用完整的 systemd 功能集来监控服务、决定如何以及是否重启它、它需要哪些其他服务,以及是否应该应用任何资源或权限约束。
对于诸如 32 位支持之类的功能,弃用过程可能跨越操作系统的多个主要版本。对于 32 位,亚马逊 Linux 1 (AL1) 已弃用,32 位 x86(i686)AMI亚马逊 Linux 2 已弃用,亚马逊 Linux 32 位 x86(i686)程序包 2023 已弃用。32 位 x86(i686)运行时支持从 IMDSv1 的过渡也跨越了操作系统的多个主要版本。对于这些类型的变更,我们理解部分客户需要更长的时间来适应,因此在 Amazon Linux 2023 中该功能完全不可用之前,会有很大的宽限期。
已弃用功能列表会在操作系统的生命周期内更新,建议随时关注其变更。