使用 EC2 Image Builder 和 Terraform 为经过强化的容器映像构建管线 - AWS Prescriptive Guidance

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 EC2 Image Builder 和 Terraform 为经过强化的容器映像构建管线

创建者:Mike Saintcross (AWS) 和 Andrew Ranes (AWS)

代码存储库:Terraform EC2 Image Builder 容器强化管道

环境:生产

来源:Packer、Chef 或 Pure Ansible

目标:EC2 Image Builder

R 类型:重构

工作负载:开源

技术:安全、身份、合规; DevOps

Amazon Web Services:Amazon EC2 Container Registry;Amazon EC2 Image Builder

Summary

此模式构建一个 EC2 Image Builder 管线,用于生成经过强化的 Amazon Linux 2 基础容器映像。Terraform 用作基础设施即代码(IaC)工具,它可配置和预调配基础设施用于创建经过强化的容器映像。该配方可帮助您部署基于 Docker 的 Amazon Linux 2 容器映像,该映像已根据 Red Hat Enterprise Linux (RHEL) 7 STIG 版本 3 第 7 版—Medium 进行了强化。(请参阅 EC2 Image Builder 文档的 Linux STIG 组件部分中的 STIG-Build-Linux-Medium 版本 2022.2.1。) 这被称为黄金容器映像。

该版本包括两 EventBridge 条 Amazon 规则。一条规则是,当 Amazon Inspector 调查发现严重时,将启动容器映像管线,以便替换不安全的映像。这条规则要求同时启用 Amazon Inspector 和 Amazon Elastic Container Registry (Amazon ECR) 增强型扫描。另一条规则在成功将映像推送到 Amazon ECR 存储库后,向 Amazon Simple Queue Service (Amazon SQS) 队列发送通知,以帮助您使用最新的容器映像。

先决条件和限制

先决条件

限制

产品版本

  • Amazon Linux 2

  • AWS CLI 版本 1.1 或更高版本

架构

目标技术堆栈

这种模式创建 43 项资源,包括:

  • 两个 Amazon Simple Storage Service (Amazon S3) 存储桶:一个用于管线组件文件,一个用于服务器访问和 Amazon VPC 流日志

  • Amazon ECR 存储库

  • 包含一个公有子网、一个私有子网、一个私有子网、路由表、一个 NAT 网关以及一个互联网网关的虚拟私有云(VPC)

  • EC2 Image Builder 管线、配方和组件

  • 容器映像

  • AWS Key Management Service (AWS KMS) 密钥,用于映像加密

  • SQS 队列

  • 三个角色:一个用于运行 EC2 Image Builder 管道,一个用于 EC2 Image Builder 的实例配置文件,一个用于 EventBridge 规则

  • 两 EventBridge 条规则

Terraform 模块结构

有关源代码,请参阅 GitHub 存储库 Terraform EC2 Image Builder 容器强化管道。

├── components.tf ├── config.tf ├── dist-config.tf ├── files │ └──assumption-policy.json ├── hardening-pipeline.tfvars ├── image.tf ├── infr-config.tf ├── infra-network-config.tf ├── kms-key.tf ├── main.tf ├── outputs.tf ├── pipeline.tf ├── recipes.tf ├── roles.tf ├── sec-groups.tf ├── trigger-build.tf └── variables.tf

模块详细信息

  • components.tf 包含用于上传 /files 目录内容的 Amazon S3 上传资源。您也可在此处以模块化方式添加自定义组件 YAML 文件。

  • /files 包含用来定义 components.tf 中所用组件的 .yml 文件。

  • image.tf 包含基本映像操作系统的定义。在这里,您可修改不同基础映像管线的定义。

  • infr-config.tfdist-config.tf 包含启动和分发映像所需最低 AWS 基础设施所需资源。

  • infra-network-config.tf 包含要将容器映像部署到的最低 VPC 基础设施。

  • hardening-pipeline.tfvars 包含要在应用时所用的 Terraform 变量。

  • pipeline.tf 在 Terraform 创建和管理 EC2 Image Builder 管线。

  • recipes.tf 是您可以指定不同的组件混合物来创建容器配方的位置。

  • roles.tf 包含 Amazon Elastic Compute Cloud(Amazon EC2) 实例配置文件和管线部署角色的 AWS Identity and Acess Management (IAM) policy 定义。

  • trigger-build.tf包含 EventBridge 规则和 SQS 队列资源。

