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 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 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.