Validar políticas

Antes de empezar

Instalar Google Cloud CLI

Para usar gcloud beta terraform vet, primero debes instalar Google Cloud CLI:

  1. Instala Google Cloud CLI, pero omite el comando gcloud init.

  2. Ejecuta los siguientes comandos para instalar el componente terraform-tools:

    gcloud components update
    gcloud components install terraform-tools
    
  3. Comprueba que la CLI de gcloud esté instalada ejecutando el siguiente comando:

    gcloud beta terraform vet --help
    

Obtener los permisos necesarios

La Google Cloud cuenta que uses para la validación debe tener los siguientes permisos:

  • getIamPolicy: gcloud beta terraform vet debe obtener las políticas completas de gestión de identidades y accesos (IAM) y combinarlas con los miembros y las vinculaciones para obtener un estado final preciso que validar.
  • resourcemanager.projects.get: gcloud beta terraform vet debe obtener la ascendencia del proyecto de la API para construir con precisión un nombre de recurso de CAI completo para cualquier proyecto al que estén relacionados los recursos validados.
  • resourcemanager.folders.get: gcloud beta terraform vet necesita obtener la jerarquía de carpetas de la API para construir con precisión un nombre de recurso de CAI completo si los recursos validados contienen recursos relacionados con carpetas.

Configurar una biblioteca de políticas

Para usar esta herramienta, debes crear una biblioteca de políticas.

Validar políticas

1. Generar un plan de Terraform

gcloud beta terraform vet es compatible con Terraform 0.12 y versiones posteriores. gcloud beta terraform vet toma terraform plan JSON como entrada. Para generar el archivo JSON, ejecuta los siguientes comandos en tu directorio de Terraform:

terraform plan -out=tfplan.tfplan
terraform show -json ./tfplan.tfplan > ./tfplan.json

2. Ejecutar gcloud beta terraform vet

gcloud beta terraform vet te permite validar tu terraform plan JSON con el POLICY_LIBRARY_REPO de tu organización. Por ejemplo:

git clone POLICY_LIBRARY_REPO POLICY_LIBRARY_DIR
gcloud beta terraform vet tfplan.json --policy-library=POLICY_LIBRARY_DIR

Cuando ejecutas este comando, gcloud beta terraform vet obtiene los datos del proyecto mediante las APIs Google Cloud necesarias para validar tu plan con precisión.

Banderas

  • --policy-library=POLICY_LIBRARY_DIR: directorio que contiene una biblioteca de políticas.
  • --project=PROJECT_ID - gcloud beta terraform vet acepta la marca opcional --project. Esta marca especifica el proyecto predeterminado al crear la ascendencia (de la jerarquía de recursos Google Cloud ) de cualquier recurso que no tenga un proyecto definido explícitamente.
  • --format=FORMAT: el valor predeterminado es yaml. Los formatos admitidos son default, json, none, text y yaml. Para obtener más información, ejecuta $ gcloud topic formats.

Código de salida y salida

  • Si se validan todas las restricciones, el comando devuelve el código de salida 0 y no muestra ninguna infracción.
  • Si se detectan infracciones, gcloud beta terraform vet devuelve el código de salida 2 y muestra una lista de infracciones. Por ejemplo, la salida JSON podría ser la siguiente:
[
  {
    "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:me@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:me@example.com",
        "resource": "//cloudresourcemanager.googleapis.com/projects/PROJECT_ID"
      }
    },
    "resource": "//cloudresourcemanager.googleapis.com/projects/PROJECT_ID",
    "severity": "high"
  }
]

Ejemplo de CI/CD

Un script de Bash para usar gcloud beta terraform vet en un flujo de procesamiento de CI/CD podría tener este aspecto:

terraform plan -out=tfplan.tfplan
terraform show -json ./tfplan.tfplan > ./tfplan.json
git clone POLICY_LIBRARY_REPO POLICY_LIBRARY_DIR
VIOLATIONS=$(gcloud beta terraform vet tfplan.json --policy-library=POLICY_LIBRARY_DIR --format=json)
retVal=$?
if [ $retVal -eq 2 ]; then
  # Optional: parse the VIOLATIONS variable as json and check the severity level
  echo "$VIOLATIONS"
  echo "Violations found; not proceeding with terraform apply"
  exit 1
fi
if [ $retVal -ne 0]; then
  echo "Error during gcloud beta terraform vet; not proceeding with terraform apply"
  exit 1
fi

echo "No policy violations detected; proceeding with terraform apply"

terraform apply

Los desarrolladores también pueden usar gcloud beta terraform vet localmente para probar los cambios de Terraform antes de ejecutar la canalización de CI/CD.