使用 AWS CloudFormation Guard 政策建立 AWS Config 自訂規則 - AWS 方案指引

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

使用 AWS CloudFormation Guard 政策建立 AWS Config 自訂規則

由 Andrew Lok (AWS)、Kailash Havildar ()AWS、Nicole Brown (AWS) 和 Tanya Howell (AWS) 建立

程式碼儲存庫:aws-config-custom-rule-cloudformation-guard

環境:PoC 或試行

技術:安全、身分、合規;管理與治理

AWS 服務:AWS CloudFormation;AWSConfig

Summary

AWS Config 規則可協助您評估 AWS 資源及其目標組態狀態。有兩種類型的 AWS Config 規則: 受管和自訂。您可以使用 AWS Lambda 函數或使用 AWS CloudFormation Guard(GitHub) 語言 policy-as-code建立自訂規則。

使用 Guard 建立的規則提供比受管規則更精細的控制,而且通常比完全自訂的 Lambda 規則更容易設定。此方法可讓工程師和架構師能夠建置規則,而不需要知道 Python、NodeJS 或 Java,而這些是透過 Lambda 部署自訂規則的必要條件。

此模式提供可行的範本、程式碼範例和部署方法,協助您使用 Guard 來採用自訂規則。透過使用此模式,管理員可以使用 AWS Config 建置具有組態項目屬性的自訂合規規則。例如,開發人員可以針對 AWS Config 組態項目使用 Guard 政策來持續監控部署 AWS 和非AWS 資源的狀態、偵測規則違規,並自動啟動修復。

目標

讀取此模式後,您應該能夠:

先決條件和限制

先決條件

  • 作用中 AWS 帳戶

  • AWS Config,在 中設定 AWS 帳戶

限制

  • Guard 自訂規則只能查詢目標組態項目JSON記錄中的鍵值對

架構

您可以將 Guard 語法套用到 AWS Config 規則作為自訂政策。 AWS Config 擷取每個指定資源JSON的階層。 AWS Config 組態項目JSON的 包含鍵值對。這些屬性在 Guard 語法中用作指派給其對應值的變數。 

以下是 Guard 語法的說明。JSON 使用組態項目中的變數,並加上%字元。

# declare variable let <variable name> = <'value'> # create rule and assign condition and policy rule <rule name> when <CI json key> == <"CI json value"> { <top level CI json key>.<next level CI json key> == %<variable name> }

案例 1:Amazon EBS磁碟區

案例 1 部署使用 Guard 語法來驗證加密磁碟區的合規性的 AWS Config 自訂規則。此規則會驗證磁碟機是否正在使用,並驗證磁碟機類型是否為 gp3。

以下是案例 1 的 AWS Config 組態項目範例。此組態項目中有三個鍵值對,用作 Guard 政策中的變數:volumestatusvolumeencryptionstatusvolumetype。此外,resourceType金鑰也會用作 Guard 政策中的篩選條件。

{ "version": "1.3", "accountId": "111111111111", "configurationItemCaptureTime": "2023-01-15T19:04:45.402Z", "configurationItemStatus": "ResourceDiscovered", "configurationStateId": "4444444444444", "configurationItemMD5Hash": "", "arn": "arn:aws:ec2:us-west-2:111111111111:volume/vol-222222222222", "resourceType": "AWS::EC2::Volume", "resourceId": "vol-222222222222", "awsRegion": "us-west-2", "availabilityZone": "us-west-2b", "resourceCreationTime": "2023-01-15T19:03:22.247Z", "tags": {}, "relatedEvents": [], "relationships": [ { "resourceType": "AWS::EC2::Instance", "resourceId": "i-33333333333333333", "relationshipName": "Is attached to Instance" } ], "configuration": { "attachments": [ { "attachTime": "2023-01-15T19:03:22.000Z", "device": "/dev/xvda", "instanceId": "i-33333333333333333", "state": "attached", "volumeId": "vol-222222222222", "deleteOnTermination": true, "associatedResource": null, "instanceOwningService": null } ], "availabilityZone": "us-west-2b", "createTime": "2023-01-15T19:03:22.247Z", "encrypted": false, "kmsKeyId": null, "outpostArn": null, "size": 8, "snapshotId": "snap-55555555555555555", "state": "in-use", "volumeId": "vol-222222222222", "iops": 100, "tags": [], "volumeType": "gp2", "fastRestored": null, "multiAttachEnabled": false, "throughput": null, "sseType": null }, "supplementaryConfiguration": {} }

