Prima di iniziare
Installazione di 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 questo comando:
gcloud beta terraform vet --help
Ottieni le autorizzazioni richieste
L'account Google Cloud che utilizzi per la convalida deve avere le seguenti autorizzazioni:
getIamPolicy
:gcloud beta terraform vet
deve disporre di criteri completi di Identity and Access Management (IAM) e unirli a membri e associazioni per ottenere uno stato finale preciso da convalidare.resourcemanager.projects.get
:gcloud beta terraform vet
deve ottenere la discendenza del progetto dall'API per costruire con precisione un nome asset CAI completo per tutti i progetti a cui sono correlate le risorse convalidate.resourcemanager.folders.get
:gcloud beta terraform vet
deve ottenere la discendenza della cartella dall'API per creare con precisione un nome asset CAI completo se le risorse convalidate contengono risorse relative alle cartelle.
Configura una libreria di criteri
Devi creare una libreria di criteri per utilizzare questo strumento.
Convalidare i criteri
1. Genera un piano Terraform
gcloud beta terraform vet
è compatibile con Terraform 0.12 e versioni successive. gcloud beta terraform vet
prende terraform plan
JSON come input. Puoi generare il file JSON eseguendo questi 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 di terraform plan
rispetto a 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.
Flag
--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 in fase di creazione della discendenza (dalla gerarchia delle risorse Google Cloud) per qualsiasi risorsa per cui non è stato impostato un progetto esplicito.--format=FORMAT
: il valore predefinito è yaml. I formati supportati sono:default
,json
,none
,text
eyaml
. Per maggiori dettagli, esegui i formati $ gcloud topic.
Esci dal codice e dall'output
- Se tutti i vincoli vengono convalidati, il comando restituisce il codice di uscita 0 e non visualizza le 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 Terraform prima di eseguire la pipeline CI/CD.