使用 Terraform 部署和管理 Control Tower AWS 控件 - AWS Prescriptive Guidance

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

使用 Terraform 部署和管理 Control Tower AWS 控件

由 Iker Reina Fuente (AWS) 和 Ivan Girardi () 创作 AWS

代码库:使用 Terraform 部署和管理 Control Tower AWS 控件

环境:生产

技术:安全、身份、合规; CloudNative;基础架构;管理和治理

工作负载:开源

AWS服务:Cont AWS rol Tower;AWS组织

Summary

此模式描述了如何使用 Control Tower AWS 控件、 HashiCorp Terraform 和基础设施即代码 (IaC) 来实施和管理预防、侦查和主动安全控制。控件(也称为护栏)是一条高级规则,可为您的整个 Cont AWS rol Tower 环境提供持续的管理。例如,您可以使用控件要求您的AWS账户进行登录,然后在发生特定的安全相关事件时配置自动通知。

AWSControl Tower 可帮助您实施预防性、侦查性和主动控制措施,以管理您的AWS资源并监控多个AWS账户的合规性。每个控件都会强制执行一条规则。在此模式中,您使用提供的 IaC 模板来指定要在环境中部署哪些控件。

AWSControl Tower 控件适用于整个组织单位 (OU),该控制会影响组织单位内的每个AWS帐户。因此,当用户在您的登录区中的任何账户中执行任何操作时,该操作将受到管理 OU 的控制的约束。

实施 Contro AWS l Tower 控制有助于为您的AWS着陆区奠定坚实的安全基础。通过使用此模式通过 Terraform 将控件部署为 IaC,可以标准化登录区中的控件,并更有效地部署和管理它们。

要将 Cont AWS rol Tower 控件部署为 IaC,你也可以使用 AWS Cloud Development Kit (AWSCDK) 代替 Terraform。有关更多信息,请参阅使用AWSCDK和部署和管理 Cont AWS rol Tower 控件AWS CloudFormation

目标受众

建议有使用 Cont AWS rol Tower、Terraform 和 Organizations 经验的用户使用此模式。AWS

先决条件和限制

先决条件

  • 在 Organizations 和 Cont AWS rol Tower 着陆区中作为AWS组织管理的活跃AWS账户。有关说明,请参阅创建账户结构(Well-Ar chitect AWS ed Labs)。

  • AWS命令行界面 (AWSCLI),已安装配置

  • 管理账户中的 AWS Identity and Access Management (IAM) 角色,有权部署此模式。有关所需权限和示例策略的更多信息,请参阅此模式的 “其他信息” 部分中的IAM角色的最低权限权限

  • 在管理账户中IAM担任该角色的权限。

  • 使用标识符 CT 应用基于服务控制策略 (SCP) 的控制。 CLOUDFORMATION.PR.1。SCP必须激活此功能才能部署主动控制。有关说明,请参阅不允许在AWS CloudFormation 注册表中管理资源类型、模块和挂钩

  • TerraformCLI,已安装(Terraform 文档)。

  • Terraform P AWS rovider,已配置(Terraform 文档)。

  • Terraform 后端,已配置(Terraform 文档)。

产品版本

  • AWSControl Tower 版本 3.0 或更高版本

  • 对于 460.39 及以上版本:

  • Terraform P AWS rovider 版本 4.67 或更高版本

架构

目标架构

本部分概括介绍此解决方案,以及由示例代码建立的架构。下图显示了跨 OU 中的各个账户部署的控件。

跨组织单位所有AWS账户部署的控件架构图。

AWSControl Tower 控件根据其行为指导进行分类。

控制行主要包含三种类型:

  1. 预防性控制旨在防止行动发生。这些策略是通过 Organi zations 中的服务控制策略 (SCPs) AWS 实现的。预防性控制的状态为强制实施未启用。所有AWS地区都支持预防性控制。

  2. Det@@ ective 控件旨在在特定事件发生时对其进行检测并记录操作 CloudTrail。这些都是通过 AWSConfig 规则实现的。检测性控制的状态为合规违规未启用。Detective 控制仅适用于 Cont AWS rol Tower 支持的AWS区域。

  3. 主动控制会扫描将由配置的资源,AWS CloudFormation 并检查它们是否符合贵公司的政策和目标。不合规的资源将不会被配置。这些都是用AWS CloudFormation 钩子实现的。主动控制的状态为PASSFAIL、或SKIP

