Richtlinien prüfen

Vorbereitung

Google Cloud CLI installieren

Sie müssen zuerst die Google Cloud-Befehlszeile installieren, um gcloud beta terraform vet verwenden zu können:

  1. Installieren Sie die Google Cloud-Befehlszeile, aber überspringen Sie den Befehl gcloud init.

  2. Führen Sie die folgenden Befehle aus, um die Komponente "terraform-tools" zu installieren:

    gcloud components update
    gcloud components install terraform-tools
    
  3. Prüfen Sie mit dem folgenden Befehl, ob die gcloud CLI installiert ist:

    gcloud beta terraform vet --help
    

Erforderliche Berechtigungen abrufen

Das Google Cloud-Konto, das Sie für die Validierung verwenden, muss die folgenden Berechtigungen haben:

  • getIamPolicy: gcloud beta terraform vet muss die vollständigen IAM-Richtlinien (Identity and Access Management) abrufen und sie mit Mitgliedern und Bindungen zusammenführen, um einen genauen Endzustand für die Validierung zu erhalten.
  • resourcemanager.projects.get: gcloud beta terraform vet muss die Projektherkunft von der API abrufen, um korrekt einen vollständigen CAI-Asset-Namen für alle Projekte zu erstellen, denen validierte Ressourcen zugeordnet sind.
  • resourcemanager.folders.get: gcloud beta terraform vet muss die Ordnerherkunft von der API abrufen, um korrekt einen vollständigen CAI-Asset-Namen zu erstellen, wenn die validierten Ressourcen ordnerbezogene Ressourcen enthalten.

Richtlinienbibliothek einrichten

Sie müssen eine Richtlinienbibliothek erstellen, um dieses Tool verwenden zu können.

Richtlinien prüfen

1. Terraform-Plan generieren

gcloud beta terraform vet ist mit Terraform 0.12+ kompatibel. gcloud beta terraform vet verwendet terraform plan-JSON als Eingabe. Sie können die JSON-Datei generieren, wenn Sie die folgenden Befehle in Ihrem Terraform-Verzeichnis ausführen:

terraform plan -out=tfplan.tfplan
terraform show -json ./tfplan.tfplan > ./tfplan.json

2. Führen Sie gcloud beta terraform vet aus

Mit gcloud beta terraform vet können Sie Ihre terraform plan-JSON-Datei mit dem POLICY_LIBRARY_REPO Ihrer Organisation validieren. Beispiel:

git clone POLICY_LIBRARY_REPO POLICY_LIBRARY_DIR
gcloud beta terraform vet tfplan.json --policy-library=POLICY_LIBRARY_DIR

Wenn Sie diesen Befehl ausführen, ruft gcloud beta terraform vet Projektdaten mithilfe von Google Cloud APIs ab, die für eine genaue Validierung Ihres Plans erforderlich sind.

Flags

  • --policy-library=POLICY_LIBRARY_DIR: Verzeichnis, das eine Richtlinienbibliothek enthält.
  • --project=PROJECT_ID: gcloud beta terraform vet akzeptiert ein optionales --project-Flag. Dieses Flag gibt das Standardprojekt an, wenn die Herkunft aus der Google Cloud-Ressourcenhierarchie für Ressourcen erstellt wird, für die kein explizites Projekt festgelegt wurde.
  • --format=FORMAT: Der Standardwert ist YAML. Folgende Formate sind zulässig: default, json, none, text, yaml. Weitere Einzelheiten erhalten Sie durch Ausführen von $ gcloud topic formats.

Code und Ausgabe beenden

  • Wenn alle Einschränkungen validiert sind, gibt der Befehl den Exit-Code 0 zurück und zeigt keine Verstöße an.
  • Wenn Verstöße gefunden werden, gibt gcloud beta terraform vet den Exit-Code 2 zurück und zeigt eine Liste der Verstöße an. Die JSON-Ausgabe könnte beispielsweise so aussehen:
[
  {
    "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"
  }
]

CI/CD-Beispiel

Ein Bash-Skript zur Verwendung von gcloud beta terraform vet in einer CI/CD-Pipeline kann so aussehen:

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

Entwickler können gcloud beta terraform vet auch lokal verwenden, um Terraform-Änderungen zu testen, bevor Sie Ihre CI/CD-Pipeline ausführen.