Valida políticas

Antes de comenzar

Instale Google Cloud CLI

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

  1. Instala la CLI de Google Cloud, 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. Ejecuta el siguiente comando para verificar que la CLI de gcloud esté instalada:

    gcloud beta terraform vet --help
    

Obtén los permisos necesarios

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

  • getIamPolicy: gcloud beta terraform vet necesita obtener políticas completas de Identity and Access Management y combinarlas con miembros y vinculaciones para obtener un estado final preciso para validar.
  • resourcemanager.projects.get: gcloud beta terraform vet necesita obtener la ascendencia del proyecto desde la API a fin de crear de forma precisa un nombre de recurso de CAI completo para cualquier proyecto relacionado con los recursos validados.
  • resourcemanager.folders.get: gcloud beta terraform vet necesita obtener el principal de la carpeta de la API para poder construir con precisión un nombre de recurso de CAI completo si los recursos validados contienen recursos relacionados con la carpeta.

Configura una biblioteca de políticas

Debes crear una biblioteca de políticas para usar esta herramienta.

Valida políticas

1. Genera un plan de Terraform

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

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

2. Ejecuta 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 recupera los datos del proyecto mediante las API de Google Cloud que son necesarias para una validación precisa de tu plan.

Marcas

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

Código de salida y resultado

  • Si se validan todas las restricciones, el comando muestra el código de salida 0 y no muestra los incumplimientos.
  • Si se encuentran infracciones, gcloud beta terraform vet muestra el código de salida 2 y una lista de infracciones. Por ejemplo, el resultado de JSON podría verse así:
[
  {
    "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

Una secuencia de comandos de Bash para usar gcloud beta terraform vet en una canalización de CI/CD podría verse así:

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 de forma local para probar los cambios de Terraform antes de ejecutar tu canalización de CI/CD.