使用 Terraform 自動 GuardDuty 為組織啟用 Amazon - AWS 方案指引

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

使用 Terraform 自動 GuardDuty 為組織啟用 Amazon

由 Aarthi Kannan 建立 (AWS)

程式碼儲存庫:amazon-guardduty-for-aws-organizations-with-terraform

環境:生產

技術:安全、身分、合規; DevOps

工作負載:所有其他工作負載

AWS 服務:Amazon GuardDuty; AWS Organizations

Summary

Amazon GuardDuty 會持續監控您的 Amazon Web Services (AWS) 帳戶,並使用威脅情報來識別AWS您環境中的非預期和潛在惡意活動。 GuardDuty 手動為多個帳戶或組織、跨多個AWS區域或透過AWS管理主控台啟用可能會很麻煩。您可以使用基礎設施作為程式碼 IaC) 工具來自動化程序,例如 Terraform,該工具可在雲端中佈建和管理多帳戶、多區域服務和資源。

AWS 建議使用 AWS Organizations 在 中設定和管理多個帳戶 GuardDuty。此模式會遵循該建議。這種方法的好處之一是,當新帳戶建立或新增至組織時, GuardDuty 會在所有支援區域的這些帳戶中自動啟用,而不需要手動介入。

此模式示範如何使用 HashiCorp Terraform 為組織中 GuardDuty 的三個或更多 Amazon Web Services (AWS) 帳戶啟用 Amazon。此模式隨附的範例程式碼會執行下列動作:

  • GuardDuty 為 AWS Organizations 中目標組織目前成員的所有AWS帳戶啟用

  • 開啟 中的 Auto-Enable 功能 GuardDuty,該功能 GuardDuty 會在未來自動啟用新增至目標組織的任何帳戶

  • 允許您選取您要啟用的區域 GuardDuty

  • 使用組織的安全帳戶作為 GuardDuty 委派管理員

  • 在記錄帳戶中建立 Amazon Simple Storage Service (Amazon S3) 儲存貯體,並設定 GuardDuty 以發佈此儲存貯體中所有帳戶的彙總調查結果

  • 根據預設,指派生命週期政策,在 365 天後將調查結果從 S3 儲存貯體轉換為 Amazon S3 Glacier Flexible Retrieval 儲存體

您可以手動執行此範例程式碼,也可以將其整合到連續整合和連續交付 (CI/CD) 管道中。

目標受眾

具有 Terraform GuardDuty、Python 和 AWSOrganizations 經驗的使用者建議使用此模式。

先決條件和限制

先決條件

  • 作用中的 AWS 帳戶。

  • 組織是在 AWS Organizations 中設定,且至少包含下列三個帳戶:

    • 管理帳戶 – 這是您從中部署 Terraform 程式碼的帳戶,無論是獨立或作為 CI/CD 管道的一部分。Terraform 狀態也會存放在此帳戶中。

    • 安全帳戶 – 此帳戶用作 GuardDuty 委派的管理員。如需詳細資訊,請參閱 GuardDuty 委派管理員的重要考量事項 (GuardDuty 文件)。

    • 記錄帳戶 – 此帳戶包含 S3 儲存貯體,其中會 GuardDuty 發佈來自所有成員帳戶的彙總調查結果。

    如需如何使用所需組態設定組織的詳細資訊,請參閱建立帳戶結構 (AWS Well-Architected Labs)。

  • Amazon S3 儲存貯體和 Amazon DynamoDB 資料表,可做為遠端後端,將 Terraform 的狀態儲存在 管理帳戶中。如需使用 Terraform 狀態遠端後端的詳細資訊,請參閱 S3 後端 (Terraform 文件)。如需使用 S3 後端設定遠端狀態管理的程式碼範例,請參閱 remote-state-s3 後端 (Terraform Registry)。請注意以下要求:

    • S3 儲存貯體和 DynamoDB 資料表必須位於相同的區域中。

    • 建立 DynamoDB 資料表時,分割區金鑰必須是 LockID(區分大小寫),且分割區金鑰類型必須是字串 。所有其他資料表設定必須處於其預設值。如需詳細資訊,請參閱關於主要金鑰建立資料表 (DynamoDB 文件)。

  • 一個 S3 儲存貯體,用於儲存 S3 儲存貯體的存取日誌,在該日誌中 GuardDuty 發佈調查結果。如需詳細資訊,請參閱啟用 Amazon S3 伺服器存取記錄 (AmazonS3 文件)。如果您要部署到 AWS Control Tower 登陸區域,您可以為此重複使用日誌封存帳戶中的 S3 儲存貯體。

  • 已安裝並設定 Terraform 0.14.6 版或更新版本。如需詳細資訊,請參閱開始使用 – AWS (Terraform 文件)。

  • 已安裝並設定 Python 3.9.6 版或更新版本。如需詳細資訊,請參閱來源版本 (Python 網站)。

  • AWS SDK 已安裝 for Python (Boto3)。如需詳細資訊,請參閱安裝 (Boto3 文件)。

  • 安裝並設定 jq。如需詳細資訊,請參閱下載 jq (jq 文件)。

