SEC06-BP02 从强化映像预置计算 - AWS Well-Architected 框架

SEC06-BP02 从强化映像预置计算

通过从强化映像部署运行时环境,减少意外访问运行时环境的机会。只从可信注册表获取运行时依赖项(例如容器映像和应用程序库),并验证其签名。创建自己的专用注册表来存储可信映像和库,供构建和部署流程使用。

期望结果:您的计算资源是从强化的基准映像预置的。您只从可信注册表检索外部依赖项(例如容器映像和应用程序库),并验证其签名。这些依赖项存储在专用注册表中,供构建和部署流程参考。您会定期扫描和更新映像和依赖项,以便于应对任何新发现的漏洞。

常见反模式:

  • 从可信注册表获取映像和库,但在投入使用前不验证其签名或进行漏洞扫描。

  • 强化映像,但没有定期测试映像是否存在新漏洞或更新到最新版本。

  • 安装或不删除在映像预期生命周期内不需要的软件包。

  • 仅依靠打补丁来保持生产计算资源的最新状态。随着时间的推移,仅靠打补丁仍会导致计算资源偏离强化标准。打补丁也可能无法清除威胁行为者在安全事件中安装的恶意软件。

建立此最佳实践的好处:强化映像有助于减少在运行时环境中,可能允许未经授权的用户或服务进行意外访问的路径数量。如果发生任何意外访问,强化映像还可以缩小影响范围。

在未建立这种最佳实践的情况下暴露的风险等级:

实施指导

要强化系统,请从最新版本的操作系统、容器映像和应用程序库开始。应用补丁以解决已知问题。删除所有不需要的应用程序、服务、设备驱动程序、默认用户和其它凭证,尽量减小系统。采取其它任何必要操作,例如禁用端口,以便创建一个只拥有工作负载所需资源和功能的环境。在此基础上,您可以安装必要的软件、代理或其它进程,以满足监控工作负载或管理漏洞等目的的需要。

您可以遵循可信来源提供的指导,如互联网安全中心(CIS,Center for Internet Security)以及美国国防信息系统局(DISA,Defense Information Systems Agency)的安全技术实施指南(STIG),从而减轻强化系统的负担。我们建议您从 AWS 或 APN 合作伙伴发布的亚马逊机器映像(AMI)开始,并使用 AWS EC2 Image Builder,以期综合使用 CIS 和 STIG 控制措施来自动配置。

虽然有可用的强化映像和 EC2 Image Builder 配方可应用 CIS 或 DISA STIG 建议,但您可能会发现,它们的配置会阻止您的软件成功运行。在这种情况下,您可以从未经强化的基础映像开始,安装软件,然后逐步应用 CIS 控制措施来测试其影响。对于任何阻止软件运行的 CIS 控制措施,请测试是否可以改为在 DISA 中实施更精细的强化建议。跟踪您能够成功应用的不同 CIS 控制措施和 DISA STIG 配置。在 EC2 Image Builder 中使用这些控制措施和配置,相应地定义映像强化配方。

对于容器化工作负载,Amazon Elastic Container Registry(ECR)公共存储库提供 Docker 的强化映像。您可以结合使用 EC2 Image Builder 与 AMI 来强化容器映像。

与操作系统和容器映像类似,您可以通过 pip、npm、Maven 和 NuGet 等工具,从公共存储库中获取代码包(或)。我们建议您将私有存储库(例如在 AWS CodeArtifact 中)与可信的公共存储库进行集成,来管理代码包。这种集成可为您处理代码包的检索、存储和保持最新状态。然后,您的应用程序构建流程就可以使用一些技术 [例如软件组成分析(SCA,Software Composition Analysis)、静态应用程序安全测试(SAST,Static Application Security Testing)和动态应用程序安全测试(DAST,Dynamic Application Security Testing)等],与您的应用程序一起获取和测试这些代码包的最新版本。

对于使用 AWS Lambda 的无服务器工作负载,可使用 Lambda 层简化对代码包依赖项的管理。使用 Lambda 层将不同函数之间共享的一组标准依赖项配置到独立的存档中。您可以通过自己的构建流程来创建和维护层,从而能够以集中方式使您的函数保持最新状态。

实施步骤

  • 强化操作系统。使用来自可信来源的基础映像为基础,来构建强化的 AMI。使用 EC2 Image Builder 来帮助自定义安装在映像上的软件。

  • 强化容器化资源。配置容器化资源以符合安全最佳实践。当使用容器时,在您的构建管道中对您的映像存储库定期实施 ECR 映像扫描,以便在您的容器中查找 CVE。 

  • 在使用 AWS Lambda 实现无服务器时,请使用 Lambda 层来隔离应用程序函数代码和共享的依赖项库。为 Lambda 配置代码签名,以便确保只有可信代码才能在您的 Lambda 函数中运行。

资源

相关最佳实践:

相关视频:

相关示例: