Guida rapida gcloud beta terraform vet

Questa guida rapida mostra come applicare un vincolo che applica una restrizione di dominio. Testerai il vincolo e genererà intenzionalmente un errore. Poi, modificherai il vincolo in modo che il dominio venga superato.

Prima di iniziare

  • Devi avere un progetto Google Cloud.
  • Devi disporre delle seguenti autorizzazioni IAM (Identity and Access Management) per il progetto:

    • 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 Cloud Shell preinstallato con Terraform e 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 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 sarà simile al 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 main.tf Terraform nella directory attuale. 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: l'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 richiesto:

    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 comando seguente per verificare che il piano Terraform sia conforme ai criteri:

    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. Nel seguente esempio, abbiamo aggiunto example.com, ma 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 tuo piano Terraform. Ciò dovrebbe comportare l'assenza di violazioni:

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

    Output previsto:

    []
    

Risoluzione dei problemi

Se viene visualizzato il seguente errore, "Error 403: The caller does not have permission, forbidden", 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 del progetto e/o le autorizzazioni (resourcemanager.projects.getIamPolicy e resourcemanager.projects.get), torna indietro ed esporta di nuovo il piano Terraform, quindi converti il piano Terraform in JSON.