限制

  • 此模式支援 macOS 和 Amazon Linux 2 作業系統。此模式尚未在 Windows 作業系統中使用進行測試。

    注意:Amazon Linux 2 即將結束支援。如需詳細資訊,請參閱 Amazon Linux 2 FAQs

  • GuardDuty 不得在任何目標區域中的任何 帳戶中啟用。

  • 此模式中的 IaC 解決方案不會部署先決條件。

  • 此模式專為遵循下列最佳實務的AWS登陸區域而設計:

    • 登陸區域是使用 AWS Control Tower 建立。

    • 個別AWS帳戶用於安全性和記錄。

產品版本

  • Terraform 0.14.6 版或更新版本。範例程式碼已針對 1.2.8 版進行測試。

  • Python 3.9.6 版或更新版本。

架構

本節提供此解決方案的高階概觀,以及範例程式碼建立的架構。下圖顯示在單一 AWS 區域中,跨組織中各種帳戶部署的資源。

架構圖表顯示管理、安全、記錄和成員帳戶中的資源。
  1. Terraform 會在安全帳戶和記錄帳戶中建立 GuardDutyTerraformOrgRole AWS Identity and Access Management (IAM) 角色。

  2. Terraform 在記錄帳戶中的預設AWS區域中建立 S3 儲存貯體。此儲存貯體用作發佈目的地,以彙總組織中所有區域和所有帳戶的所有 GuardDuty 調查結果。Terraform 也會在安全帳戶中建立 AWS Key Management Service (AWS KMS) 金鑰,用於加密 S3 儲存貯體中的調查結果,並將調查結果從 S3 儲存貯體自動封存至 S3 Glacier Flexible Retrieval 儲存體。

  3. 從管理帳戶,Terraform 指定安全帳戶為 的委派管理員 GuardDuty。這表示安全帳戶現在會管理所有成員帳戶 GuardDuty 的服務,包括 管理帳戶。個別成員帳戶無法 GuardDuty 自行暫停或停用。

  4. Terraform 會在安全帳戶中為 GuardDuty 委派管理員建立 GuardDuty 偵測器。

  5. 如果尚未啟用,Terraform 會在 中啟用 S3 保護 GuardDuty。如需詳細資訊,請參閱 Amazon 中的 Amazon S3 保護 GuardDuty (GuardDuty 文件)。

  6. Terraform 會將組織中所有目前作用中的成員帳戶註冊為 GuardDuty 成員。

  7. Terraform 會設定 GuardDuty 委派的管理員,將所有成員帳戶的彙總調查結果發佈到記錄帳戶中的 S3 儲存貯體。

  8. Terraform 會針對您選擇的每個AWS區域重複步驟 3 到 7。

自動化和擴展

提供的範例程式碼已模組化,因此您可以將其整合到 CI/CD 管道中,以進行自動化部署。

工具

AWS 服務