目标架构

用于为经过强化的容器映像构建管线的架构和工作流程

该图说明了以下工作流程:

  1. EC2 Image Builder 使用定义的配方构建容器映像,该配方安装操作系统更新并将 RHEL Medium STIG 应用于 Amazon Linux 2 基础映像。

  2. 经过强化的映像将发布到私有 Amazon ECR 注册表,成功发布映像后, EventBridge 规则会向 SQS 队列发送一条消息。

  3. 如果 Amazon Inspector 配置为增强扫描,它将扫描 Amazon ECR 注册表。

  4. 如果 Amazon Inspector 为图像生成了严重性或严重性检测结果, EventBridge 则规则会触发 EC2 Image Builder 管道再次运行并发布经过强化处理的新映像。

自动化和扩缩

  • 此模式描述了如何在计算机上预调配基础设施并构建管线。但是它旨在大规模使用。与其在本地部署 Terraform 模块,不如在多账户环境中使用它们,例如带有 Account Factory for Terraform 环境的 AWS Control Tower。在这种情况下,您应该使用后端状态 S3 存储桶管理 Terraform 状态文件,而不是在本地管理配置状态。

  • 为了扩大使用范围,可将解决方案从 Control Tower 或登录区账户模型部署到一个中央账户,例如共享服务或公共服务账户,并授予消费者账户访问 Amazon ECR 存储库和 AWS KMS 密钥的权限。有关设置的更多信息,请参阅 re:Post 文章如何允许辅助账户在我的 Amazon ECR 映像存储库中推送或拉取图片? 例如,在账户自动售卖机或 Account Factory for Terraform 中,向每个账户基准或账户自定义基准添加权限,以提供对该 Amazon ECR 存储库和加密密钥的访问权限。

  • 部署容器映像管线后,您可使用 EC2 Image Builder 功能(例如组件)对其进行修改,这些功能可帮助您将更多组件打包到 Docker 版本中。

  • 用于加密容器映像的 AWS KMS 密钥应在要使用该映像的账户之间共享。

  • 您可通过复制整个 Terraform 模块并修改以下 recipes.tf 属性来添加对其他映像的支持:

    • parent_image = "amazonlinux:latest" 修改为其他映像类型。

    • repository_name 修改为指向现有的 Amazon ECR 存储库。这将创建另一个管线,该管线将不同的父映像类型部署到您现有的 Amazon ECR 存储库。

工具

工具

  • Terraform(IaC 预调配)

  • Git(如果在本地预调配)

  • AWS CLI 版本 1 或版本 2(如果在本地预调配)

代码

此模式的代码位于 GitHub 存储库 Terraform EC2 Image Builder 容器强化管道中。要使用示例代码,请按照下一部分中的说明进行操作。

操作说明

任务描述所需技能

设置本地凭证。

设置您的 AWS 临时凭证。

  1. 查看 AWS CLI 是否已安装:

    $ aws --version aws-cli/1.16.249 Python/3.6.8...
    • AWS CLI 版本应为 1.1 或更高版本。

    • 如果找不到该命令,安装 AWS CLI

  2. 运行 aws configure 并提供以下值:

    $ aws configure AWS Access Key ID [*************xxxx]: <Your AWS access key ID> AWS Secret Access Key [**************xxxx]: <Your AWS secret access key> Default region name: [us-east-1]: <Your desired Region for deployment> Default output format [None]: <Your desired output format>
AWS DevOps

克隆存储库。

  1. 克隆随此模式提供的存储库。您可使用 HTTPS 或 Secure Shell (SSH)。

    HTTPS:

    git clone https://github.com/aws-samples/terraform-ec2-image-builder-container-hardening-pipeline

    SSH:

    git clone git@github.com:aws-samples/terraform-ec2-image-builder-container-hardening-pipeline.git
  2. 导航到包含此解决方案的本地目录:

    cd terraform-ec2-image-builder-container-hardening-pipeline
AWS DevOps

更新变量。

