Convalidare i criteri

Prima di iniziare

Installazione di Google Cloud CLI

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

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

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

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