其他工具和服務

  • HashiCorp Terraform 是一種命令列介面應用程式,可協助您使用程式碼來佈建和管理雲端基礎設施和資源。

  • Python 是一種一般用途的程式設計語言。

  • jq 是命令列處理器,可協助您處理JSON檔案。

程式碼儲存庫

此模式的程式碼可在 GitHub- amazon-guardduty-for-awsorganizations-with-terraform儲存庫的 上取得。

史詩

任務描述所需的技能

複製儲存庫。

在 Bash Shell 中,執行下列命令。在其他資訊區段中複製儲存庫,您可以複製包含 GitHub 儲存庫 URL 的完整命令。這會從 複製 amazon-guardduty-for-aws-organizations-with-terraform 儲存庫 GitHub。

git clone <github-repository-url>
DevOps 工程師

編輯 Terraform 組態檔案。

  1. 在複製儲存庫的 root資料夾中,執行下列命令來複寫 configuration.json.sample 檔案。

    cp configuration.json.sample configuration.json
  2. 編輯新的 configuration.json 檔案,並定義下列每個變數的值:

    • management_acc_id – 管理帳戶的帳戶 ID。

    • delegated_admin_acc_id – 安全帳戶的帳戶 ID。

    • logging_acc_id – 記錄帳戶的帳戶 ID。

    • target_regions – 以逗號分隔的AWS清單,列出您要啟用 的區域 GuardDuty。

    • organization_id – 您啟用 AWS 之組織的組織 ID GuardDuty。

    • default_region – 您的 Terraform 狀態存放在 管理帳戶中的區域。這是您為 Terraform 後端部署 S3 儲存貯體和 DynamoDB 資料表的相同區域。

    • role_to_assume_for_role_creation – 您要指派給安全和記錄帳戶中新IAM角色的名稱。您可以在下一個故事中建立此新角色。Terraform 會擔任此角色,以在安全和記錄帳戶中建立GuardDutyTerraformOrgRoleIAM角色。

    • finding_publishing_frequency – 將調查結果 GuardDuty 發佈至 S3 儲存貯體的頻率。

    • guardduty_findings_bucket_region – 您想要為已發佈的調查結果建立 S3 儲存貯體的偏好區域。

    • logging_acc_s3_bucket_name – 已發佈調查結果的 S3 儲存貯體偏好名稱。

    • security_acc_kms_key_alias – AWS KMS 用於加密 GuardDuty 調查結果的金鑰別名。

    • s3_access_log_bucket_name – 預先存在的 S3 儲存貯體名稱,用於收集用於 GuardDuty 調查結果的 S3 儲存貯體的存取日誌。此儲存貯體應與 GuardDuty 調查結果儲存貯體位於相同的AWS區域。

    • tfm_state_backend_s3_bucket – 儲存 Terraform 遠端後端狀態的預先存在 S3 儲存貯體的名稱。

    • tfm_state_backend_dynamodb_table – 預先存在的 DynamoDB 資料表名稱,用於鎖定 Terraform 狀態。

  3. 儲存並關閉 組態檔案。

DevOps 工程師、一般 AWS、Terraform、Python

產生新IAM角色的 CloudFormation 範本。

此模式包含建立兩個 CloudFormation 範本的 IaC 解決方案。這些範本會建立 Terraform 在設定過程中使用的兩個IAM角色。這些範本遵循最低權限許可 的安全性最佳實務。

  1. 在 Bash Shell 的儲存庫root資料夾中,導覽至 cfn-templates/。此資料夾包含具有存根的 CloudFormation 範本檔案。

  2. 執行下列命令。這會以您在 configuration.json 檔案中提供的值取代短軸。

    bash scripts/replace_config_stubs.sh
  3. 確認已在 cfn-templates/ 資料夾中建立下列 CloudFormation 範本:

    • management-account-role.yaml – 此檔案包含 IAM 管理帳戶中角色的定義和相關許可,其具有完成此模式所需的最低許可。

    • role-to-assume-for-role-creation.yaml – 此檔案包含安全與記錄帳戶中IAM角色的角色定義和相關許可。Terraform 擔任此角色,以便在這些帳戶中建立GuardDutyTerraformOrgRole角色。