更新 hardening-pipeline.tfvars 文件中的变量以匹配您的环境和所需配置。您必须自己提供 account_id。但是,您还应该修改其余变量,以适应所需部署。所有变量均为必需项。

account_id = "<DEPLOYMENT-ACCOUNT-ID>" aws_region = "us-east-1" vpc_name = "example-hardening-pipeline-vpc" kms_key_alias = "image-builder-container-key" ec2_iam_role_name = "example-hardening-instance-role" hardening_pipeline_role_name = "example-hardening-pipeline-role" aws_s3_ami_resources_bucket = "example-hardening-ami-resources-bucket-0123" image_name = "example-hardening-al2-container-image" ecr_name = "example-hardening-container-repo" recipe_version = "1.0.0" ebs_root_vol_size = 10

以下是关于每个变量的描述:

  • account_id − 您要将解决方案部署到的 AWS 账号。

  • aws_region − 您要将解决方案部署到的 AWS 区域。

  • vpc_name − 您的 VPC 基础设施的名称。

  • kms_key_alias − EC2 Image Builder 基础设施配置要使用的 AWS KMS 密钥名称。

  • ec2_iam_role_name − 将用作 EC2 实例配置文件的角色的名称。

  • hardening_pipeline_role_name − 将用于部署强化管线的角色的名称。

  • aws_s3_ami_resources_bucket − S3 存储桶的名称,该存储桶将托管构建管线和容器映像所需所有文件。

  • image_name − 容器映像名称。此值必须介于 3 到 50 个字符间,并且只能包含字母数字字符和连字符。

  • ecr_name − 用于存储容器映像的 Amazon ECR 注册表的名称。

  • recipe_version ‒ 映像配方的版本。默认值为 1.0.0。

  • ebs_root_vol_size ‒ Amazon Elastic Block Store (Amazon EBS) 根卷的大小(以 GB 为单位)。默认值为 10 GB。

AWS DevOps

初始化 Terraform。

更新变量值后,您可初始化 Terraform 配置目录。初始化配置目录会下载并安装配置中定义的 AWS 提供程序。

terraform init

您应该看到一条消息,指出 Terraform 已成功初始化并标识了已安装的提供程序的版本。

AWS DevOps

部署基础设施并创建容器映像。

使用以下命令通过使用 .tfvars 文件中定义的变量来初始化、验证 Terraform 模块并将其应用于环境:

terraform init && terraform validate && terraform apply -var-file *.tfvars -auto-approve
AWS DevOps

自定义容器。

在 EC2 Image Builder 部署管线和初始配方后,您可创建容器配方的新版本。

您可添加 EC2 Image Builder 中可用的 31 多个组件中的任何一个来自定义容器构建。有关更多信息,请参阅 EC2 Image Builder 文档中的创建新版本的容器配方组件部分。

AWS 管理员
任务描述所需技能

验证 AWS 基础设施预调配。

成功完成第一个 Terraform apply 命令后,如果您在本地预调配,则应在本地计算机的终端中看到以下片段:

Apply complete! Resources: 43 added, 0 changed, 0 destroyed.
AWS DevOps

验证各个 AWS 基础设施资源。

要验证已部署的各个资源,如果您在本地预调配,则可以运行以下命令:

terraform state list

此命令将返回 43 项资源列表。

AWS DevOps
任务描述所需技能

移除基础设施和容器映像。

使用 Terraform 配置后,可运行以下命令来移除资源:

terraform init && terraform validate && terraform destroy -var-file *.tfvars -auto-approve
AWS DevOps

故障排除

问题解决方案

验证提供商凭证时出错

在本地计算机上运行 Terraform applydestroy 命令时,可能会遇到类似以下内容的错误:

Error: configuring Terraform AWS Provider: error validating provider credentials: error calling sts:GetCallerIdentity: operation error STS: GetCallerIdentity, https response error StatusCode: 403, RequestID: 123456a9-fbc1-40ed-b8d8-513d0133ba7f, api error InvalidClientTokenId: The security token included in the request is invalid.

此错误是由本地计算机配置中使用的凭证安全令牌过期引起的。

要解决该错误,请参阅 AWS CLI 文档中的设置和查看配置设置

相关资源