使用地形表單部署和管理 AWS Control Tower 控制 - AWS 方案指引

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

使用地形表單部署和管理 AWS Control Tower 控制

由伊克爾·雷納·富恩特(AWS)和伊万·吉拉迪(AWS)創建

程式碼儲存庫:使用 Terraform 部署和管理 AWS Control Tower 控制

環境:生產

技術:安全性、身分識別、合規性 CloudNative;基礎架構;管理與治理

工作負載:開源

AWS 服務:AWS Control Tower;AWS Organizations

Summary

此模式說明如何使用 AWS Control Tower 控制項、 HashiCorp Terraform 和基礎設施即程式碼 (IaC) 來實作和管理預防性、偵測和主動式安全控制。控制項 (也稱為護欄) 是一項高階規則,可為您的整體 AWS Control Tower 環境提供持續的管控。例如,您可以使用控制項要求 AWS 帳戶記錄,然後在發生特定安全性相關事件時設定自動通知。

AWS Control Tower 可協助您實作預防性、偵測和主動式控制,以管理 AWS 資源並監控多個 AWS 帳戶的合規。每個控制項都會強制執行單一規則。在此模式中,您可以使用提供的 IaC 範本來指定要在環境中部署的控制項。

AWS Control Tower 控制適用於整個組織單位 (OU),而且控制會影響 OU 中的每個 AWS 帳戶。因此,當使用者在您的 landing zone 中的任何帳戶中執行任何動作時,動作會受到控制 OU 的控制項的約束。

實作 AWS Control Tower 控制有助於為您的 AWS landing zone 建立堅實的安全基礎。通過使用此模式將控件部署為 IaC 通過 Terraform,您可以標準化 landing zone 中的控件,並更有效地部署和管理它們。

若要將 AWS Control Tower 控制部署為 IaC,您也可以使用 AWS Cloud Development Kit (AWS CDK) 而非地形。如需詳細資訊,請參閱使用 AWS CDK 和 AWS 部署和管理 AWS Control Tower 控制。 CloudFormation

目標受眾

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

先決條件和限制

先決條件

  • 以組織身分在 AWS 組織和 AWS Control Tower landing zone 中管理的有效 AWS 帳戶。如需指示,請參閱建立帳戶結構 (AWS Well-Architected 的實驗室)。

  • 已安裝設定的 AWS Command Line Interface (AWS CLI) (AWS CLI)。

  • 管理帳戶中的 AWS Identity and Access Management (IAM) 角色,具有部署此模式的許可。如需必要許可和範例政策的詳細資訊,請參閱此模式其他資訊一節中的 IAM 角色的最低權限許可。

  • 在管理帳戶中擔任 IAM 角色的許可。

  • 使用識別碼套用以服務控制原則 (SCP) 為基礎的控制項。必須啟動此 SCP,才能部署主動式控制。如需指示,請參閱不允許管理 AWS CloudFormation 登錄中的資源類型、模組和掛接

  • 地形 CLI,已安裝(地形文檔)。

  • 地形 AWS 供應商,已設定 (地形文件)。

  • 地形後端,配置(地形文檔)。

產品版本

  • AWS Control Tower 3.0 版或更新版本

  • 地形版本 1.5 或更高版本

  • 地形 AWS 供應商 4.67 版或更新版本

架構

目標架構

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

組織單位中所有 AWS 帳戶部署的控制架構圖。

AWS Control Tower 控制項會根據其行為指導進行分類。

控制行為有三種主要類型:

  1. 預防性控制旨在防止動作發生。這些是透過 AWS Organizations 中的服務控制政策 (SCP) 來實作。預防控制的狀態是強制執行未啟用。所有 AWS 區域都支援預防性控制。

  2. Dete@@ ctive 測控制項的設計目的在於偵測特定事件發生時,並將動作記錄在中 CloudTrail。這些都是透過 AWS 組態規則來實作。偵測控制項的狀態可能是「清除」、「違規」或「未啟用」。Detective 控制僅適用於 AWS 控制塔支援的 AWS 區域。

  3. 主動控制會掃描 AWS 佈建的資源, CloudFormation 並檢查它們是否符合您公司的政策和目標。不符合標準的資源將不會被佈建。這些都是使用 AWS CloudFormation 掛鉤實現的。主動控制的狀態為「過」、「失敗」或「略過」。

控制指引是如何將每個控制項套用至 OU 的建議作法。AWS Control Tower 提供三種類別的指導:強制性強烈建議選修。控制項的指導獨立於其行為。如需詳細資訊,請參閱控制行為和指引

工具

AWS 服務

  • AWS 可 CloudFormation協助您設定 AWS 資源、快速且一致地佈建 AWS 資源,並在 AWS 帳戶和區域的整個生命週期中進行管理。

  • AWS Config 提供 AWS 帳戶中的資源及其設定方式的詳細檢視。它可協助您識別資源彼此之間的關聯性,以及其組態隨時間變更的情況。

  • AWS Control Tower 可協助您按照規範的最佳實務來設定和管理 AWS 多帳戶環境。

  • AWS Organizations Organization 是一種帳戶管理服務,可協助您將多個 AWS 帳戶合併到您建立並集中管理的組織中。

