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

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

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

由迈克·圣克罗斯 (AWS) 和安德鲁·雷恩斯 () 创作 AWS

摘要

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

该版本包括两 EventBridge 条 Amazon 规则。一条规则是,当 Amazon Inspector 调查发现严重时,将启动容器映像管线,以便替换不安全的映像。此规则要求同时启用 Amazon Inspector 和亚马逊弹性容器注册表(亚马逊ECR)增强型扫描。另一条规则在成功将图像推送到亚马逊ECR存储库后,向亚马逊简单队列服务 (AmazonSQS) 队列发送通知,以帮助您使用最新的容器映像。

注意

亚马逊 Linux 2 的支持已接近终止。欲了解更多信息,请参阅亚马逊 Linux 2 FAQs

先决条件和限制

先决条件

  • 您可以在其中部署基础架构的AWS账户

  • AWS已安装命令行界面 (AWSCLI),用于设置本地部署的AWS凭据。

  • 已按照 Terraform 文档中的说明下载 Terraform 并设置。

  • Git(如果您从本地计算机进行预调配)。

  • AWS账户中的一个角色,可用于创建AWS资源。

  • .tfvars 文件中定义的所有变量。 或者,您可在应用 Terraform 配置时定义所有变量。

限制

产品版本

  • Amazon Linux 2

  • AWSCLI版本 1.1 或更高版本

架构

目标技术堆栈

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

  • 两个 Amazon Simple Storage Servic e (Amazon S3) 存储桶:一个用于管道组件文件,一个用于服务器访问和亚马逊流日志 VPC

  • 亚马逊ECR存储库

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

  • I EC2 mage Builder 管道、配方和组件

  • 容器映像

  • 用于图像加密的AWS密钥管理服务 (AWSKMS) 密钥

  • 一个 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包含亚马逊弹性计算云 (AmazonIAM) 实例配置文件和管道部署角色的 Ident AWS ity and Access Management (EC2) 策略定义。

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

目标架构

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

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

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

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

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

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

自动化和扩缩

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

  • 要实现规模化使用,请从 Control Tower 或 landing zone 账户模式将解决方案部署到一个中央账户,例如共享服务账户或公共服务账户,并向消费者账户授予访问亚马逊ECR存储库和AWSKMS密钥的权限。有关设置的更多信息,请参阅 re: Post 文章如何允许辅助账户在我的 Ama ECR zon 图像存储库中推送或拉取图片? 例如,在账户自动售货机或 Account Factory for Terraform 中,向每个账户基准或账户自定义基准添加权限,以提供对该亚马逊ECR存储库和加密密钥的访问权限。

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

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

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

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

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

工具

工具

  • Terraform(IaC 预调配)

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

  • AWSCLI版本 1 或版本 2(如果在本地配置)

代码

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

操作说明

任务描述所需技能

设置本地凭证。

设置您的AWS临时证书。

  1. 查看AWSCLI是否已安装:

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

    • 如果找不到该命令,请安装AWSCLI

  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或安全外壳 (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 基础设施配置要使用的AWSKMS密钥名称。

  • 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 (AmazonEBS) 根卷的大小(以 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 个以上组件中的任何一个来自定义容器构建。有关更多信息,请参阅 I EC2 mage 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.

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

要解决此错误,请参阅AWSCLI文档中的设置和查看配置设置

相关资源