使用 AWS CloudFormation 範本有條件地啟用 Amazon GuardDuty - AWS 方案指引

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

使用 AWS CloudFormation 範本有條件地啟用 Amazon GuardDuty

Ram Kandaswamy,Amazon Web Services

總結

AWS CloudFormation是基礎設施即程式碼 (IaC) 工具,可協助您透過以範本為基礎的部署來管理 AWS 資源。CloudFormation 通常用於管理 AWS 資源。使用它來啟用 AWS 服務,例如 Amazon GuardDuty,可能會帶來獨特的挑戰。GuardDuty 是一種威脅偵測服務,可持續監控您的 AWS 帳戶 是否有惡意活動和未經授權的行為。與可多次建立的典型資源不同,GuardDuty 是一種服務,每個帳戶和 都需要啟用一次 AWS 區域。傳統 CloudFormation 條件僅支援靜態值比較,因此很難檢查 GuardDuty 等服務的目前狀態。如果您嘗試在已啟用的帳戶中透過 CloudFormation 啟用 GuardDuty,堆疊部署會失敗。這可能會為管理多帳戶環境的 DevOps 團隊帶來營運挑戰。

此模式引入了此挑戰的解決方案。它使用由 AWS Lambda函數支援的 CloudFormation 自訂資源來執行動態狀態檢查。條件式邏輯只會在尚未啟用的情況下啟用 GuardDuty。它使用堆疊輸出來記錄 GuardDuty 狀態以供未來參考。

透過遵循此模式,您可以自動化整個 AWS 基礎設施的 GuardDuty 部署,同時保持乾淨、可預測的 CloudFormation 堆疊操作。這種方法對以下組織特別有用:

  • AWS 帳戶 透過 IaC 管理多個

  • 大規模實作安全服務

  • 需要等冪基礎設施部署

  • 自動化安全服務部署

先決條件和限制

先決條件

  • 作用中 AWS 帳戶

  • 具有建立、更新和刪除 CloudFormation 堆疊許可的 AWS Identity and Access Management (IAM) 角色

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

限制

如果 AWS 帳戶 或 的 GuardDuty 已手動停用 AWS 區域,則此模式不會為該目標帳戶或區域啟用 GuardDuty。

Architecture

目標技術堆疊

模式使用 CloudFormation 做為基礎設施的程式碼 (IaC)。您可以使用由 Lambda 函數支援的 CloudFormation 自訂資源來實現動態服務啟用功能。

目標架構

下列高階架構圖顯示透過部署 CloudFormation 範本來啟用 GuardDuty 的程序:

使用 CloudFormation 堆疊在 AWS 帳戶中啟用 GuardDuty。
  1. 您可以部署 CloudFormation 範本來建立 CloudFormation 堆疊。

  2. 堆疊會建立 IAM 角色和 Lambda 函數。

  3. Lambda 函數會擔任 IAM 角色。

  4. 如果目標上尚未啟用 GuardDuty AWS 帳戶,Lambda 函數會啟用它。

自動化和擴展

您可以使用 AWS CloudFormation StackSet 功能將此解決方案擴展到多個 AWS 帳戶 和 AWS 區域。如需詳細資訊,請參閱 CloudFormation 文件中的使用 AWS CloudFormation StackSets

工具

  • AWS Command Line Interface (AWS CLI) 是一種開放原始碼工具,可協助您 AWS 服務 透過命令列 shell 中的命令與 互動。

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

  • Amazon GuardDuty 是一項持續的安全監控服務,可分析和處理日誌,以識別您 AWS 環境中非預期和可能未經授權的活動。

  • AWS Identity and Access Management (IAM) 透過控制已驗證並獲授權使用的人員,協助您安全地管理對 AWS 資源的存取。

  • AWS Lambda 是一項運算服務,可協助您執行程式碼,無需佈建或管理伺服器。它只會在需要時執行程式碼並自動擴展,因此您只需按使用的運算時間付費。

史詩

任務Description所需的技能

