gcloud beta terraform vet quickstart

Questa guida rapida mostra come applicare un vincolo che applica una restrizione di dominio. Testerai la limitazione e genererai intenzionalmente un errore. Poi, dovrai modificare la limitazione in modo che il tuo dominio venga accettato.

Prima di iniziare

  • Devi avere 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 preinstallato con Terraform e con un repository della libreria di criteri clonato. Le istruzioni presuppongono che tu abbia già un account Google Cloud.

Guida rapida

  1. Vai a Cloud Shell e clona la libreria di criteri.

    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 il vincolo che hai copiato stampandolo sul 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. Ciò 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 usare nano, vim o Editor di 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 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 tuo dominio email alla lista consentita dei domini. Nell'esempio seguente abbiamo aggiunto example.com, ma tu devi 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. In questo modo non dovrebbero essere rilevate violazioni:

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

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