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

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

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

由安德魯·洛克(AWS),凱拉什·哈維達爾(AWS),妮可·布朗(AWS)和坦亞·豪威爾(AWS)創建

代碼存儲庫:aws-config-custom-rule- 雲格式化保護

環境:PoC 或試點

技術:安全性、身分識別、合規性、管理與治理

AWS 服務:AWS CloudFormation;AWS Config

Summary

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

使用 Guard 建立的規則比受管規則提供更精細的控制,而且通常比完全自訂 Lambda 規則更容易設定。這種方法使工程師和架構師能夠建立規則,而無需了解 Python、NodeJS 或 Java,這些都是透過 Lambda 部署自訂規則所需的。

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

目標

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

先決條件和限制

先決條件

  • 一個活躍的 AWS 帳戶

  • AWS Config,您的 AWS 帳戶

限制

  • 保護自訂規則只能查詢目標設定項目 JSON 記錄中的索引鍵值配對

架構

您可以將安全警衛語法套用至 AWS Config 規則,做為自訂原則。 AWS Config 擷取每個指定資源的階層式 JSON。 AWS Config 組態項目的 JSON 包含索引鍵值配對。這些屬性用於警衛語法中,做為指派給其對應值的變數。 

以下是安全警衛語法的說明。組態項目 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 會部署使用安全警衛語法驗證加密磁碟區符合性的 AWS Config 自訂規則。此規則會驗證磁碟機是否正在使用中,並確認磁碟機類型為 gp3。

以下是案例 1 的組 AWS Config 態項目範例。 此組態項目中有三個金鑰-值配對,用來做為警衛原則中的變數:volumestatusvolumeencryptionstatus、和volumetype。此外,resourceType金鑰也會用作安全防護原則中的篩選器。

{ "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指令定義變數。  系統會為它們指定一個名稱與值,該名稱與值衍生自組態項目的屬性。

  • compliancecheck規則塊添加了一個查找匹配AWS::EC2::VolumeresourceType鍵值對的時候條件依賴關係。如果找到相符項目,則規則會繼續處理其餘的 JSON 屬性,並在下列三個條件下尋找相符項目:stateencrypted、和volumeType

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 }

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

案例 2: GuardDuty 合規

案例 2 會部署使用安全警衛語法驗證 Amazon GuardDuty 合規的 AWS Config 自訂規則。此規則會驗證 GuardDuty 記錄機是否已啟用 Amazon S3 保護和 Amazon EKS 保護。它還會驗證發 GuardDuty 現項目是否每 15 分鐘發佈一次。此案例可以部署在所有組織中 AWS 帳戶 ,也可以部署 AWS 區域 在組織中 (在中 AWS Organizations)。

以下是案例 2 的組 AWS Config 態項目範例。此組態項目中有三個金鑰-值配對,用來做為警衛原則中的變數:FindingPublishingFrequencyS3Logs、和Kubernetes。此外,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指令定義變數。  系統會為它們指定一個名稱與值,該名稱與值衍生自組態項目的屬性。

  • compliancecheck規則塊添加了一個查找匹配AWS::GuardDuty::DetectorresourceType鍵值對的時候條件依賴關係。如果找到相符項目,則規則會繼續處理其餘的 JSON 屬性,並在下列三個條件下尋找相符項目:S3Logs.EnableKubernetes.AuditLogs.Enable、和FindingPublishingFrequency

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 }

如需實作此自訂規則的完整安全防護自訂原則,請參閱 GitHub 程式碼儲存庫中的 awsconfig-guard-cft-gd.yaml。如需在安全警衛中部署此自訂原則的 HashiCorp Terraform 程式碼,請參閱程式碼儲存庫中的 awsconfig-guard-tf-gd.json。

工具

AWS 服務

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

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

其他工具

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

代碼存儲庫

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

史诗

任務描述所需技能

(選擇性) 選取規則的機碼值配對。

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

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

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

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

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

  5. 選擇檢視組態項目 (JSON)。此區段會展開以 JSON 格式顯示組態項目。

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

AWS 管理員、安全工程師

建立自訂規則。

使用您先前識別的索引鍵值配對,或使用提供的其中一個範例防護原則策略,依照建立 AWS Config 自訂原則規則中的指示來建立自訂規則。

AWS 管理員、安全工程師

驗證自訂規則。

執行下列其中一項動作來驗證自訂守門員規則:

  • 在 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 管理員、安全工程師

故障診斷

問題解決方案

測試以外的安全警衛政策 AWS Config

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

  1. 安裝 AWS CloudFormation Guard CLI 及其依賴項。

  2. 將 JSON 格式的 CI 樣本另存為 .json 文件到您的工作站。

  3. 將 GuardDuty 原則儲存為 .guard 檔案至您的工作站。

  4. 在安全警衛 CLI 中,輸入下列命令,以使用安全警衛原則驗證範例 JSON 檔案。

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

偵錯自 AWS Config 訂規則

在您的安全警衛政策中,將EnableDebugLogDelivery值變更為true。預設值為 false。日誌消息存儲在 Amazon CloudWatch。

相關資源

AWS 文件

AWS 部落格文章和工作坊

其他資源