將程式碼儲存在 Amazon S3 中。

  1. 在此模式的其他資訊區段中複製 Python 程式碼。

  2. 在文字編輯器中貼上程式碼。

  3. 儲存檔案為 index.py

  4. 將 檔案上傳到 Amazon Simple Storage Service (Amazon S3) 儲存貯體。如需說明,請參閱 Amazon S3 文件中的上傳物件。 Amazon S3

AWS DevOps

建立 CloudFormation 範本。

  1. 開啟 CloudFormation 主控台

  2. 在左側導覽窗格中,選擇 Infrastructure Composer

  3. 如果您沒有看到空白畫布,請建立新的專案。

  4. 將 AWS Lambda 函數拖放到畫布上。

  5. 在範本檢視中,驗證 Lambda 函數和日誌群組是否存在。

  6. 將 Lambda 函數Runtime的 修改為最新版本的 Python。

  7. 驗證 Handler 屬性的值為 index.lambda_handler.

  8. CodeUri 屬性設定為上傳 Python 程式碼的 Amazon S3 位置。範例值為 s3://amzn-s3-demo-bucket/key-name

  9. 新增資源的Policies屬性。遵循安全最佳實務,提供允許 CloudFormation 和 GuardDuty 動作的最低權限存取許可。例如,您可以將 AWSLambdaExecute受管政策用於 日誌,並將 自訂iam:CreateServiceLinkedRole用於 GuardDuty。

  10. 導覽至範本檢視,將自訂資源定義新增至程式碼片段。

    CheckResourceExist: Type: 'Custom::LambdaCustomResource' Properties: ServiceToken: !GetAtt Function.Arn
  11. 將範本儲存為 sample.yaml

AWS DevOps

建立 CloudFormation 堆疊。

  1. 在 中 AWS CLI,輸入下列命令。這會使用 sample.yaml 檔案建立新的 CloudFormation 堆疊。如需詳細資訊,請參閱 CloudFormation 文件中的建立堆疊

    aws cloudformation create-stack \ --stack-name guardduty-cf-stack \ --template-body file://sample.yaml
  2. 確認下列值出現在 中 AWS CLI,表示堆疊已成功建立。建立堆疊所需的時間可能有所不同。

    "StackStatus": "CREATE_COMPLETE",
AWS DevOps

驗證是否已為 啟用 GuardDuty AWS 帳戶。

  1. 登入 AWS 管理主控台 並開啟 GuardDuty 主控台

  2. 確認 GuardDuty 服務已啟用。

雲端管理員、AWS 管理員

設定其他帳戶或區域。

根據您的使用案例,使用 CloudFormation StackSet 功能將此解決方案擴展到多個 AWS 帳戶 和 AWS 區域。如需詳細資訊,請參閱 CloudFormation 文件中的使用 AWS CloudFormation StackSets

雲端管理員、AWS 管理員

相關資源

參考

教學課程和影片

其他資訊

Python 程式碼

import boto3 import os import json from botocore.exceptions import ClientError import cfnresponse guardduty=boto3.client('guardduty') cfn=boto3.client('cloudformation') def lambda_handler(event, context): print('Event: ', event) if 'RequestType' in event: if event['RequestType'] in ["Create","Update"]: enabled=False try: response=guardduty.list_detectors() if "DetectorIds" in response and len(response["DetectorIds"])>0: enabled="AlreadyEnabled" elif "DetectorIds" in response and len(response["DetectorIds"])==0: cfn_response=cfn.create_stack( StackName='guardduty-cfn-stack', TemplateBody='{ "AWSTemplateFormatVersion": "2010-09-09", "Description": "Guard duty creation template", "Resources": { "IRWorkshopGuardDutyDetector": { "Type": "AWS::GuardDuty::Detector", "Properties": { "Enable": true } } } }' ) enabled="True" except Exception as e: print("Exception: ",e) responseData = {} responseData['status'] = enabled cfnresponse.send(event, context, cfnresponse.SUCCESS, responseData, "CustomResourcePhysicalID" ) elif event['RequestType'] == "Delete": cfn_response=cfn.delete_stack( StackName='guardduty-cfn-stack') cfnresponse.send(event, context, cfnresponse.SUCCESS, {})