以下是使用 Guard 語法定義案例 1 中的變數和規則的範例。於下列範例中:

  • 前三行使用 let命令定義變數。  系統會為他們指派衍生自組態項目屬性的名稱和值。

  • 當條件相依性尋找符合 的resourceType鍵值對時,compliancecheck規則區塊會新增 AWS::EC2::Volume。如果找到相符項目,則規則會繼續進行其餘JSON屬性,並在下列三個條件中尋找相符項目:stateencryptedvolumeType

let volumestatus = 'available' let volumetype = 'gp3' let volumeencryptionstatus = true rule compliancecheck when resourceType == "AWS::EC2::Volume" { configuration.state == %volumestatus configuration.encrypted == %volumeencryptionstatus configuration.volumeType == %volumetype }

如需實作此自訂規則的完整 Guard 自訂政策,請參閱 GitHub 程式碼儲存庫中的 awsconfig-guard-cft.yamlawsconfig-guard-tf-ec2vol.json。如需在 Guard 中部署此自訂政策的 HashiCorp Terraform 程式碼,請參閱程式碼儲存庫中的 awsconfig-guard-tf-example.json

案例 2: GuardDuty 合規

案例 2 部署使用 Guard 語法來驗證 Amazon GuardDuty 合規的 AWS Config 自訂規則。此規則會驗證 GuardDuty 記錄器是否已啟用 Amazon S3 Protection 和 Amazon EKS Protection。它還會驗證每隔 15 分鐘發佈一次 GuardDuty 調查結果。此案例可以部署在組織中 (在 AWS 區域 中 AWS Organizations) 的所有 AWS 帳戶 和 。

以下是案例 2 的 AWS Config 組態項目範例。此組態項目中有三個索引鍵值對,它們用作 Guard 政策中的變數:FindingPublishingFrequencyS3LogsKubernetes。此外, resourceType金鑰會用作政策中的篩選條件。

{ "version": "1.3", "accountId": "111111111111", "configurationItemCaptureTime": "2023-11-27T13:34:28.888Z", "configurationItemStatus": "OK", "configurationStateId": "7777777777777", "configurationItemMD5Hash": "", "arn": "arn:aws:guardduty:us-west-2:111111111111:detector/66666666666666666666666666666666", "resourceType": "AWS::GuardDuty::Detector", "resourceId": "66666666666666666666666666666666", "resourceName": "66666666666666666666666666666666", "awsRegion": "us-west-2", "availabilityZone": "Regional", "resourceCreationTime": "2020-02-17T02:48:04.511Z", "tags": {}, "relatedEvents": [], "relationships": [], "configuration": { "Enable": true, "FindingPublishingFrequency": "FIFTEEN_MINUTES", "DataSources": { "S3Logs": { "Enable": true }, "Kubernetes": { "AuditLogs": { "Enable": true } } }, "Id": "66666666666666666666666666666666", "Tags": [] }, "supplementaryConfiguration": { "CreatedAt": "2020-02-17T02:48:04.511Z" } }

以下是使用 Guard 語法定義案例 2 中的變數和規則的範例。於下列範例中:

  • 前三行使用 let命令定義變數。  系統會為他們指派衍生自組態項目屬性的名稱和值。

  • 當條件相依性尋找符合 的resourceType鍵值對時,compliancecheck規則區塊會新增 AWS::GuardDuty::Detector。如果找到相符項目,則規則會繼續進行其餘JSON屬性,並尋找下列三個條件的相符項目:S3Logs.EnableKubernetes.AuditLogs.EnableFindingPublishingFrequency

