Prima di iniziare
Installa Google Cloud CLI
Per utilizzare gcloud beta terraform vet
, devi prima installare Google Cloud CLI:
Installa Google Cloud CLI, ma salta il comando
gcloud init
.Esegui i seguenti comandi per installare il componente terraform-tools:
gcloud components update gcloud components install terraform-tools
Verifica che gcloud CLI sia installato eseguendo il seguente comando:
gcloud beta terraform vet --help
Ottenere le autorizzazioni richieste
L'account Google Cloud che utilizzi per la convalida deve disporre delle seguenti autorizzazioni:
getIamPolicy
:gcloud beta terraform vet
deve recuperare i criteri IAM (Identity and Access Management) completi e unirli a membri e associazioni per ottenere uno stato finale accurato da convalidare.resourcemanager.projects.get
:gcloud beta terraform vet
deve recuperare l'ascendenza del progetto dall'API per costruire con precisione un nome completo della risorsa CAI per tutti i progetti a cui sono correlate le risorse convalidate.resourcemanager.folders.get
:gcloud beta terraform vet
deve recuperare la struttura gerarchica delle cartelle dall'API per costruire con precisione un nome completo della risorsa CAI se le risorse validate contengono risorse correlate alle cartelle.
Configurare una libreria di criteri
Per utilizzare questo strumento, devi creare una libreria di criteri.
Convalidare i criteri
1. Genera un piano Terraform
gcloud beta terraform vet
è compatibile con Terraform 0.12 e versioni successive. gcloud beta terraform vet
accetta JSON terraform plan
come input. Puoi generare il file JSON eseguendo i seguenti comandi nella directory Terraform:
terraform plan -out=tfplan.tfplan terraform show -json ./tfplan.tfplan > ./tfplan.json
2. Esegui gcloud beta terraform vet
gcloud beta terraform vet
ti consente di convalidare il tuo file JSON terraform plan
in base al file POLICY_LIBRARY_REPO della tua organizzazione. Ad esempio:
git clone POLICY_LIBRARY_REPO POLICY_LIBRARY_DIR gcloud beta terraform vet tfplan.json --policy-library=POLICY_LIBRARY_DIR
Quando esegui questo comando, gcloud beta terraform vet
recupera i dati del progetto utilizzando le API Google Cloud necessarie per una convalida accurata del piano.
Bandiere
--policy-library=POLICY_LIBRARY_DIR
: directory che contiene una libreria di criteri.--project=PROJECT_ID
-gcloud beta terraform vet
accetta un flag--project
facoltativo. Questo flag specifica il progetto predefinito durante la creazione della struttura gerarchica (dalla gerarchia delle risorse Google Cloud) per qualsiasi risorsa che non abbia un progetto esplicito impostato.--format=FORMAT
: il valore predefinito è yaml. I formati supportati sono:default
,json
,none
,text
,yaml
. Per maggiori dettagli, esegui $ gcloud topic formats.
Codice di uscita e output
- Se tutti i vincoli sono convalidati, il comando restituisce il codice di uscita 0 e non mostra violazioni.
- Se vengono rilevate violazioni,
gcloud beta terraform vet
restituisce il codice di uscita 2 e mostra un elenco di violazioni. Ad esempio, l'output JSON potrebbe avere il seguente aspetto:
[ { "constraint": "GCPIAMAllowedPolicyMemberDomainsConstraintV2.service_accounts_only", "constraint_config": { "api_version": "constraints.gatekeeper.sh/v1alpha1", "kind": "GCPIAMAllowedPolicyMemberDomainsConstraintV2", "metadata": { "annotations": { "description": "Checks that members that have been granted IAM roles belong to allowlisted domains.", "validation.gcp.forsetisecurity.org/originalName": "service_accounts_only", "validation.gcp.forsetisecurity.org/yamlpath": "policies/constraints/iam_service_accounts_only.yaml" }, "name": "service-accounts-only" }, "spec": { "match": { "target": [ "organizations/**" ] }, "parameters": { "domains": [ "gserviceaccount.com" ] }, "severity": "high" } }, "message": "IAM policy for //cloudresourcemanager.googleapis.com/projects/PROJECT_ID contains member from unexpected domain: user:me@example.com", "metadata": { "ancestry_path": "organizations/ORG_ID/projects/PROJECT_ID", "constraint": { "annotations": { "description": "Checks that members that have been granted IAM roles belong to allowlisted domains.", "validation.gcp.forsetisecurity.org/originalName": "service_accounts_only", "validation.gcp.forsetisecurity.org/yamlpath": "policies/constraints/iam_service_accounts_only.yaml" }, "labels": {}, "parameters": { "domains": [ "gserviceaccount.com" ] } }, "details": { "member": "user:me@example.com", "resource": "//cloudresourcemanager.googleapis.com/projects/PROJECT_ID" } }, "resource": "//cloudresourcemanager.googleapis.com/projects/PROJECT_ID", "severity": "high" } ]
Esempio di CI/CD
Uno script bash per l'utilizzo di gcloud beta terraform vet
in una pipeline CI/CD potrebbe avere il seguente aspetto:
terraform plan -out=tfplan.tfplan terraform show -json ./tfplan.tfplan > ./tfplan.json git clone POLICY_LIBRARY_REPO POLICY_LIBRARY_DIR VIOLATIONS=$(gcloud beta terraform vet tfplan.json --policy-library=POLICY_LIBRARY_DIR --format=json) retVal=$? if [ $retVal -eq 2 ]; then # Optional: parse the VIOLATIONS variable as json and check the severity level echo "$VIOLATIONS" echo "Violations found; not proceeding with terraform apply" exit 1 fi if [ $retVal -ne 0]; then echo "Error during gcloud beta terraform vet; not proceeding with terraform apply" exit 1 fi echo "No policy violations detected; proceeding with terraform apply" terraform apply
Gli sviluppatori possono anche utilizzare gcloud beta terraform vet
a livello locale per testare le modifiche di Terraform
prima di eseguire la pipeline CI/CD.