gcloud beta terraform vet quickstart

Questa guida rapida illustra come applicare una limitazione che impone una limitazione del dominio. Testerai la limitazione e genererai intenzionalmente un errore. Poi, dovrai modificare la limitazione in modo che il dominio venga accettato.

Prima di iniziare

  • Devi disporre di un progetto Google Cloud.
  • Per il progetto sono necessarie le seguenti autorizzazioni IAM (Gestione di identità e accessi):

    • resourcemanager.projects.getIamPolicy: questa autorizzazione può essere concessa con il ruolo di revisore della sicurezza per l'organizzazione.
    • resourcemanager.projects.get: questa autorizzazione può essere concessa con il ruolo Visualizzatore progetto per l'organizzazione.

Per iniziare rapidamente, queste istruzioni utilizzano Cloud Shell con Terraform preinstallato e un repository della raccolta di norme clonato. Le istruzioni presuppongono che tu abbia già un account Google Cloud.

Guida rapida

  1. Vai a Cloud Shell e clona la raccolta di norme.

    Clona la libreria di criteri

  2. Copia il vincolo di limitazione del dominio IAM di esempio nella directory policies/constraints.

    cp samples/iam_service_accounts_only.yaml policies/constraints
    
  3. Esamina la limitazione che hai copiato stampandola nel terminale.

    cat policies/constraints/iam_service_accounts_only.yaml
    

    L'output è il seguente:

    # 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
    

    Nota gserviceaccount.com in basso. Questo specifica che solo i membri del dominio gserviceaccount.com possono essere presenti in un criterio IAM.

  4. Per verificare che il criterio funzioni come previsto, crea il seguente file Terraformmain.tf nella directory corrente. Puoi utilizzare nano, vim o l'editor Cloud Shell per creare policy-library/main.tf.

    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"
      ]
    }
    

    Sostituisci quanto segue:

    • PROJECT_ID: il tuo ID progetto.
    • EMAIL_ADDRESS: un indirizzo email di esempio. Può essere qualsiasi indirizzo email valido. Ad esempio, user@example.com.
  5. Inizializza Terraform e genera un piano Terraform utilizzando quanto segue:

    terraform init
    
  6. Esporta il piano Terraform e, se richiesto, fai clic su Autorizza:

    terraform plan -out=test.tfplan
    
  7. Converti il piano Terraform in JSON:

    terraform show -json ./test.tfplan > ./tfplan.json
    
  8. Installa il componente terraform-tools:

    sudo apt-get install google-cloud-sdk-terraform-tools
    
  9. Inserisci il seguente comando per verificare che il tuo piano Terraform sia conforme alle tue norme:

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

    Poiché l'indirizzo email che hai fornito nell'associazione dei criteri IAM non appartiene a un account di servizio, il piano viola il vincolo che hai configurato.

    [
    {
      "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. Per consentire un altro dominio (la tua email), modifica policy-library/policies/constraints/iam_service_accounts_only.yaml e aggiungi il dominio email alla lista consentita dei domini. Nell'esempio seguente abbiamo aggiunto example.com, ma tu dovrai inserire il dominio per il tuo indirizzo email:

    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. Ora convalida di nuovo il piano Terraform e non dovrebbero essere rilevate violazioni:

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

    Risultato previsto:

    []

Risoluzione dei problemi

Se ricevi il seguente errore, "Error 403: The caller does not have permission, forbidden", significa che non hai sostituito PROJECT_ID in policy-library/main.tf con il nome del progetto o che non disponi delle autorizzazioni necessarie per il progetto specificato.

Dopo aver modificato il nome e/o le autorizzazioni del progetto (resourcemanager.projects.getIamPolicy e resourcemanager.projects.get), torna indietro ed esporta di nuovo il piano Terraform, quindi convertilo in JSON.