

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

# 使用 AWS CDK 和来部署和管理 AWS Control Tower 控件 CloudFormation
<a name="deploy-and-manage-aws-control-tower-controls-by-using-aws-cdk-and-aws-cloudformation"></a>

*Iker Reina Fuente 和 Ivan Girardi，Amazon Web Services*

## Summary
<a name="deploy-and-manage-aws-control-tower-controls-by-using-aws-cdk-and-aws-cloudformation-summary"></a>

此模式描述了如何使用 AWS CloudFormation 、实施和管理预防、侦查和主动 AWS Control Tower 控制作为基础架构即代码 (IaC)。 AWS Cloud Development Kit (AWS CDK) [控制](https://docs.aws.amazon.com/controltower/latest/controlreference/controls.html)（也称为*护栏*）是一条高级规则，可为您的整体 AWS Control Tower 环境提供持续的治理。例如，您可以使用控件要求记录您的信息， AWS 账户 然后在发生特定的安全相关事件时配置自动通知。

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

AWS Control Tower 控件适用于整个[组织单位 (OU)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_getting-started_concepts.html#organizationalunit)，而控制会影响组织单位 AWS 账户 内的每个单位。因此，当用户在您的登录区中的任何账户中执行任何操作时，该操作将受到管理 OU 的控制的约束。

实施 AWS Control Tower 控制措施有助于为您的 AWS 着陆区（Landing zone）奠定坚实的安全基础。通过使用这种模式将控件部署为 IaC 直至 CloudFormation 和 AWS CDK，您可以标准化着陆区域中的控件，并更有效地部署和管理它们。此解决方案在部署期间使用 [cdk\$1nag](https://github.com/cdklabs/cdk-nag#readme) 来扫描应用程序。 AWS CDK 此工具会检查应用程序是否符合 AWS 最佳实践。

要将 AWS Control Tower 控件部署为 IaC，也可以使用 HashiCorp Terraform 来代替。 AWS CDK有关更多信息，请参阅[使用 Terraform 部署和管理 AWS Control Tower 控件](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/deploy-and-manage-aws-control-tower-controls-by-using-terraform.html)。

**目标受众**

建议有使用 AWS Control Tower、 CloudFormation AWS CDK、和经验的用户使用此模式 AWS Organizations。

## 先决条件和限制
<a name="deploy-and-manage-aws-control-tower-controls-by-using-aws-cdk-and-aws-cloudformation-prereqs"></a>

**先决条件**
+ 作为一个组织在 AWS Organizations 和一个 AWS Control Tower 着陆区进行主动 AWS 账户 管理。有关说明，请参阅 AWS Control Tower 文档中的[入门](https://docs.aws.amazon.com/controltower/latest/userguide/getting-started-with-control-tower.html)。
+ AWS Command Line Interface (AWS CLI)，[已安装](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)并[配置](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html)。
+ Node package manager（npm），已为 AWS CDK[安装和配置](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm)。
+ 的@@ [先决条件](https://docs.aws.amazon.com/cdk/v2/guide/work-with.html#work-with-prerequisites) AWS CDK。
+ 在部署账户中担任现有 AWS Identity and Access Management (IAM) 角色的权限。
+ 在组织管理账户中担任可用于引导 AWS CDK的 IAM 角色的权限。该角色必须具有修改和部署 CloudFormation 资源的权限。有关更多信息，请参阅[文档中的引导](https://docs.aws.amazon.com/cdk/v2/guide/bootstrapping.html#bootstrapping-howto)。 AWS CDK 
+ 在组织的管理账户中创建 IAM 角色和策略的权限。有关更多信息，请参阅 IAM 文档中的[访问 IAM 资源所需权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_permissions-required.html)。

**限制**
+ 此模式提供了跨 AWS 账户部署此解决方案（从部署账户到组织管理账户）的说明。出于测试目的，您可直接在管理账户中部署此解决方案，但未明确提供此配置的说明。
+ 对于 AWS Control Tower 控件，此模式需要使用以下格式的[全局标识符](https://docs.aws.amazon.com/controltower/latest/controlreference/all-global-identifiers.html)：

  ```
  arn:<PARTITION>:controlcatalog:::control/<CONTROL_CATALOG_OPAQUE_ID>
  ```

  此模式的先前版本使用了不再支持的[区域标识符](https://docs.aws.amazon.com/controltower/latest/controlreference/control-metadata-tables.html)。我们建议您从区域标识符迁移到全局标识符。全局标识符可帮助您管理控件并扩大可使用的控件数量。
**注意**  
在大多数情况下，`<PARTITION>` 的值为 `aws`。

**产品版本**
+ AWS Control Tower 版本 3.2 或更高版本
+ Python 版本 3.9 或更高版本
+ npm 版本 8.9.0 或更高版本

## 架构
<a name="deploy-and-manage-aws-control-tower-controls-by-using-aws-cdk-and-aws-cloudformation-architecture"></a>

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

![\[组织单位中所有 Amazon Web Services account 部署的控制架构图。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/7d0d5e37-58ac-4621-b6b0-cb8c1c767ab0/images/47264166-3294-4a53-b0a4-5911086d636f.png)


AWS Control Tower 控制是根据其*行为*和*指导*进行分类的。

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

1. *预防性控制*旨在防止行动发生。这些策略是通过中的[服务控制策略 (SCPs)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html) 或[资源控制策略 (RCPs)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_rcps.html) 来实现的 AWS Organizations。预防性控制的状态为**强制实施**或**未启用**。所有方面都支持预防性控制 AWS 区域。

1. *检测性控件*旨在在特定事件发生时对其进行检测并将操作记录在 AWS CloudTrail中。这些都是通过 [AWS Config 规则](https://docs.aws.amazon.com/config/latest/developerguide/evaluate-config.html)实施。检测性控制的状态为**合规**、**违规**或**未启用**。Detective 控件仅适用于 AWS 区域 支持的控件 AWS Control Tower。

1. *主动控制*会扫描将由配置的资源， AWS CloudFormation 并检查它们是否符合贵公司的政策和目标。不合规的资源将不会被配置。这些都是通过 [AWS CloudFormation 钩子](https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/hooks.html)实施。主动控制的状态为**通过**、**失败**或**跳过**。

控制*指南是指有关*如何将每种控制应用于您的控制的推荐做法 OUs。 AWS Control Tower 提供三类指导：*必*修指导、*强烈推荐*指导和*选修*指导。控制指导与其行为无关。有关更多信息，请参阅[控制行为和指导](https://docs.aws.amazon.com/controltower/latest/userguide/controls.html#control-behavior)。

## 工具
<a name="deploy-and-manage-aws-control-tower-controls-by-using-aws-cdk-and-aws-cloudformation-tools"></a>

**AWS 服务**
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/v2/guide/home.html)是一个软件开发框架，可帮助您在代码中定义和配置 AWS 云 基础架构。[AWS CDK 工具包](https://docs.aws.amazon.com/cdk/v2/guide/cli.html)是与您的 AWS CDK 应用程序交互的主要工具。
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)帮助您设置 AWS 资源，快速一致地配置资源，并在和的整个 AWS 账户 生命周期中对其进行管理 AWS 区域。
+ [AWS Config](https://docs.aws.amazon.com/config/latest/developerguide/WhatIsConfig.html)提供了您的资源 AWS 账户 及其配置方式的详细视图。它可以帮助您确定资源之间的相互关系，以及它们的配置如何随时间变化。
+ [AWS Control Tower](https://docs.aws.amazon.com/controltower/latest/userguide/what-is-control-tower.html)按照规范性最佳实践，帮助您设置和管理 AWS 多账户环境。
+ [AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html)是一项账户管理服务，可帮助您将多个账户整合 AWS 账户 到一个由您创建和集中管理的组织中。

**其他工具**
+ [cdk\$1nag](https://github.com/cdklabs/cdk-nag#readme) 是一个开源工具，它使用规则包的组合来检查 AWS CDK 应用程序是否符合最佳实践。
+ [npm](https://docs.npmjs.com/about-npm/) 是在 Node.js 环境中运行的软件注册表，用于共享或借用软件包以及管理私有软件包的部署。
+ [Python](https://www.python.org/) 是通用的计算机编程语言。

**代码存储库**

此模式的代码可在[使用 AWS CDK存储库 GitHub 部署 AWS Control Tower 控件](https://github.com/aws-samples/aws-control-tower-controls-cdk)中找到。你使用 **cdk.json** 文件与 AWS CDK 应用程序进行交互，然后使用 pack **age.json 文件来安装 npm 软件包。**

## 最佳实践
<a name="deploy-and-manage-aws-control-tower-controls-by-using-aws-cdk-and-aws-cloudformation-best-practices"></a>
+ 遵循[最低权限原则](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)（IAM 文档）。此模式中提供的示例 IAM 策略和信任策略包括所需的最低权限，在管理账户中创建的 AWS CDK 堆栈受这些权限的限制。
+ 遵循[AWS Control Tower 管理员最佳实践](https://docs.aws.amazon.com/controltower/latest/userguide/best-practices.html)（AWS Control Tower 文档）。
+ 遵循 AWS CDK（AWS CDK 文档）中[开发和部署云基础架构的最佳实践](https://docs.aws.amazon.com/cdk/v2/guide/best-practices.html)。
+ 引导时 AWS CDK，请自定义引导模板以定义策略和应能够读取和写入管理账户中任何资源的受信任账户。有关更多信息，请参阅[自定义引导](https://docs.aws.amazon.com/cdk/v2/guide/bootstrapping.html#bootstrapping-customizing)。
+ 使用代码分析工具（例如 [cfn\$1nag）](https://github.com/stelligent/cfn_nag)来扫描生成的模板。 CloudFormation cfn-nag 工具在 CloudFormation 模板中寻找可能表明基础架构不安全的模式。[你也可以使用 cdk-nag 通过 cloudformation-include 模块来检查你的 CloudFormation 模板。](https://docs.aws.amazon.com/cdk/v2/guide/use_cfn_template.html)

## 操作说明
<a name="deploy-and-manage-aws-control-tower-controls-by-using-aws-cdk-and-aws-cloudformation-epics"></a>

### 准备启用控件
<a name="prepare-to-enable-the-controls"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在管理账户中创建 IAM 角色。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/deploy-and-manage-aws-control-tower-controls-by-using-aws-cdk-and-aws-cloudformation.html) | DevOps 工程师，通用 AWS | 
| Bootstrap AWS CDK。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/deploy-and-manage-aws-control-tower-controls-by-using-aws-cdk-and-aws-cloudformation.html) | DevOps 工程师，通用 AWS，Python | 
| 克隆存储库。 | 在一个 bash Shell 中，输入如下命令。这将[使用来自 GitHub的 AWS CDK存储库克隆 Deploy AWS Control Tower 控件](https://github.com/aws-samples/aws-control-tower-controls-cdk)。<pre>git clone https://github.com/aws-samples/aws-control-tower-controls-cdk.git</pre> | DevOps 工程师，通用 AWS | 
| 编辑 AWS CDK 配置文件。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/deploy-and-manage-aws-control-tower-controls-by-using-aws-cdk-and-aws-cloudformation.html) | DevOps 工程师，通用 AWS | 

### 在管理账户中启用控件
<a name="enable-controls-in-the-management-account"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 承担部署账户中的 IAM 角色。 | 在部署账户中，扮演有权在管理账户中部署 AWS CDK 堆栈的 IAM 角色。有关在中担任 IAM 角色的更多信息 AWS CLI，请参阅[中的使用 IAM 角色 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-role.html)。 | DevOps 工程师，通用 AWS | 
| 激活  环境。 | 如果您使用 Linux 或 macOS：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/deploy-and-manage-aws-control-tower-controls-by-using-aws-cdk-and-aws-cloudformation.html)如果您使用的是 Windows：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/deploy-and-manage-aws-control-tower-controls-by-using-aws-cdk-and-aws-cloudformation.html) | DevOps 工程师，通用 AWS | 
| 安装依赖项。 | 激活虚拟环境后，输入以下命令运行 **install\$1deps.sh** 脚本。此命令安装必需的依赖项。<pre>$ ./scripts/install_deps.sh</pre> | DevOps 工程师，通用 AWS，Python | 
| 部署 堆栈。 | 输入以下命令以合成和部署 CloudFormation 堆栈。<pre>$ npx cdk synth<br />$ npx cdk deploy</pre> | DevOps 工程师，通用 AWS，Python | 

## 相关资源
<a name="deploy-and-manage-aws-control-tower-controls-by-using-aws-cdk-and-aws-cloudformation-resources"></a>

**AWS 文档**
+ [关于控件](https://docs.aws.amazon.com/controltower/latest/controlreference/controls.html)（AWS Control Tower 文档）
+ [控件库](https://docs.aws.amazon.com/controltower/latest/controlreference/controls-reference.html)（AWS Control Tower 文档）
+ [AWS CDK 工具包命令](https://docs.aws.amazon.com/cdk/v2/guide/cli.html#cli-commands)（AWS CDK 文档）
+ [使用 Terraform（AWS 规范性指南）部署和管理 AWS Control Tower 控件](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/deploy-and-manage-aws-control-tower-controls-by-using-terraform.html)

**其他资源**
+ [Python](https://www.python.org/)

## 附加信息
<a name="deploy-and-manage-aws-control-tower-controls-by-using-aws-cdk-and-aws-cloudformation-additional"></a>

**constants.py 文件示例**

下面是更新后的 **constants.py** 文件的示例。**此示例启用 **AWS-GR\$1DISALLOW\$1CROSS\$1REGION\$1NETWORKING** 控件（全局 ID：`dvuaav61i5cnfazfelmvn9m6k`）和 AWS-GR\$1SUBNET\$1AUTO\$1ASSIGN\$1PUBLIC\$1IP\$1DISABLED** 控件（全局 ID：`50z1ot237wl8u1lv5ufau6qqo`）。有关全局标识符的列表 IDs，请参阅 AWS Control Tower 文档中的[所有全局标识符](https://docs.aws.amazon.com/controltower/latest/controlreference/all-global-identifiers.html)。

```
ACCOUNT_ID = 111122223333
AWS_CONTROL_TOWER_REGION = us-east-2
ROLE_ARN = "arn:aws:iam::111122223333:role/CT-Controls-Role"
GUARDRAILS_CONFIGURATION = [
    {
        "Enable-Control": {
            "dvuaav61i5cnfazfelmvn9m6k": {  # AWS-GR_DISALLOW_CROSS_REGION_NETWORKING
                "Parameters": {
                    "ExemptedPrincipalArns": ["arn:aws:iam::111122223333:role/RoleName"]
                },
                "Tags": [{"key": "Environment", "value": "Production"}]
            },
            ...
        },
        "OrganizationalUnitIds": ["ou-1111-11111111", "ou-2222-22222222"...],
    },
    {
        "Enable-Control": {
            "50z1ot237wl8u1lv5ufau6qqo",  # AWS-GR_SUBNET_AUTO_ASSIGN_PUBLIC_IP_DISABLED
            ...
        },
        "OrganizationalUnitIds": ["ou-2222-22222222"...],
    },
]
```

**IAM 策略**

以下示例策略允许在将 AWS CDK 堆栈从部署账户部署到管理账户时启用或禁用 AWS Control 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:DescribeOrganizationalUnit",
                "organizations:DetachPolicy",
                "organizations:ListAccounts",
                "organizations:ListAWSServiceAccessForOrganization",
                "organizations:ListChildren",
                "organizations:ListOrganizationalUnitsForParent",
                "organizations:ListParents",
                "organizations:ListPoliciesForTarget",
                "organizations:ListRoots",
                "organizations:UpdatePolicy",
                "ssm:GetParameters"
            ],
            "Resource": "*"
        }
    ]
}
```

**信任策略**

以下自定义信任策略允许部署账户中特定 IAM 角色承担管理账户中的 IAM 角色。替换以下内容：
+ `<DEPLOYMENT-ACCOUNT-ID>` 是部署账户的 ID
+ `<DEPLOYMENT-ROLE-NAME>` 是部署账户中允许在管理账户中担任该角色的角色的名称

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<DEPLOYMENT-ACCOUNT-ID>:role/<DEPLOYMENT-ROLE-NAME>"
            },
            "Action": "sts:AssumeRole",
            "Condition": {}
        }
    ]
}
```