gcloud beta terraform vet quickstart

Questa guida rapida mostra come applicare un vincolo che impone una limitazione del dominio. Testerai questo vincolo e genererai intenzionalmente un errore. Poi modificherai il vincolo in modo che il tuo dominio venga approvato.

Prima di iniziare

  • Devi avere un Google Cloud progetto.
  • Per questo progetto, devi disporre delle seguenti autorizzazioni Identity and Access Management (IAM):

    • resourcemanager.projects.getIamPolicy: questa autorizzazione può essere concessa con il ruolo 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 una Cloud Shell con Terraform preinstallato e un repository Policy Library clonato. Le istruzioni presuppongono che tu disponga già di un account Google Cloud .

Guida rapida

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

    Clona la libreria di policy

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

    cat policies/constraints/iam_service_accounts_only.yaml
    

    L'output ha il seguente aspetto:

    # 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. 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 Terraform main.tf nella directory corrente. Puoi utilizzare nano, vim o l'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. Se richiesto, fai clic su Autorizza quando ti viene chiesto:

    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 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 delle policy 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 dovrai inserire il dominio del 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
    

    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 tuo progetto oppure non disponi delle autorizzazioni necessarie per il progetto specificato.

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