AWS CDK 合成時的政策驗證 - AWS Cloud Development Kit (AWS CDK) v2

這是 AWS CDK v2 開發人員指南。較舊的 CDK v1 已於 2022 年 6 月 1 日進入維護,並於 2023 年 6 月 1 日結束支援。

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

AWS CDK 合成時的政策驗證

合成時的政策驗證

如果您或您的組織使用任何政策驗證工具,例如 AWS CloudFormation GuardOPA來定義 AWS CloudFormation 範本的限制,您可以在合成時將其與 AWS CDK 整合。透過使用適當的政策驗證外掛程式,您可以讓 AWS CDK 應用程式在合成後立即針對您的政策檢查產生的 AWS CloudFormation 範本。如果有任何違規,合成將會失敗,而且報告會列印到主控台。

於 AWS CDK 合成時間執行的驗證會在部署生命週期中的某個時間點驗證控制項,但不會影響在合成之外發生的動作。範例包括直接在主控台或透過 服務 採取的動作APIs。它們在合成後不會抗拒變更 AWS CloudFormation 範本。應獨立設定其他機制,例如AWS CloudFormation 掛鉤或 ,以更具權威性的方式驗證相同的規則集AWS Config。不過,在開發期間 AWS CDK 評估規則集的能力仍然很有用,因為它將提高偵測速度和開發人員生產力。

AWS CDK 政策驗證的目標是將開發期間所需的設定數量降至最低,並盡可能地簡單。

注意

此功能被視為實驗性,而且驗證報告的外掛程式API和格式都可能在未來變更。

對於應用程式開發人員

若要在您的應用程式中使用一或多個驗證外掛程式,請使用 的 policyValidationBeta1 屬性Stage

import { CfnGuardValidator } from '@cdklabs/cdk-validator-cfnguard'; const app = new App({ policyValidationBeta1: [ new CfnGuardValidator() ], }); // only apply to a particular stage const prodStage = new Stage(app, 'ProdStage', { policyValidationBeta1: [...], });

合成後,會以這種方式註冊的所有外掛程式都會立即被叫用,以驗證在您定義的範圍內產生的所有範本。特別是,如果您在App物件中註冊範本,則所有範本都必須經過驗證。

警告

除了修改雲端組件之外,外掛程式還可以執行 AWS CDK 應用程式可以執行的任何動作。他們可以從檔案系統讀取資料、存取網路等。身為外掛程式的取用者,您有責任驗證其是否安全使用。

AWS CloudFormation Guard 外掛程式

使用 CfnGuardValidator 外掛程式可讓您使用 AWS CloudFormation Guard 來執行政策驗證。CfnGuardValidator 外掛程式隨附一組內建的主動AWS Control Tower 控制。目前的規則集可在專案文件 中找到。如 中所述合成時的政策驗證,我們建議組織使用AWS CloudFormation 勾點 設定更權威的驗證方法。

對於AWS Control Tower客戶,這些相同的主動控制可以部署在您的組織中。當您在 AWS Control Tower 環境中啟用 AWS Control Tower 主動控制時,這些控制可以停止透過 部署的不合規資源部署 AWS CloudFormation。如需受管主動控制及其運作方式的詳細資訊,請參閱 AWS Control Tower 文件

這些綁 AWS CDK 定控制項和受管 AWS Control Tower 主動控制項最好一起使用。在此案例中,您可以使用 AWS Control Tower 與雲端環境中作用中的相同主動控制項來設定此驗證外掛程式。然後,您可以透過cdk synth在本機執行,快速獲得 AWS CDK 應用程式傳遞 AWS Control Tower 控制項的信心。

驗證報告

當您合成 AWS CDK 應用程式時,系統會呼叫驗證器外掛程式,並列印結果。範例報告顯示如下。

