View a markdown version of this page

AWS Validazione CDK al momento della sintesi - AWS Cloud Development Kit (AWS CDK) v2

Questa è la AWS CDK v2 Developer Guide. Il vecchio CDK v1 è entrato in manutenzione il 1° giugno 2022 e ha terminato il supporto il 1° giugno 2023.

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

AWS Validazione CDK al momento della sintesi

Validazione al momento della sintesi

L'applicazione AWS CDK genera una descrizione dell'infrastruttura al momento della sintesi sotto forma di CloudFormation modelli. Questi modelli vengono convalidati immediatamente dopo la sintesi. Il AWS CDK è dotato di un set integrato di regole di convalida, che è possibile estendere con altri strumenti di CDK-specific convalida come CDK Nag o qualsiasi strumento di convalida delle politiche già utilizzato dall'organizzazione, come Guard o OPA.AWS CloudFormation In caso di violazioni, la sintesi avrà esito negativo e un rapporto verrà stampato sulla console. Utilizzando la convalida offline dei modelli sintetizzati, è possibile individuare e risolvere tempestivamente potenziali problemi dell'infrastruttura. La convalida può essere utilizzata per individuare problemi che potrebbero portare a implementazioni non riuscite, configurazioni errate comuni o mancata conformità agli standard aziendali.

Nota

Le Beta1 interfacce precedenti (ad esempio IPolicyValidationPluginBeta1PolicyValidationPluginReportBeta1, e la policyValidationBeta1 proprietà onStage) sono state convertite in equivalenti stabili e senza suffissi (ad esempio,). IPolicyValidationPlugin PolicyValidationPluginReport Le Beta1 interfacce sono obsolete ma continuano a funzionare. Il modo consigliato per registrare i plugin di convalida ora è tramite la classe anziché la Validations proprietà. policyValidationBeta1

Cos'è e cosa non è la convalida

La convalida eseguita dal AWS CDK al momento della sintesi è la migliore soluzione per migliorare l'esperienza degli sviluppatori; di per sé non è un meccanismo completo di conformità agli standard. Convalida i modelli generati normalmente da un'app CDK, ma non può influire sulle azioni che avvengono al di fuori della sintesi. Ad esempio, azioni eseguite direttamente nella console o tramite le API di servizio. Inoltre, poiché le app CDK sono scritte in un linguaggio di programmazione generico, gli sviluppatori determinati sono in grado di aggirare il meccanismo di convalida, se lo desiderano. Ecco perché la convalida CDK è un meccanismo shift-left per la convalida anticipata e dovrebbe essere utilizzata in combinazione con un altro meccanismo per convalidare i set di regole desiderati come hooks o Config.AWS CloudFormation AWS

Per gli sviluppatori di applicazioni

Aggiungere plugin di convalida

La convalida viene eseguita dai plugin di convalida. Un plug-in predefinito che utilizza un set di regole completo per le risorse AWS viene aggiunto automaticamente all'applicazione, in base a @ aws/cloudformation -validate. Se desideri aggiungere plug-in aggiuntivi alla tua applicazione, usa la classe: Validations

import { Validations } from 'aws-cdk-lib'; import { CfnGuardValidator } from '@cdklabs/cdk-validator-cfnguard'; const app = new App(); // Add a validation plugin to the entire app Validations.of(app).addPlugins(new CfnGuardValidator()); // Or add to a particular stage const prodStage = new Stage(app, 'ProdStage'); Validations.of(prodStage).addPlugins(new CfnGuardValidator());

Immediatamente dopo la sintesi, tutti i plugin registrati in questo modo verranno richiamati per convalidare tutti i modelli generati nell'ambito definito. In particolare, se si registrano i modelli nell'Appoggetto, tutti i modelli saranno soggetti a convalida.

avvertimento

I plugin hanno pieno accesso al computer quando sono in esecuzione. È tua responsabilità, in qualità di consumatore di un plug-in, verificare che provenga da una fonte attendibile.

Rapporto di convalida

Quando sintetizzi l'app AWS CDK, verranno richiamati i plugin di convalida e i risultati verranno stampati. Di seguito è riportato un esempio di rapporto.