DevOps 工程師,一般 AWS

建立IAM角色。

請依照建立堆疊 (CloudFormation 文件) 中的指示,執行下列動作:

  1. 在安全性和記錄帳戶中部署 role-to-assume-for-role-creation.yaml 堆疊。

  2. 在 管理帳戶中部署 management-account-role.yaml 堆疊。當您成功建立堆疊並查看CREATE_COMPLETE堆疊狀態時,請在輸出中記下此新角色的 Amazon Resource Name (ARN)。

DevOps 工程師,一般 AWS

擔任 管理帳戶中IAM的角色。

作為安全最佳實務,我們建議您在繼續之前擔任新management-account-roleIAM角色。在AWS命令列介面 (AWS CLI) 中,於其他資訊區段中輸入 命令,擔任管理帳戶IAM角色

DevOps 工程師,一般 AWS

執行設定指令碼。

在儲存庫root資料夾中,執行下列命令以啟動設定指令碼。

bash scripts/full-setup.sh

full-setup.sh 指令碼會執行下列動作:

  • 將所有組態值匯出為環境變數

  • 為每個 Terraform 模組產生 backend.tf 和 terraform.tfvars 程式碼檔案

  • 透過 AWS GuardDuty 啟用組織中 的受信任存取CLI。

  • 將組織狀態匯入 Terraform 狀態

  • 建立 S3 儲存貯體,以在記錄帳戶中發佈調查結果

  • 建立AWSKMS金鑰以加密安全帳戶中的調查結果

  • 架構一節所述,在所有選取的區域中 GuardDuty 跨組織啟用

DevOps 工程師,Python
任務描述所需的技能

執行清除指令碼。

如果您使用此模式 GuardDuty 為組織啟用 ,並想要停用 GuardDuty,請在儲存庫root資料夾中執行下列命令以啟動 cleanup-gd.sh 指令碼。

bash scripts/cleanup-gd.sh

此指令碼 GuardDuty 會在目標組織中停用、移除任何部署的資源,並在使用 Terraform 啟用 之前將組織還原至其先前的狀態 GuardDuty。

請注意,此指令碼不會從本機和遠端後端移除 Terraform 狀態檔案或鎖定檔案。如果您需要這樣做,您必須手動執行這些動作。此外,此指令碼不會刪除匯入的組織或其管理的帳戶。的信任存取 GuardDuty 不會在清除指令碼中停用。

DevOps 工程師、一般 AWS、Terraform、Python

移除IAM角色。

刪除使用 role-to-assume-for-role-creation.yamlmanagement-account-role.yaml CloudFormation 範本建立的堆疊。如需詳細資訊,請參閱刪除堆疊 (CloudFormation 文件)。

DevOps 工程師,一般 AWS

相關資源

AWS 文件

AWS 行銷

其他資源

其他資訊

複製儲存庫

執行下列命令來複製 GitHub 儲存庫。

git clone https://github.com/aws-samples/amazon-guardduty-for-aws-organizations-with-terraform

擔任管理帳戶IAM角色

若要在管理帳戶中擔任IAM角色,請執行下列命令。<IAM role ARN> 將 取代為 IAM角色ARN的 。

export ROLE_CREDENTIALS=$(aws sts assume-role --role-arn <IAM role ARN> --role-session-name AWSCLI-Session --output json) export AWS_ACCESS_KEY_ID=$(echo $ROLE_CREDENTIALS | jq .Credentials.AccessKeyId | sed 's/"//g') export AWS_SECRET_ACCESS_KEY=$(echo $ROLE_CREDENTIALS | jq .Credentials.SecretAccessKey | sed 's/"//g') export AWS_SESSION_TOKEN=$(echo $ROLE_CREDENTIALS | jq .Credentials.SessionToken | sed 's/"//g')