使用 AWS CDK 和 AWS 部署和管理 AWS Control Tower 控制 CloudFormation - AWS 方案指引

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

使用 AWS CDK 和 AWS 部署和管理 AWS Control Tower 控制 CloudFormation

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

程式碼儲存庫:aws-control-tower-controls-cdk

環境:生產

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

AWS 服務:AWS CloudFormation、AWS Control Tower、AWS Organizations、AWS CDK

Summary

此模式說明如何使用 AWS CloudFormation 和 AWS Cloud Development Kit (AWS CDK) 來實作和管理預防性、偵測和主動的 AWS Control Tower 控制作為基礎設施即程式碼 (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 to CloudFormation 和 AWS CDK,您可以標準化 landing zone 域中的控制項,並更有效率地部署和管理它們。此解決方案會在部署期間使用 cdk_nag 掃描 AWS CDK 應用程式。此工具會檢查應用程式是否遵守 AWS 最佳實務。

若要將 AWS Control Tower 控制項部署為 I HashiCorp aC,您也可以使用地形來取代 AWS CDK。如需詳細資訊,請參閱使用 Terraform 部署和管理 AWS Control Tower 控制

目標受眾

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

先決條件和限制

先決條件

限制

  • 此模式提供跨 AWS 帳戶部署此解決方案的指示,從部署帳戶到組織的管理帳戶。基於測試目的,您可以直接在管理帳戶中部署此解決方案,但未明確提供此組態的指示。

產品版本

  • 版 Python 3.9 或更高版本

  • 故宮版本 8.9.0 或更新版本

架構

目標架構

本節提供此解決方案的高階概觀,以及範例程式碼所建立的架構。下圖顯示在 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 Cloud Development Kit (AWS CDK) 是一種軟體開發架構,可協助您在程式碼中定義和佈建 AWS 雲端基礎設施。AWS CDK 工具組是與 AWS CDK 應用程式互動的主要工具。

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

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

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

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

其他工具

  • cdk_nag 是一種開放原始碼工具,結合使用規則套件來檢查 AWS Cloud Development Kit (AWS CDK) 應用程式是否遵守最佳實務。

  • npm 是一個在 Node.js 環境中運行的軟件註冊表,用於共享或借用軟件包以及管理私有軟件包的部署。

  • Python 是一種通用的計算機編程語言。

代碼存儲庫

此模式的程式碼可在使用 AWS CDK 儲存庫的 GitHub 部署 AWS Control Tower 控制中取得。您可以使用 cdk.json 檔案與 AWS CDK 應用程式互動,並使用封裝 .json 檔案來安裝 NPM 套件。

最佳實務

史诗

任務描述所需技能

在管理帳戶中建立 IAM 角色。

  1. 使用其他資訊區段中 IAM 政策中定義的許可,在管理帳戶中建立 IAM 政策。如需指示,請參閱 IAM 文件中的建立 IAM 政策。記下政策的 Amazon 資源名稱(ARN)。以下是 ARN 的範例。

    arn:aws:iam::<MANAGEMENT-ACCOUNT-ID>:policy/<POLICY-NAME>
  2. 在管理帳戶中建立 IAM 角色、附加您在上一個步驟中建立的 IAM 權限政策,並在「其他資訊」區段的「信任政策」中附加自訂信任政策。如需指示,請參閱 IAM 文件中的使用自訂信任政策建立角色。以下是新角色的 ARN 範例。

    arn:aws:iam:: <MANAGEMENT-ACCOUNT-ID>:role/<ROLE-NAME>
DevOps 工程師,一般 AWS

引導程序 AWS CDK。

  1. 在管理帳戶中,假設具有啟動 AWS CDK 權限的角色。

  2. 輸入下列命令,取代下列命令:

    • <MANAGEMENT-ACCOUNT-ID>是組織管理帳戶的 ID。

    • <AWS-CONTROL-TOWER-REGION>是部署 Control Tower 的 AWS 區域。如需區域代碼的完整清單,請參閱 AWS 一般參考中的區域端點

    • <DEPLOYMENT-ACCOUNT-ID>是部署帳戶的識別碼。

    • <DEPLOYMENT-ROLE-NAME>是您使用部署帳戶的 IAM 角色名稱。

    • <POLICY-NAME>是您在管理帳戶中建立的策略名稱。

    $ npx cdk bootstrap aws://<MANAGEMENT-ACCOUNT-ID>/<AWS-CONTROL-TOWER-REGION> \ --trust arn:aws:iam::<DEPLOYMENT-ACCOUNT-ID>:role/<DEPLOYMENT-ROLE-NAME> \ --cloudformation-execution-policies arn:aws:iam::<MANAGEMENT-ACCOUNT-ID>:policy/<POLICY-NAME>
DevOps 工程師, 一般 AWS, Python

複製儲存庫。

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

git clone https://github.com/aws-samples/aws-control-tower-controls-cdk.git
DevOps 工程師,一般 AWS

編輯 AWS CDK 組態檔案。

  1. 在複製的儲存庫中,開啟 constants.py 檔案。

  2. ACCOUNT_ID參數中,輸入管理帳戶的 ID。

  3. <AWS-CONTROL-TOWER-REGION>參數中,輸入部署 AWS 控制塔的 AWS 區域。

  4. ROLE_ARN參數中,輸入您在管理帳戶中建立之角色的 ARN。

  5. 在此GUARDRAILS_CONFIGURATION區段的Enable-Control參數中,輸入控制項 API 識別碼。以雙引號輸入識別碼,並以逗號分隔多個識別碼。每個控制項對於可使用 AWS Control Tower 的每個區域都有唯一的 API 識別碼。若要尋找控制項識別碼,請執行下列動作:

    1. 控制項中繼資料表中,找出您要啟用的控制項。

    2. 在「控制 API 識別碼」的「區域」欄中,找出您進行 API 呼叫的區域的 API 識別碼,例如arn:aws:controltower:us-east-1::control/AWS-GR_ENCRYPTED_VOLUMES

    3. 從區域標識符中提取控制標識符,例如AWS-GR_ENCRYPTED_VOLUMES

  6. GUARDRAILS_CONFIGURATION區段的OrganizationalUnitIds參數中,輸入您要啟用控制項的組織單位 ID,例如ou-1111-11111111。以雙引號輸入 ID,並以逗號分隔多個 ID。如需如何擷取 OU ID 的相關資訊,請參閱檢視 OU 的詳細資訊。

  7. 儲存並關閉 constants.py 檔案。如需更新 constants.py 檔案的範例,請參閱此病毒碼的其他資訊一節。

任務描述所需技能

假設部署帳戶中的 IAM 角色。

在部署帳戶中,假設具有在管理帳戶中部署 AWS CDK 堆疊許可的 IAM 角色。如需在 AWS CLI 中假設 IAM 角色的詳細資訊,請參閱在 AWS CLI 中使用 IAM 角色

DevOps 工程師,一般 AWS

啟動環境。

如果您使用的是 Linux 或 MacOS 果系統:

  1. 輸入以下指令以建立虛擬環境。

    $ python3 -m venv .venv
  2. 建立虛擬環境後,輸入以下指令來啟動它。

    $ source .venv/bin/activate

如果您使用的是視窗:

  1. 輸入以下指令以啟動虛擬環境。

    % .venv\Scripts\activate.bat
DevOps 工程師,一般 AWS

安裝依賴關係。

啟動虛擬環境之後,輸入下列命令以執行 install_deps.sh 指令碼。此指令碼會安裝必要的相依性。

$ ./scripts/install_deps.sh
DevOps 工程師, 一般 AWS, Python

部署堆疊。

輸入以下命令以合成和部署 CloudFormation 堆疊。

$ npx cdk synth $ npx cdk deploy
DevOps 工程師, 一般 AWS, Python

相關資源

AWS 文件

其他資源

其他資訊

constants.py 檔案範例

以下是更新的 constants.py 檔案的範例。

ACCOUNT_ID = 111122223333 AWS_CONTROL_TOWER_REGION = us-east-2 ROLE_ARN = "arn:aws:iam::111122223333:role/CT-Controls-Role" GUARDRAILS_CONFIGURATION = [ { "Enable-Control": { "AWS-GR_ENCRYPTED_VOLUMES", ... }, "OrganizationalUnitIds": ["ou-1111-11111111", "ou-2222-22222222"...], }, { "Enable-Control": { "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>是部署帳戶的識別碼

  • <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”: {} } ] }