lib/my-custom-l3-construct.ts:10:5 ERROR [CT.S3.PR.1]: Require an Amazon S3 bucket to have block public access settings configured (cdk-validator-cfnguard) MyStack/MyCustomL3Construct/Bucket/Resource (MyCustomL3ConstructBucket8C61BCA7) constructs.Construct Suggested fix: [FIX]: The parameters 'BlockPublicAcls', 'BlockPublicPolicy', 'IgnorePublicAcls', 'RestrictPublicBuckets' must be set to true under the bucket-level 'PublicAccessBlockConfiguration'. Acknowledge with 'cdk-validator-cfnguard::s3_bucket_level_public_access_prohibited_check' lib/my-custom-l3-construct.ts:10:5 ERROR [CT.S3.PR.10]: Require an Amazon S3 bucket to have server-side encryption configured using an AWS KMS key (cdk-validator-cfnguard) MyStack/MyCustomL3Construct/Bucket/Resource (MyCustomL3ConstructBucket8C61BCA7) constructs.Construct Suggested fix: [FIX]: Set an encryption rule in 'BucketEncryption.ServerSideEncryptionConfiguration' with a 'ServerSideEncryptionByDefault.SSEAlgorithm' configuration of 'aws:kms' or 'aws:kms:dsse' Acknowledge with 'cdk-validator-cfnguard::s3_bucket_default_encryption_kms_check' ...

Per impostazione predefinita, il rapporto verrà stampato in un formato leggibile dall'uomo. Se desideri un report in formato JSON, abilitalo @aws-cdk/core:validationReportJson utilizzando la CLI o passandolo direttamente all'applicazione:

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

In alternativa, puoi impostare questa coppia chiave-valore di contesto utilizzando cdk.context.json i file cdk.json o nella directory del tuo progetto (vedi Valori di contesto e CDK). AWS

Se scegli il formato JSON, il AWS CDK stamperà il rapporto di convalida delle politiche in un file chiamato policy-validation-report.json nella directory di assemblaggio cloud. Per il formato predefinito, leggibile dall'uomo, il report verrà stampato sullo standard output.

Riconoscere gli avvertimenti

Se hai valutato un avviso o un errore e lo ritieni non pertinente, puoi eliminarlo utilizzando il metodo. acknowledge La soppressione è basata sull'ambito e si applica a tutti i costrutti nell'ambito specificato.

import { Validations } from 'aws-cdk-lib'; Validations.of(myConstruct).acknowledge({ id: 'PluginName::MyWarningId', reason: 'This is acceptable for our use case', });

idUtilizza un :: delimitatore per separare il prefisso dell'origine di convalida dal nome della regola (ad esempio, o). Construct-Annotations:: AwsSolutions-S1::

AWS CloudFormation Plugin Guard

L'utilizzo del CfnGuardValidatorplug-in consente di utilizzare AWS CloudFormation Guard per eseguire convalide delle politiche. Il CfnGuardValidator plug-in viene fornito con un set selezionato di controlli proattivi AWS Control Tower integrati. L'attuale set di regole è disponibile nella documentazione del progetto. Come menzionato in La convalida delle politiche al momento della sintesi, raccomandiamo alle organizzazioni di impostare un metodo di convalida più autorevole utilizzando gli hook.AWS CloudFormation

Per i clienti AWS Control Tower, questi stessi controlli proattivi possono essere implementati in tutta l'organizzazione. Quando abiliti i controlli proattivi AWS Control Tower nel tuo ambiente AWS Control Tower, i controlli possono interrompere l'implementazione di risorse non conformi distribuite tramite. AWS CloudFormation Per ulteriori informazioni sui controlli proattivi gestiti e sul loro funzionamento, consulta la documentazione AWS Control Tower.

Questi controlli in bundle AWS CDK e i controlli proattivi AWS Control Tower gestiti sono utilizzati al meglio insieme. In questo scenario puoi configurare questo plug-in di convalida con gli stessi controlli proattivi attivi nell'ambiente cloud AWS Control Tower. È quindi possibile acquisire rapidamente la certezza che l'applicazione AWS CDK supererà i controlli della AWS Control Tower eseguendo cdk synth localmente.

