這是 AWS CDK v2 開發人員指南。較舊的 CDK v1 已於 2022 年 6 月 1 日進入維護,並於 2023 年 6 月 1 日結束支援。
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
AWS CDK 合成時的政策驗證
合成時的政策驗證
如果您或您的組織使用任何政策驗證工具,例如 AWS CloudFormation Guard或 OPA
於 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 外掛程式
使用 CfnGuardValidatorCfnGuardValidator
外掛程式隨附一組內建的主動AWS Control Tower 控制。目前的規則集可在專案文件
對於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:validationReportJson
CLI或直接將其傳遞給應用程式:
const app = new App({ context: { '@aws-cdk/core:validationReportJson': true }, });
或者,您可以使用專案目錄中的 cdk.json
或 cdk.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 儲存貯體,並請求豁免 (例如建立票證)。
-
安全工具知道如何從註冊豁免的內部系統讀取
在這種情況下,開發人員會在內部系統中請求例外狀況,然後需要某種方法來「註冊」該例外狀況。將 新增至防護外掛程式範例,您可以建立外掛程式,透過篩選內部票證系統中具有相符豁免的違規,來處理豁免。
如需實作範例,請參閱現有的外掛程式。