Kurzanleitung für gcloud beta terraform vet

In dieser Kurzanleitung wird gezeigt, wie Sie eine Einschränkung anwenden, die eine Domainbeschränkung erzwingt. Sie testen diese Einschränkung und geben dabei absichtlich einen Fehler aus. Anschließend ändern Sie die Einschränkung, damit Ihre Domain übergeben wird.

Hinweis

  • Sie benötigen ein Google Cloud-Projekt.
  • Sie benötigen die folgenden IAM-Berechtigungen (Identity and Access Management) für dieses Projekt:

    • resourcemanager.projects.getIamPolicy – Diese Berechtigung kann mit der Rolle "Sicherheitsprüfer" für die Organisation gewährt werden.
    • resourcemanager.projects.get – Diese Berechtigung kann mit der Rolle "Projektbetrachter" für die Organisation gewährt werden.

Für die ersten Schritte wird in dieser Anleitung Cloud Shell verwendet, das in Terraform vorinstalliert ist, sowie ein geklontes Repository für die Richtlinienbibliothek. In der Anleitung wird davon ausgegangen, dass Sie bereits ein Google Cloud-Konto haben.

Kurzanleitung

  1. Rufen Sie Cloud Shell auf und klonen Sie die Richtlinienbibliothek.

    Richtlinienbibliothek klonen

  2. Kopieren Sie die Beispieleinschränkung für IAM-Domains in das Verzeichnis policies/constraints.

    cp samples/iam_service_accounts_only.yaml policies/constraints
    
  3. Prüfen Sie die kopierte Einschränkung und geben Sie sie dazu im Terminal aus.

    cat policies/constraints/iam_service_accounts_only.yaml
    

    Sie erhalten folgende Ausgabe:

    # This constraint checks that all IAM policy members are in the
    # "gserviceaccount.com" domain.
    apiVersion: constraints.gatekeeper.sh/v1alpha1
    kind: GCPIAMAllowedPolicyMemberDomainsConstraintV2
    metadata:
      name: service_accounts_only
      annotations:
        description: Checks that members that have been granted IAM roles belong to allowlisted
          domains.
    spec:
      severity: high
      match:
        target: # {"$ref":"#/definitions/io.k8s.cli.setters.target"}
        - "organizations/**"
      parameters:
        domains:
        - gserviceaccount.com
    

    Beachten Sie unten gserviceaccount.com. Damit wird angegeben, dass nur Mitglieder aus der Domain gserviceaccount.com in einer IAM-Richtlinie vorhanden sein können.

  4. Zum Prüfen, ob die Richtlinie wie erwartet funktioniert, erstellen Sie die folgende Terraform-Datei main.tf im aktuellen Verzeichnis. Zum Erstellen von policy-library/main.tf können Sie nano, vim oder den Cloud Shell-Editor verwenden.

    terraform {
      required_providers {
        google = {
          source = "hashicorp/google"
          version = "~> 3.84"
        }
      }
    }
    
    resource "google_project_iam_binding" "sample_iam_binding" {
      project = "PROJECT_ID"
      role    = "roles/viewer"
    
      members = [
        "user:EMAIL_ADDRESS"
      ]
    }
    

    Dabei gilt:

    • PROJECT_ID: Ihre Projekt-ID.
    • EMAIL_ADDRESS: Eine Beispiel-E-Mail-Adresse. Dies kann eine beliebige gültige E-Mail-Adresse sein. Beispiel: user@example.com.
  5. Initialisieren Sie Terraform und generieren Sie einen Terraform-Plan mit folgendem Befehl:

    terraform init
    
  6. Exportieren Sie den Terraform-Plan, wenn Sie dazu aufgefordert werden, und klicken Sie auf Autorisieren, wenn Sie dazu aufgefordert werden:

    terraform plan -out=test.tfplan
    
  7. Konvertieren Sie den Terraform-Plan in das JSON-Format:

    terraform show -json ./test.tfplan > ./tfplan.json
    
  8. Installieren Sie die Terraform-Tools-Komponente:

    sudo apt-get install google-cloud-sdk-terraform-tools
    
  9. Geben Sie den folgenden Befehl ein, um zu prüfen, ob Ihr Terraform-Plan Ihren Richtlinien entspricht:

    gcloud beta terraform vet tfplan.json --policy-library=. --format=json
    

    Da die in der IAM-Richtlinienbindung angegebene E-Mail-Adresse zu keinem Dienstkonto gehört, verstößt der Plan gegen die von Ihnen eingerichtete Einschränkung.

    [
    {
      "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:user@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:user@example.com",
          "resource": "//cloudresourcemanager.googleapis.com/projects/PROJECT_ID"
        }
      },
      "resource": "//cloudresourcemanager.googleapis.com/projects/PROJECT_ID",
      "severity": "high"
    }
    ]
    
  10. Wenn Sie eine andere Domain (Ihre E-Mail-Adresse) zulassen möchten, bearbeiten Sie policy-library/policies/constraints/iam_service_accounts_only.yaml und hängen Sie Ihre E-Mail-Domain an die Zulassungsliste der Domains an. Im folgenden Beispiel wurde example.com hinzugefügt. Sie müssen aber die Domain für Ihre E-Mail-Adresse eingeben.

    apiVersion: constraints.gatekeeper.sh/v1alpha1
    kind: GCPIAMAllowedPolicyMemberDomainsConstraintV1
    metadata:
      name: service_accounts_only
    spec:
      severity: high
      match:
        target: ["organizations/**"]
      parameters:
        domains:
          - gserviceaccount.com
          - example.com
    
  11. Prüfen Sie Ihren Terraform-Plan jetzt noch einmal. Er sollte zu keinem Verstoß führen.

    gcloud beta terraform vet tfplan.json --policy-library=. --format=json
    

    Erwartete Ausgabe:

    []
    

Fehlerbehebung

Wenn Sie die Fehlermeldung "Error 403: The caller does not have permission, forbidden" erhalten, haben Sie entweder PROJECT_ID in policy-library/main.tf nicht durch den Namen Ihres Projekts ersetzt oder Sie haben nicht die erforderlichen Berechtigungen für das angegebene Projekt.

Nachdem Sie den Projektnamen und/oder die Berechtigungen bearbeitet haben (resourcemanager.projects.getIamPolicy und resourcemanager.projects.get), gehen Sie zurück, exportieren Sie den Terraform-Plan noch einmal und konvertieren Sie dann den Terraform-Plan in das JSON-Format.