Convalidare i criteri

Prima di iniziare

Installa Google Cloud CLI

Per utilizzare gcloud beta terraform vet, devi prima installare Google Cloud CLI:

  1. Installa Google Cloud CLI, ma salta il comando gcloud init.

  2. Esegui i seguenti comandi per installare il componente terraform-tools:

    gcloud components update
    gcloud components install terraform-tools
    
  3. 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.