

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

# 使用 Terraform 部署和管理 AWS Control Tower 控制項
<a name="deploy-and-manage-aws-control-tower-controls-by-using-terraform"></a>

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

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

此模式說明如何使用 AWS Control Tower 控制項、HashiCorp Terraform 和基礎設施作為程式碼 (IaC) 來實作和管理預防性、偵測性和主動性安全控制。[控制項](https://docs.aws.amazon.com/controltower/latest/userguide/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 登陸區域建立強大的安全基礎。透過使用此模式透過 Terraform 將控制項部署為 IaC，您可以標準化登陸區域中的控制項，並更有效率地部署和管理它們。

若要將 AWS Control Tower 控制項部署為 IaC，您也可以使用 AWS Cloud Development Kit (AWS CDK) 而非 Terraform。如需詳細資訊，請參閱[使用 和 部署和管理 AWS Control Tower 控制項 AWS CDKAWS CloudFormation](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/deploy-and-manage-aws-control-tower-controls-by-using-aws-cdk-and-aws-cloudformation.html)。

**目標對象**

對於具有 AWS Control Tower、Terraform 和 經驗的使用者，建議使用此模式 AWS Organizations。

## 先決條件和限制
<a name="deploy-and-manage-aws-control-tower-controls-by-using-terraform-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)。
+ 管理帳戶中具有部署此模式許可的 AWS Identity and Access Management (IAM) 角色。如需必要許可和範例政策的詳細資訊，請參閱此模式[額外資訊](#deploy-and-manage-aws-control-tower-controls-by-using-terraform-additional)區段中 *IAM 角色的最低權限許可*。
+ 在管理帳戶中擔任 IAM 角色的許可。
+ Terraform CLI，[已安裝](https://developer.hashicorp.com/terraform/cli) (Terraform 文件）。
+ Terraform AWS Provider，[已設定](https://hashicorp.github.io/terraform-provider-aws/) (Terraform 文件）。
+ Terraform 後端，[已設定](https://developer.hashicorp.com/terraform/language/backend) (Terraform 文件）。

**限制**
+ 對於 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 版或更新版本
+ Terraform 1.5 版或更新版本
+ Terraform AWS Provider 4.67 版或更新版本

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

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

![\[部署在組織單位中所有 AWS 帳戶的控制項架構圖。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/6e0d6c30-a539-44b7-8415-e669fb2ad26a/images/60407c0e-852e-4d5f-9a7d-8510316063aa.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-terraform-tools"></a>

**AWS 服務**
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) 可協助您設定 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 帳戶 到您建立並集中管理的組織。

**其他工具**
+ [HashiCorp Terraform](https://www.terraform.io/docs) 是一種基礎設施即程式碼 (IaC) 工具，可協助您使用程式碼來佈建和管理雲端基礎設施和資源。

**程式碼儲存庫**

此模式的程式碼可在 GitHub [部署中使用，並使用 Terraform 儲存庫管理 AWS Control Tower 控制項](https://github.com/aws-samples/aws-control-tower-controls-terraform)。

## 最佳實務
<a name="deploy-and-manage-aws-control-tower-controls-by-using-terraform-best-practices"></a>
+ 用於部署此解決方案的 IAM 角色應遵循[最低權限 (IAM 文件） 原則](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)。
+ 遵循[AWS Control Tower 管理員的最佳實務 ](https://docs.aws.amazon.com/controltower/latest/userguide/best-practices.html)(AWS Control Tower 文件）。

## 史詩
<a name="deploy-and-manage-aws-control-tower-controls-by-using-terraform-epics"></a>

### 在管理帳戶中啟用控制項
<a name="enable-controls-in-the-management-account"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 複製儲存庫。 | 在 bash shell 中，輸入下列命令。這會從 GitHub [使用 Terraform 儲存庫複製部署和管理 AWS Control Tower 控制項](https://github.com/aws-samples/aws-control-tower-controls-terraform)。<pre>git clone https://github.com/aws-samples/aws-control-tower-controls-terraform.git</pre> | DevOps 工程師 | 
| 編輯 Terraform 後端組態檔案。 | [\[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-terraform.html) | DevOps 工程師，Terraform | 
| 編輯 Terraform 提供者組態檔案。 | [\[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-terraform.html) | DevOps 工程師，Terraform | 
| 編輯組態檔案。 | [\[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-terraform.html) | DevOps 工程師、一般 AWS、Terraform | 
| 擔任管理帳戶中的 IAM 角色。 | 在管理帳戶中，擔任具有部署 Terraform 組態檔案許可的 IAM 角色。如需所需許可和範例政策的詳細資訊，請參閱[其他資訊](#deploy-and-manage-aws-control-tower-controls-by-using-terraform-additional)區段中的 *IAM 角色的最低權限許可*。如需在 中擔任 IAM 角色的詳細資訊 AWS CLI，請參閱[在 中使用 IAM 角色 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-role.html)。 | DevOps 工程師，一般 AWS | 
| 部署組態檔案。 | [\[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-terraform.html) | DevOps 工程師、一般 AWS、Terraform | 

### （選用） 在 AWS Control Tower 管理帳戶中停用控制項
<a name="optional-disable-controls-in-the-ctower-management-account"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 執行 `destroy` 命令。 | 輸入下列命令以移除此模式部署的資源。<pre>$ terraform destroy -var-file="variables.tfvars"</pre> | DevOps 工程師、一般 AWS、Terraform | 

## 疑難排解
<a name="deploy-and-manage-aws-control-tower-controls-by-using-terraform-troubleshooting"></a>


| 問題 | 解決方案 | 
| --- | --- | 
| `Error: creating ControlTower Control ValidationException: Guardrail <control ID> is already enabled on organizational unit <OU ID>` 錯誤 | 您嘗試啟用的控制項已在目標 OU 中啟用。如果使用者透過、透過 AWS Control Tower 或透過 手動啟用控制項 AWS 管理主控台，則可能會發生此錯誤 AWS Organizations。若要部署 Terraform 組態檔案，您可以使用下列其中一個選項。**選項 1：更新 Terraform 目前狀態檔案**您可以將資源匯入至 Terraform 目前狀態檔案。當您重新執行`apply`命令時，Terraform 會略過此資源。執行下列動作，將資源匯入至目前的 Terraform 狀態：[\[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-terraform.html)**選項 2：停用控制項**如果您在非生產環境中工作，您可以在 主控台中停用控制項。在 [Epics](#deploy-and-manage-aws-control-tower-controls-by-using-terraform-epics) 區段中重複*部署組態*中的步驟，以重新啟用它。此方法不建議用於生產環境，因為有一段時間會停用控制項。如果您想要在生產環境中使用此選項，您可以實作暫時控制，例如暫時套用 SCP AWS Organizations。 | 

## 相關資源
<a name="deploy-and-manage-aws-control-tower-controls-by-using-terraform-resources"></a>

**AWS 文件**
+ [關於控制項](https://docs.aws.amazon.com/controltower/latest/userguide/controls.html) (AWS Control Tower 文件）
+ [控制項程式庫](https://docs.aws.amazon.com/controltower/latest/userguide/controls-reference.html) (AWS Control Tower 文件）
+ [使用 和 AWS CDK （方案指引） 部署和管理 AWS Control Tower 控制項 AWS CloudFormation](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/deploy-and-manage-aws-control-tower-controls-by-using-aws-cdk-and-aws-cloudformation.html)AWS 

**其他資源**
+ [Terraform](https://www.terraform.io/)
+ [Terraform CLI 文件](https://www.terraform.io/cli)

## 其他資訊
<a name="deploy-and-manage-aws-control-tower-controls-by-using-terraform-additional"></a>

**範例 variables.tfvars**** 檔案**

以下是已更新 variables.**tfvars** 檔案的範例。此範例會啟用 **AWS-GR\$1ENCRYPTED\$1VOLUMES** 控制項 （全域 ID：`503uicglhjkokaajywfpt6ros`) 和 **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)。

下列範例也會啟用具有 **CT.S3.PV.5** （全域 ID：`7mo7a2h2ebsq71l8k6uzr96ou`) 和 **CT.SECRETSMANAGER.PV.1 （全域 ID：) 等參數的控制項。** `dvhe47fxg5o6lryqrq9g6sxg4`如需具有參數的控制項清單，請參閱 AWS Control Tower 文件中的[具有參數的控制項](https://docs.aws.amazon.com/controltower/latest/controlreference/control-parameter-concepts.html)。

```
controls = [
    {
        control_names = [
            "503uicglhjkokaajywfpt6ros", # AWS-GR_ENCRYPTED_VOLUMES
            ...
        ],
        organizational_unit_ids = ["ou-1111-11111111", "ou-2222-22222222"...],
    },
    {
        control_names = [
            "50z1ot237wl8u1lv5ufau6qqo", # AWS-GR_SUBNET_AUTO_ASSIGN_PUBLIC_IP_DISABLED
            ...
        ],
        organizational_unit_ids = ["ou-1111-11111111"...],
    },
]

controls_with_params = [
  {
    control_names = [
      { "7mo7a2h2ebsq71l8k6uzr96ou" = { # CT.S3.PV.5
        parameters = {
          "ExemptedPrincipalArns" : ["arn:aws:iam::*:role/RoleName"],
          "ExemptedResourceArns" : [],
        }
      } },
      { "dvhe47fxg5o6lryqrq9g6sxg4" = { # CT.SECRETSMANAGER.PV.1
        parameters = {
          "ExemptedPrincipalArns" : ["arn:aws:iam::*:role/RoleName"],
        }
      } },
      ...
    ],
    organizational_unit_ids = ["ou-1111-11111111"...]
  },
  {
    control_names = [
      { "dvuaav61i5cnfazfelmvn9m6k" = { # AWS-GR_DISALLOW_CROSS_REGION_NETWORKING
        parameters = {
          "ExemptedPrincipalArns" : ["arn:aws:iam::*:role/RoleName"],
        }
      } },
      { "41ngl8m5c4eb1myoz0t707n7h" = { # AWS-GR_DISALLOW_VPC_INTERNET_ACCESS
        parameters = {
          "ExemptedPrincipalArns" : ["arn:aws:iam::*:role/RoleName"],
        }
      } },
      ...
    ],
    organizational_unit_ids = ["ou-2222-22222222"...]
  }
]
```

**IAM 角色的最低權限許可**

此模式需要您在管理帳戶中擔任 IAM 角色。最佳實務是擔任具有暫時許可的角色，並根據最低權限原則限制許可。下列範例政策允許啟用或停用 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:DetachPolicy",
                "organizations:ListAccounts",
                "organizations:ListAWSServiceAccessForOrganization",
                "organizations:ListChildren",
                "organizations:ListOrganizationalUnitsForParent",
                "organizations:ListParents",
                "organizations:ListPoliciesForTarget",
                "organizations:ListRoots",
                "organizations:UpdatePolicy"
            ],
            "Resource": "*"
        }
    ]
}
```