Guía de inicio rápido de gcloud beta terraform vet

En esta guía de inicio rápido, se muestra cómo aplicar una restricción que aplique una restricción de dominio. Probarás esa restricción y arrojarás un error de forma intencional. Luego, modificarás la restricción para que tu dominio pase.

Antes de comenzar

Para comenzar con rapidez, en estas instrucciones se usa un Cloud Shell preinstalado con Terraform y un repositorio de bibliotecas de políticas clonadas. En las instrucciones suponemos que ya tienes una cuenta de Google Cloud.

Guía de inicio rápido

  1. Ve a Cloud Shell y clona la biblioteca de políticas.

    Clona la biblioteca de políticas

  2. Copia la restricción de dominio de IAM de muestra en el directorio policies/constraints.

    cp samples/iam_service_accounts_only.yaml policies/constraints
    
  3. Para examinar la restricción que copiaste, puedes imprimirla en la terminal.

    cat policies/constraints/iam_service_accounts_only.yaml
    

    El resultado se verá así:

    # 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
    

    Observa gserviceaccount.com en la parte inferior. Esto especifica que solo los miembros del dominio gserviceaccount.com pueden estar presentes en una política de IAM.

  4. Para verificar que la política funcione como se espera, crea el siguiente archivo main.tf de Terraform en el directorio actual. Puedes usar nano, vim o el editor de Cloud Shell para crear 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"
      ]
    }
    

    Reemplaza lo siguiente:

    • PROJECT_ID: el ID de tu proyecto
    • EMAIL_ADDRESS: una dirección de correo electrónico de muestra Puede ser cualquier dirección de correo electrónico válida. Por ejemplo, user@example.com
  5. Inicializa Terraform y genera un plan de Terraform con lo siguiente:

    terraform init
    
  6. Exporta el plan de Terraform, si se te solicita, haz clic en Autorizar cuando se te solicite:

    terraform plan -out=test.tfplan
    
  7. Convierte el plan de Terraform a JSON:

    terraform show -json ./test.tfplan > ./tfplan.json
    
  8. Instala el componente terraform-tools:

    sudo apt-get install google-cloud-sdk-terraform-tools
    
  9. Ingrese el siguiente comando para validar que su plan de Terraform cumpla con sus políticas:

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

    Debido a que la dirección de correo electrónico que proporcionaste en la vinculación de la política de IAM no pertenece a una cuenta de servicio, el plan infringe la restricción que configuraste.

    [
    {
      "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. Para permitir otro dominio (tu correo electrónico), edita policy-library/policies/constraints/iam_service_accounts_only.yaml y agrega tu dominio de correo electrónico a la lista de dominios permitidos. En el siguiente ejemplo, agregamos example.com, pero deberías ingresar el dominio para tu propia dirección de correo electrónico:

    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. Ahora, vuelva a validar su plan de Terraform. Esto no debería generar incumplimientos:

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

    Resultado esperado:

    []
    

Soluciona problemas

Si recibes el siguiente error, "Error 403: The caller does not have permission, forbidden", entonces no reemplazaste PROJECT_ID en policy-library/main.tf con el nombre de tu proyecto o no tienes los permisos necesarios en el proyecto que especificaste.

Después de editar el nombre o los permisos del proyecto (resourcemanager.projects.getIamPolicy y resourcemanager.projects.get), regresa y exporta el plan de Terraform otra vez y, luego, convierte el plan de Terraform a JSON.