AWS Plugin CDK Nag

Puoi usare CDK Nag per controllare la tua infrastruttura rispetto a una serie di standard come HIPAA, PCI DSS e così via. La versione 3.x di cdk-nag si integra con il meccanismo di convalida standardizzato di CDK.

Per gli autori delle costruzioni: aggiunta diretta di avvisi ed errori

La Validations classe fornisce anche metodi per aggiungere avvisi ed errori personalizzati direttamente ai costrutti. È possibile utilizzare questo meccanismo per segnalare configurazioni errate direttamente sul costrutto senza dover implementare un plug-in di convalida. Le convalide e gli errori aggiunti in questo modo verranno segnalati insieme alle violazioni rilevate dai plugin di convalida.

import { Validations } from 'aws-cdk-lib'; const bucket = new s3.Bucket(this, 'MyBucket'); // Add a warning Validations.of(bucket).addWarning('MyWarningId', 'This bucket does not have versioning enabled'); // Add an error (will cause synthesis to fail) Validations.of(bucket).addError('MyErrorId', 'This bucket must have encryption enabled');

Per gli autori di plugin

Il framework di base AWS CDK è responsabile della registrazione e dell'invocazione dei plugin e della successiva visualizzazione del rapporto di convalida formattato. La responsabilità del plug-in è quella di fungere da livello di traduzione tra il framework AWS CDK e uno strumento esterno di convalida delle politiche a cui il plug-in potrebbe, ad esempio, sborsare. Un plugin può essere creato in qualsiasi lingua supportata da AWS CDK. Se stai creando un plug-in che potrebbe essere utilizzato da più lingue, ti consigliamo di crearlo in TypeScript modo da poter utilizzare JSII per pubblicare il plug-in in ogni AWS lingua CDK.

Creazione di plugin

Il protocollo di comunicazione tra il modulo principale AWS CDK e lo strumento di policy è definito dall'IPolicyValidationPlugininterfaccia. Per creare un nuovo plugin è necessario scrivere una classe che implementi questa interfaccia. Ci sono due cose che devi implementare: il nome del plugin (sovrascrivendo la name proprietà) e il validate() metodo.

Il framework chiameràvalidate(), passando un IPolicyValidationContext oggetto. La posizione dei modelli da convalidare è data datemplatePaths. Il plugin dovrebbe restituire un'istanza di. PolicyValidationPluginReport Questo oggetto rappresenta il rapporto che l'utente riceverà alla fine della sintesi.

validate(context: IPolicyValidationContext): PolicyValidationPluginReport { // 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', }], }], }; }

Nota che i plugin non sono autorizzati a modificare nulla nell'assembly cloud. Qualsiasi tentativo in tal senso comporterà un errore di sintesi.

Se il tuo plugin dipende da uno strumento esterno a cui devi ricorrere, tieni presente che alcuni sviluppatori potrebbero non aver ancora installato questo strumento nelle loro workstation. Per ridurre al minimo l'attrito, fornite uno script di installazione insieme al pacchetto del plugin per automatizzare il processo di installazione.

Gestione delle esenzioni

Se l'organizzazione dispone di un meccanismo per la gestione delle esenzioni, può essere implementato come parte del plugin di convalida.

Uno scenario di esempio per illustrare un possibile meccanismo di esenzione:

  • Un'organizzazione ha una regola secondo cui i bucket Amazon S3 pubblici non sono consentiti, tranne in determinati scenari.

  • Uno sviluppatore sta creando un bucket Amazon S3 che rientra in uno di questi scenari e richiede un'esenzione (ad esempio, crea un ticket).

  • Gli strumenti di sicurezza sanno leggere dal sistema interno che registra le esenzioni

In questo scenario lo sviluppatore richiederebbe un'eccezione nel sistema interno e quindi avrà bisogno di un modo per «registrare» tale eccezione. Oltre all'esempio del plugin guard, potresti creare un plug-in che gestisca le esenzioni filtrando le violazioni che hanno un'esenzione corrispondente in un sistema di ticketing interno.

Vedi i plugin esistenti per esempio per le implementazioni.