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 imponga una restricción de dominio. Probarás esa restricción y provocarás un error intencionadamente. Después, modificará la restricción para que su dominio cumpla los requisitos.

Antes de empezar

  • Necesitas un Google Cloud proyecto.
  • Necesitas los siguientes permisos de gestión de identidades y accesos (IAM) para ese proyecto:

    • resourcemanager.projects.getIamPolicy: este permiso se puede conceder con el rol de revisor de seguridad de la organización.
    • resourcemanager.projects.get: este permiso se puede conceder con el rol Lector de proyectos de la organización.

Para que puedas empezar rápidamente, estas instrucciones usan un Cloud Shell que tiene Terraform preinstalado y un repositorio de Policy Library clonado. En estas instrucciones se presupone 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.

    Clonar biblioteca de políticas

  2. Copia la restricción de dominio de gestión de identidades y accesos de ejemplo en el directorio policies/constraints.

    cp samples/iam_service_accounts_only.yaml policies/constraints
    
  3. Examina la restricción que has copiado imprimiéndola en la terminal.

    cat policies/constraints/iam_service_accounts_only.yaml
    

    La salida tiene este aspecto:

    # 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
    

    Fíjate en gserviceaccount.com en la parte inferior. Esto especifica que solo los miembros del dominio gserviceaccount.com pueden estar presentes en una política de gestión de identidades y accesos.

  4. Para verificar que la política funciona como se espera, cree el siguiente archivo Terraform main.tf 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"
      ]
    }
    

    Haz los cambios siguientes:

    • PROJECT_ID: tu ID de proyecto.
    • EMAIL_ADDRESS: una dirección de correo de ejemplo. Puede ser cualquier dirección de correo 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 pide, haz clic en Autorizar:

    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. Introduce el siguiente comando para validar que tu plan de Terraform cumple tus políticas:

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

    Como la dirección de correo que has proporcionado en el enlace de la política de gestión de identidades y accesos no pertenece a una cuenta de servicio, el plan infringe la restricción que has configurado.

    [
    {
      "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 añade tu dominio de correo a la lista de permitidos de dominios. En el siguiente ejemplo, hemos añadido example.com, pero tú deberías introducir el dominio de tu dirección de correo:

    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, vuelve a validar tu plan de Terraform. No debería haber ninguna infracción:

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

    Resultado esperado:

    []

Solución de problemas

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

Después de editar el nombre del proyecto o los permisos (resourcemanager.projects.getIamPolicy y resourcemanager.projects.get), vuelve y exporta el plan de Terraform de nuevo. A continuación, convierte el plan de Terraform a JSON.