let s3protection = true let kubernetesprotection = true let publishfrequency = 'FIFTEEN_MINUTES' rule compliancecheck when resourceType == "AWS::GuardDuty::Detector" { configuration.DataSources.S3Logs.Enable == %s3protection configuration.DataSources.Kubernetes.AuditLogs.Enable == %kubernetesprotection configuration.FindingPublishingFrequency == %publishfrequency }

如需實作此自訂規則的完整 Guard 自訂政策,請參閱 GitHub 程式碼儲存庫中的 awsconfig-guard-cft-gd.yaml。如需在 Guard 中部署此自訂政策的 HashiCorp Terraform 程式碼,請參閱程式碼儲存庫中的 awsconfig-guard-tf-gd.json

工具

AWS 服務

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

  • AWS Config 提供 中資源的詳細檢視, AWS 帳戶 以及如何設定這些資源。它可協助您識別資源彼此之間的關係,以及其組態如何隨時間而改變。

其他工具

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

程式碼儲存庫

此模式的程式碼可在 GitHub AWS Config 搭配 AWS CloudFormation Guard 儲存庫中使用。此程式碼儲存庫包含此模式所述的兩種案例的範例。

史詩

任務描述所需的技能

(選用) 選取規則的鍵值對。

如果您要定義自訂 Guard 政策,請完成下列步驟。如果您使用案例 1 或 2 的其中一個範例政策,請略過這些步驟。

  1. 登入 AWS Management Console 並開啟AWS Config 主控台

  2. 在左側導覽中,選擇資源

  3. 在資源庫存中,選擇要為其建立 AWS Config 自訂規則的資源類型。

  4. 請選擇 View Details (查看詳細資訊)。

  5. 選擇檢視組態項目 (JSON)。本節會展開,以顯示 JSON 格式的組態項目。

  6. 識別您要為其建置 AWS Config 自訂規則的鍵值對。

AWS 管理員、安全工程師

建立自訂規則。

使用您先前識別的鍵值對,或使用其中一個提供的範例 Guard 政策,遵循建立 AWS Config 自訂政策規則中的指示來建立自訂規則。

AWS 管理員、安全工程師

驗證自訂規則。

執行下列其中一個動作來驗證自訂 Guard 規則:

  • 在 AWS Command Line Interface () 中輸入下列命令AWS CLI。

    cfn-guard validate -r guard-s3.guard -d s3bucket-prod-pass.json
  • 請依照 Detective 模式中使用 AWS Config 規則評估資源的指示,在 中部署規則 AWS Config。確認 Guard 語法正確符合目標帳戶或檔案中的對應資源。

AWS 管理員、安全工程師

故障診斷

問題解決方案

在 之外測試 Guard 政策 AWS Config

裝置測試可以在本機裝置或整合開發環境 (IDE) 中完成,例如 AWS Cloud9 IDE。若要執行單位測試,請執行下列動作:

  1. 安裝 AWS CloudFormation Guard CLI及其相依性。

  2. 將JSON格式化 CI 範例儲存為 .json 檔案到您的工作站。

  3. 將 GuardDuty 政策儲存為 .guard 檔案到您的工作站。

  4. 在 Guard 中CLI,輸入下列命令,使用 Guard 政策驗證範例JSON檔案。

    cfn-guard validate \ -r guard-s3.guard \ -d s3bucket-prod-pass.json

偵錯 AWS Config 自訂規則

在 Guard 政策中,將EnableDebugLogDelivery值變更為 true。預設值為 false。日誌訊息會儲存在 Amazon 中 CloudWatch。

相關資源

AWS 文件

AWS 部落格文章和研討會

其他資源