控制指导是如何将每种控制应用于您的控制的推荐做法OUs。AWSControl Tower 提供三类指导:修、强烈推荐选修。控制指导与其行为无关。有关更多信息,请参阅控制行为和指导

工具

AWS服务

  • AWS CloudFormation帮助您设置AWS资源,快速一致地配置资源,并在各个AWS账户和地区的整个生命周期中对其进行管理。

  • AWSConfig 提供了您AWS账户中的资源及其配置方式的详细视图。它可以帮助您确定资源之间的关联方式,以及它们的配置如何随时间变化。

  • AWSCont@@ rol Tower 可帮助您按照规范性最佳做法设置和管理AWS多账户环境。

  • AWSO rganizations 是一项账户管理服务,可帮助您将多个AWS账户整合到一个由您创建和集中管理的组织中。

其他工具

  • HashiCorp Terraform 是一种开源基础设施即代码 (IaC) 工具,可帮助您使用代码来配置和管理云基础架构和资源。

代码存储库

此模式的代码可在使用 Terraform 存储库 GitHub 部署和管理 Control Tower AWS 控件中找到。

最佳实践

操作说明

任务描述所需技能

克隆存储库。

在 bash Shell 中输入以下命令:这将使用来自的 Terraform 存储库克隆部署和管理 Control Tower AWS 控件。 GitHub

git clone https://github.com/aws-samples/aws-control-tower-controls-terraform.git
DevOps 工程师

编辑 Terraform 后端和配置文件。

  1. 在克隆的存储库中,打开 backend.tf 文件。

  2. 编辑文件,以设置 Terraform 后端配置。您在此文件中定义的配置取决于环境。有关更多信息,请参阅后端配置(Terraform 文档)。

  3. 保存并关闭 backend.tf 文件。

DevOps 工程师,Terraform

编辑 Terraform 提供程序配置文件。

  1. 在克隆的存储库中,打开 provider.tf 文件。

  2. 编辑文件,以设置 Terraform 提供程序配置。有关更多信息,请参阅提供程序配置(Terraform 文档)。将该AWS区域设置为可用 Cont AWS rol Tower API 的区域。

  3. 保存并关闭 provider.tf 文件。

DevOps 工程师,Terraform

编辑配置文件。

  1. 在克隆的存储库中,打开 variables.tfvars 文件。

  2. 在该controls部分的control_names参数中,输入控件API标识符。对于可用 Control Tower 的每个区域,每个AWS控件都有一个唯一的API标识符。若要查找控件标识符,请执行以下操作:

    1. 控件元数据表,找到要启用的控件。

    2. 在 “按区域控制API标识API符” 列中,找到您正在进行API呼叫的区域的标识符,例如arn:aws:controltower:us-east-1::control/AWS-GR_AUDIT_BUCKET_ENCRYPTION_ENABLED

    3. 从区域标识符中提取控制标识符,例如 AWS-GR_AUDIT_BUCKET_ENCRYPTION_ENABLED

  3. 在该 controls 部分的 organizational_unit_ids 参数中,输入要在其中启用控件的组织单位的 ID,例如 ou-1111-11111111。用双引号输入 ID,并IDs用逗号分隔多个标识。有关如何检索 OU 的更多信息IDs,请参阅查看 OU 的详细信息

  4. 保存并关闭 variables.tfvars 文件。有关已更新的 variables.tfvars 文件示例,请参阅此模式的其他信息部分。

DevOps 工程师,将军AWS,Terraform

在管理账户中IAM扮演该角色。

在管理账户中,IAM扮演有权部署 Terraform 配置文件的角色。有关所需权限和示例策略的更多信息,请参阅 “其他信息” 部分中的IAM角色的最低权限权限。有关在中担任IAM角色的更多信息 AWSCLI,请参阅中的使用IAM角色AWSCLI

