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