Validation Report (CfnGuardValidator) ------------------------------------- (Summary) ╔═══════════╤════════════════════════╗ ║ Status │ failure ║ ╟───────────┼────────────────────────╢ ║ Plugin │ CfnGuardValidator ║ ╚═══════════╧════════════════════════╝ (Violations) Ensure S3 Buckets are encrypted with a KMS CMK (1 occurrences) Severity: medium Occurrences: - Construct Path: MyStack/MyCustomL3Construct/Bucket - Stack Template Path: ./cdk.out/MyStack.template.json - Creation Stack: └── MyStack (MyStack) │ Library: aws-cdk-lib.Stack │ Library Version: 2.50.0 │ Location: Object.<anonymous> (/home/johndoe/tmp/cdk-tmp-app/src/main.ts:25:20) └── MyCustomL3Construct (MyStack/MyCustomL3Construct) │ Library: N/A - (Local Construct) │ Library Version: N/A │ Location: new MyStack (/home/johndoe/tmp/cdk-tmp-app/src/main.ts:15:20) └── Bucket (MyStack/MyCustomL3Construct/Bucket) │ Library: aws-cdk-lib/aws-s3.Bucket │ Library Version: 2.50.0 │ Location: new MyCustomL3Construct (/home/johndoe/tmp/cdk-tmp-app/src/main.ts:9:20) - Resource Name: amzn-s3-demo-bucket - Locations: > BucketEncryption/ServerSideEncryptionConfiguration/0/ServerSideEncryptionByDefault/SSEAlgorithm Recommendation: Missing value for key `SSEAlgorithm` - must specify `aws:kms` How to fix: > Add to construct properties for `cdk-app/MyStack/Bucket` `encryption: BucketEncryption.KMS` Validation failed. See above reports for details

依預設,報告將以人類可讀格式列印。如果您想要 JSON 格式的報告,請透過 啟用報告,@aws-cdk/core:validationReportJsonCLI或直接將其傳遞給應用程式:

const app = new App({ context: { '@aws-cdk/core:validationReportJson': true }, });

或者,您可以使用專案目錄中的 cdk.jsoncdk.context.json 檔案來設定此內容索引鍵值對 (請參閱 內容值和 AWS CDK)。

如果您選擇 JSON 格式, AWS CDK 會將政策驗證報告列印到policy-validation-report.json雲端組件目錄中名為 的檔案。對於預設的人工可讀格式,報告將列印為標準輸出。

對於外掛程式作者

外掛程式

AWS CDK 核心架構負責註冊和叫用外掛程式,然後顯示格式化驗證報告。外掛程式的責任是充當 AWS CDK 架構與政策驗證工具之間的轉譯層。外掛程式可以使用 支援的任何語言建立 AWS CDK。如果您要建立可能由多種語言耗用的外掛程式,建議您在 中建立外掛程式,TypeScript以便使用 JSII在每個 AWS CDK 語言發佈外掛程式。

建立外掛程式

AWS CDK 核心模組與政策工具之間的通訊協定由 IPolicyValidationPluginBeta1介面定義。若要建立新的外掛程式,您必須撰寫實作此介面的類別。您需要實作兩件事:外掛程式名稱 (透過覆寫 name 屬性) 和 validate() 方法。

架構將呼叫 validate(),傳遞IValidationContextBeta1物件。要驗證的範本位置由 提供templatePaths。外掛程式應傳回 執行個體ValidationPluginReportBeta1。此物件代表使用者在合成結束時收到的報告。

validate(context: IPolicyValidationContextBeta1): PolicyValidationReportBeta1 { // First read the templates using context.templatePaths... // ...then perform the validation, and then compose and return the report. // Using hard-coded values here for better clarity: return { success: false, violations: [{ ruleName: 'CKV_AWS_117', description: 'Ensure that AWS Lambda function is configured inside a VPC', fix: 'https://docs.bridgecrew.io/docs/ensure-that-aws-lambda-function-is-configured-inside-a-vpc-1', violatingResources: [{ resourceName: 'MyFunction3BAA72D1', templatePath: '/home/johndoe/myapp/cdk.out/MyService.template.json', locations: 'Properties/VpcConfig', }], }], }; }

請注意,外掛程式不允許修改雲端組件中的任何內容。任何嘗試這樣做都會導致合成失敗。

如果您的外掛程式依賴外部工具,請記住,某些開發人員可能尚未在工作站中安裝該工具。為了盡量減少摩擦,強烈建議您提供一些安裝指令碼和外掛程式套件,以自動化整個程序。更好的是,在安裝套件的過程中執行該指令碼。例如npm,使用 ,您可以將其新增至package.json檔案中的postinstall指令碼

處理豁免

如果您的組織具有處理豁免的機制,則可以將其實作為驗證器外掛程式的一部分。

說明可能豁免機制的範例案例:

  • 組織有一個規則,即不允許公有 Amazon S3 儲存貯體,除非在特定情況下。

  • 開發人員正在建立屬於其中一個案例的 Amazon S3 儲存貯體,並請求豁免 (例如建立票證)。

  • 安全工具知道如何從註冊豁免的內部系統讀取

在這種情況下,開發人員會在內部系統中請求例外狀況,然後需要某種方法來「註冊」該例外狀況。將 新增至防護外掛程式範例,您可以建立外掛程式,透過篩選內部票證系統中具有相符豁免的違規,來處理豁免。

如需實作範例,請參閱現有的外掛程式。