Antes de empezar
Instalar Google Cloud CLI
Para usar gcloud beta terraform vet
, primero debes instalar Google Cloud CLI:
Instala Google Cloud CLI, pero omite el comando
gcloud init
.Ejecuta los siguientes comandos para instalar el componente terraform-tools:
gcloud components update gcloud components install terraform-tools
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 sondefault
,json
,none
,text
yyaml
. 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.