DevOps 工程师,将军 AWS

部署配置文件。

  1. 输入以下命令,以初始化 Terraform。

    $ terraform init -upgrade
  2. 输入以下命令,以预览与当前状态对比的更改。

    $ terraform plan -var-file="variables.tfvars"
  3. 查看 Terraform 计划中的配置更改,并确认您想要在组织中实施这些更改。

  4. 输入以下命令以部署资源。

    $ terraform apply -var-file="variables.tfvars"
DevOps 工程师,将军AWS,Terraform
任务描述所需技能

运行销毁命令。

输入以下命令,以删除此模式部署的资源。

$ terraform destroy -var-file="variables.tfvars"
DevOps 工程师,将军AWS,Terraform

故障排除

问题解决方案

Error: creating ControlTower Control ValidationException: Guardrail <control ID> is already enabled on organizational unit <OU ID> 错误

您尝试启用的控件已经在目标 OU 中启用。如果用户通过AWS管理控制台、Control Tower 或 Organizations 手动启用AWS控件,则可能会发生此错误。AWS若要部署 Terraform 配置文件,您可以使用以下任一选项。

选项 1:更新 Terraform 当前状态文件

您可以将资源导入至 Terraform 当前状态文件。当您重新运行 apply 命令时,Terraform 将跳过这个资源。执行以下操作,将资源导入至当前 Terraform 状态:

  1. 在 Cont AWS rol Tower 管理账户中,输入以下命令以检索的亚马逊资源名称列表 (ARNs)OUs,其中<root-ID>是组织根目录。有关检索此 ID 的更多信息,请参见查看根的详细信息

    aws organizations list-organizational-units-for-parent --parent-id <root-ID>
  2. 对于上一步中返回的每个 OU,输入以下命令,ARN其中<OU-ARN>是 OU 的。

    aws controltower list-enabled-controls --target-identifier <OU-ARN>
  3. 复制ARNs并在所需模块中执行 Terraform 导入,使其包含在 Terraform 状态中。有关说明,请参阅导入(Terraform 文档)。

  4. 重复操作说明部分部署配置中的步骤。

选项 2:禁用控件

如果您在非生产环境中工作,可以禁用控制台中的控件。重复操作说明部分部署配置中的步骤即可将其重新启用。不建议在生产环境中使用此方法,因为有一段时间该控件会被禁用。如果要在生产环境中使用此选项,则可以实施临时控制,例如在 Organizations SCP 中临时AWS应用。

相关资源

AWS文档

其他资源

其他信息

Example variables.tfvars 文件

以下是更新的 variables.tfvars 文件的示例。

controls = [ { control_names = [ "AWS-GR_ENCRYPTED_VOLUMES", ... ], organizational_unit_ids = ["ou-1111-11111111", "ou-2222-22222222"...], }, { control_names = [ "AWS-GR_SUBNET_AUTO_ASSIGN_PUBLIC_IP_DISABLED", ... ], organizational_unit_ids = ["ou-1111-11111111"...], }, ]

该IAM角色的最低特权权限

这种APG模式要求您在管理账户中IAM扮演一个角色。最佳做法是承担具有临时权限的角色,并根据最低权限原则限制权限。以下示例策略允许执行启用或禁用 Cont AWS rol Tower 控件所需的最少操作。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "controltower:EnableControl", "controltower:DisableControl", "controltower:GetControlOperation", "controltower:ListEnabledControls", "organizations:AttachPolicy", "organizations:CreatePolicy", "organizations:DeletePolicy", "organizations:DescribeOrganization", "organizations:DetachPolicy", "organizations:ListAccounts", "organizations:ListAWSServiceAccessForOrganization", "organizations:ListChildren", "organizations:ListOrganizationalUnitsForParent", "organizations:ListParents", "organizations:ListPoliciesForTarget", "organizations:ListRoots", "organizations:UpdatePolicy" ], "Resource": "*" } ] }