其他工具

  • HashiCorp Terraform 是一種開放原始碼基礎結構即程式碼 (IaC) 工具,可協助您使用程式碼來佈建和管理雲端基礎架構和資源。

代碼存儲庫

使用 Terraform 儲存庫,可在 GitHub 部署和管理 AWS Control Tower 控制中取得此模式的程式碼。

最佳實務

史诗

任務描述所需技能

複製儲存庫。

在 bash 外殼中,輸入以下命令。這會使用 Terraform 儲存庫複製部署和管理 AWS Control Tower 控制台控制。 GitHub

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

編輯地形表單後端設定檔。

  1. 在複製的存放庫中,開啟後端 .tf 檔案。

  2. 編輯檔案以設定 Terraform 後端設定。您在此檔案中定義的組態視您的環境而定。如需詳細資訊,請參閱後端設定 (Terraform 文件)。

  3. 儲存並關閉後端. tf 檔案。

DevOps 工程師, 地形

編輯地形表單提供者組態檔案。

  1. 在複製的存放庫中,開啟提供者 .tf 檔案。

  2. 編輯檔案以設定 Terraform 提供者組態。如需詳細資訊,請參閱提供者組態 (Terraform 文件)。將 AWS 區域設定為提供 AWS Control Tower API 的區域。

  3. 儲存並關閉提供者. tf 檔案。

DevOps 工程師, 地形

編輯組態檔案。

  1. 在複製的儲存庫中,開啟變數 .tfvars 檔案。

  2. controls區段的control_names參數中,輸入控制項 API 識別碼。每個控制項對於可使用 AWS Control Tower 的每個區域都有唯一的 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,並以逗號分隔多個 ID。如需如何擷取 OU ID 的相關資訊,請參閱檢視 OU 的詳細資訊。

  4. 儲存並關閉變數 .tfvars 檔案。如需更新變數 .tfvars 檔案的範例,請參閱此模式的其他資訊一節。

DevOps 工程師,一般 AWS,地形

假設管理帳戶中的 IAM 角色。

在管理帳戶中,假設具有部署 Terraform 設定檔之權限的 IAM 角色。如需有關所需許可和範例政策的詳細資訊,請參閱其他資訊一節中 IAM 角色的最低權限許可。如需在 AWS CLI 中假設 IAM 角色的詳細資訊,請參閱在 AWS CLI 中使用 IAM 角色

DevOps 工程師,一般 AWS

部署組態檔案。

  1. 輸入以下命令來初始化地形。

    $ terraform init -upgrade
  2. 輸入以下命令以預覽與目前狀態相比的變更。

    $ terraform plan -var-file="variables.tfvars"
  3. 檢閱 Terraform 計劃中的組態變更,並確認您要在組織中實作這些變更。

  4. 輸入以下命令以部署資源。

    $ terraform apply -var-file="variables.tfvars"
DevOps 工程師,一般 AWS,地形
任務描述所需技能

運行銷毀命令。

輸入下列命令以移除此模式所部署的資源。

$ terraform destroy -var-file="variables.tfvars"
DevOps 工程師,一般 AWS,地形

故障診斷

問題解決方案

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

您嘗試啟用的控制項已在目標 OU 中啟用。如果使用者透過 AWS 管理主控台、透過 AWS Control Tower 或 AWS Organizations 手動啟用控制,就會發生此錯誤。若要部署 Terraform 組態檔案,您可以使用下列其中一個選項。

選項 1:更新地形目前的狀態檔

您可以將資源匯入至 Terraform 目前的狀態檔案。當您重新執行apply命令時,Terraform 會略過此資源。執行下列動作,將資源匯入至目前的 Terraform 狀態:

  1. 在 AWS Control Tower 管理帳戶中,輸入以下命令以擷取 OU 的 Amazon 資源名稱 (ARN) 清單,其中<root-ID>是組織根目錄。如需有關擷取此 ID 的詳細資訊,請參閱檢視根的詳細資訊。

    aws organizations list-organizational-units-for-parent --parent-id <root-ID>
  2. 針對上一個步驟中傳回的每個 OU,輸入下列命令,其中<OU-ARN>是 OU 的 ARN。

    aws controltower list-enabled-controls --target-identifier <OU-ARN>
  3. 複製 ARN 並在所需模組中執行「地形」匯入,使其包含在「地形」狀態中。如需指示,請參閱匯入 (地形文件)。

  4. 重複部Epics 區段中的組態中的步驟。

選項 2:禁用控制

如果您在非生產環境中工作,則可以在主控台中停用控制項。重複部署 Epics 一節中的組態中的步驟,以重新啟用此功能。不建議在生產環境中使用此方法,因為有一段時間會停用控制項。如果您想要在生產環境中使用此選項,可以實作臨時控制,例如在 AWS Organizations 中暫時套用 SCP。

相關資源

AWS 文件

其他資源

其他資訊

範例變數 .tfvars 檔

以下是更新的變數 .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 角色。最佳做法是假設具有臨時權限的角色,並根據最小權限原則限制權限。以下範例政策允許啟用或停用 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": "*" } ] }