Prima di iniziare
Installa Google Cloud CLI
Per utilizzare gcloud beta terraform vet
, devi prima installare Google Cloud CLI:
Installa Google Cloud CLI, ma ignora il comando
gcloud init
.Esegui questi 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
Ottieni le autorizzazioni necessarie
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 le origini del progetto dall'API per creare con precisione un nome completo dell'asset CAI per tutti i progetti a cui sono correlate le risorse convalidate.resourcemanager.folders.get
:gcloud beta terraform vet
deve recuperare la discendenza della cartella dall'API al fine di costruire con precisione un nome completo dell'asset CAI se e le risorse contengono eventuali 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 JSON terraform plan
in base al 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 facoltativo--project
. 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 impostato in modo esplicito.--format=FORMAT
: il valore predefinito è yaml. I formati supportati sono:default
,json
,none
,text
,yaml
. Per maggiori dettagli, esegui $ gcloud topic formats.
Esci dal codice e dall'output
- Se tutti i vincoli vengono 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 usare gcloud beta terraform vet
in locale per testare le modifiche di Terraform
prima di eseguire la pipeline CI/CD.