

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 和 AWS CDK CloudFormation 部署和管理 AWS Control Tower 控制項
<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*

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

此模式說明如何使用 AWS CloudFormation 和 AWS Cloud Development Kit (AWS CDK) 實作和管理預防性、偵測性和主動性 AWS Control Tower 控制作為基礎設施即程式碼 (IaC)。[控制項](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)，而控制項會影響 OU AWS 帳戶 中的每個單位。因此，當使用者在您登陸區域的任何帳戶中執行任何動作時，該動作會受到管理 OU 的控制。

實作 AWS Control Tower 控制項有助於為您的 AWS 登陸區域建立強大的安全基礎。透過使用此模式透過 CloudFormation 將控制項部署為 IaC AWS CDK，您可以標準化登陸區域中的控制項，並更有效率地部署和管理它們。此解決方案使用 [cdk\_nag](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)。

**目標對象**

對於具有 CloudFormation AWS Control Tower和 經驗的使用者 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)。
+ 節點套件管理員 (npm)，[已安裝並設定](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) AWS CDK。
+ [的先決條件](https://docs.aws.amazon.com/cdk/v2/guide/work-with.html#work-with-prerequisites) AWS CDK。
+ 部署帳戶中擔任現有 AWS Identity and Access Management (IAM) 角色的許可。
+ 在組織管理帳戶中擔任 IAM 角色的許可，可用於引導 AWS CDK。角色必須具有修改和部署 CloudFormation 資源的許可。如需詳細資訊，請參閱 AWS CDK 文件中的[引導](https://docs.aws.amazon.com/cdk/v2/guide/bootstrapping.html#bootstrapping-howto)。
+ 在組織的管理帳戶中建立 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 版或更新版本

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

本節提供此解決方案的高階概觀，以及範例程式碼所建立的架構。下圖顯示部署在 OU 中各種帳戶的控制項。

![部署在組織單位中所有 AWS 帳戶的控制項架構圖。](http://docs.aws.amazon.com/zh_tw/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. *Detective 控制項*旨在偵測發生的特定事件，並記錄動作 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)實作。主動控制的狀態為 **PASS**、**FAIL** 或 **SKIP**。

控制*指導*是指如何將每個控制套用至 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 雲端 基礎設施。Toolkit [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\_nag](https://github.com/cdklabs/cdk-nag#readme) 是一種開放原始碼工具，使用規則套件的組合來檢查 AWS CDK 應用程式是否符合最佳實務。
+ [npm](https://docs.npmjs.com/about-npm/) 是在 Node.js 環境中執行的軟體登錄檔，用於共用或借用套件和管理私有套件的部署。
+ [Python](https://www.python.org/) 是一種一般用途的電腦程式設計語言。

**程式碼儲存庫**

此模式的程式碼可在 GitHub 部署控制項中使用儲存庫。 [AWS Control TowerAWS CDK](https://github.com/aws-samples/aws-control-tower-controls-cdk)您可以使用 **cdk.json** 檔案與 AWS CDK 應用程式互動，並使用 **package.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](https://docs.aws.amazon.com/cdk/v2/guide/best-practices.html)。AWS CDK 
+ 引導 時 AWS CDK，自訂引導範本以定義政策和信任的帳戶，這些帳戶應該能夠讀取和寫入管理帳戶中的任何資源。如需詳細資訊，請參閱[自訂引導](https://docs.aws.amazon.com/cdk/v2/guide/bootstrapping.html#bootstrapping-customizing)。
+ 使用程式碼分析工具掃描產生的 CloudFormation 範本，例如 [cfn\_nag](https://github.com/stelligent/cfn_nag)。cfn-nag 工具會在 CloudFormation 範本中尋找可能表示基礎設施不安全的模式。您也可以使用 CloudFormation-[include 模組，使用 cdk-nag 來檢查 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>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 在管理帳戶中建立 IAM 角色。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-and-manage-aws-control-tower-controls-by-using-aws-cdk-and-aws-cloudformation.html) | DevOps 工程師，一般 AWS | 
| 引導 AWS CDK。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/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 Control Tower 控制項 AWS CDK](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_tw/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>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 擔任部署帳戶中的 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_tw/prescriptive-guidance/latest/patterns/deploy-and-manage-aws-control-tower-controls-by-using-aws-cdk-and-aws-cloudformation.html)<br />如果您使用的是 Windows：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-and-manage-aws-control-tower-controls-by-using-aws-cdk-and-aws-cloudformation.html) | DevOps 工程師，一般 AWS | 
| 安裝相依性。 | 啟用虛擬環境後，請輸入下列命令來執行 **install\_deps.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 Control Tower 控制項](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/deploy-and-manage-aws-control-tower-controls-by-using-terraform.html) (AWS 方案指引）

**其他資源**
+ [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\_DISALLOW\_CROSS\_REGION\_NETWORKING** 控制項 （全域 ID：`dvuaav61i5cnfazfelmvn9m6k`) 和 **AWS-GR\_SUBNET\_AUTO\_ASSIGN\_PUBLIC\_IP\_DISABLED** 控制項 （全域 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": {}
        }
    ]
}
```