Auditoría de Infraestructura Terraform para Seguridad
Cuándo Usarlo
- Al integrar escaneos de seguridad en pipelines CI/CD para despliegues de Terraform
- Al revisar planos y módulos de Terraform en busca de mejores prácticas de seguridad antes de aplicarlos
- Al construir barreras de seguridad con políticas como código para el aprovisionamiento de infraestructura en la nube
- Al auditar archivos de estado de Terraform existentes para identificar malas configuraciones desplegadas
- Al aplicar estándares de seguridad organizacionales en múltiples proyectos de Terraform
No usar para monitoreo de seguridad en tiempo de ejecución (usar herramientas CSPM), para pruebas de seguridad de aplicaciones (usar SAST/DAST) o para detección de desviaciones de configuración en la nube (usar AWS Config o Azure Policy después del despliegue).
Prerrequisitos
- Checkov instalado (
pip install checkov) - tfsec instalado (
brew install tfseco binario desde GitHub) - Terrascan instalado (
brew install terrascan) - Terraform v1.0+ para generación de planos
- OPA (Open Policy Agent) para aplicar políticas personalizadas
- Repositorio Git con código Terraform para auditar
Flujo de Trabajo
Paso 1: Escanear Código Terraform con Checkov
Ejecuta Checkov para un escaneo completo de seguridad de IaC con políticas integradas y personalizadas.
# Escanear un directorio de Terraform
checkov -d ./terraform/ --framework terraform
# Escanear con categorías de verificación específicas
checkov -d ./terraform/ --check CKV_AWS_18,CKV_AWS_19,CKV_AWS_20,CKV_AWS_21
# Escanear y generar resultados en JSON
checkov -d ./terraform/ --output json > checkov-results.json
# Escanear un archivo de plano de Terraform para un análisis más preciso
terraform init && terraform plan -out=tfplan
terraform show -json tfplan > tfplan.json
checkov -f tfplan.json --framework terraform_plan
# Omitir verificaciones específicas con justificación
checkov -d ./terraform/ --skip-check CKV_AWS_145 \
--bc-api-key $BRIDGECREW_API_KEY
# Escanear módulos de Terraform
checkov -d ./modules/ --framework terraform --compact
# Listar todas las verificaciones disponibles
checkov --list --framework terraform | grep CKV_AWS
Paso 2: Escanear con tfsec para Problemas Específicos de Terraform
Usa tfsec para un análisis de seguridad nativo de Terraform con guías de remediación detalladas.
# Escanear un directorio de Terraform
tfsec ./terraform/
# Escanear con un umbral de severidad mínimo
tfsec ./terraform/ --minimum-severity HIGH
# Generar salida en JSON para procesamiento en CI/CD
tfsec ./terraform/ --format json > tfsec-results.json
# Escanear con verificaciones personalizadas
tfsec ./terraform/ --custom-check-dir ./custom-checks/
# Excluir reglas específicas
tfsec ./terraform/ --exclude-downloaded-modules \
--exclude aws-s3-enable-bucket-logging
# Escanear y fallar con una severidad específica
tfsec ./terraform/ --minimum-severity CRITICAL --soft-fail
# Generar salida SARIF para la pestaña de Seguridad de GitHub
tfsec ./terraform/ --format sarif > tfsec.sarif
Paso 3: Ejecutar Terrascan para Cumplimiento Multi-Framework
Ejecuta Terrascan para verificar el cumplimiento con los marcos CIS, NIST y SOC 2.
# Escanear Terraform contra el benchmark CIS de AWS
terrascan scan -t aws -i terraform -d ./terraform/ \
--policy-type aws --verbose
# Escanear contra marcos de cumplimiento específicos
terrascan scan -t aws -i terraform -d ./terraform/ \
--policy-type aws \
--categories "Compliance Validation"
# Generar salida en JSON
terrascan scan -t aws -i terraform -d ./terraform/ \
--output json > terrascan-results.json
# Escanear un plano de Terraform
terrascan scan -t aws -i terraform \
--iac-file tfplan.json \
--iac-type tfplan
# Listar políticas disponibles
terrascan scan --list-policies -t aws
Paso 4: Crear Políticas OPA Personalizadas para Estándares Organizacionales
Escribe políticas Rego para requisitos de seguridad específicos de la organización.
# policy/aws_s3_encryption.rego
package terraform.aws.s3
denied[msg] {
resource := input.resource.aws_s3_bucket[name]
not resource.server_side_encryption_configuration
msg := sprintf("El bucket S3 '%s' debe tener cifrado del lado del servidor habilitado", [name])
}
# policy/aws_iam_no_wildcards.rego
package terraform.aws.iam
denied[msg] {
resource := input.resource.aws_iam_policy[name]
statement := resource.policy.Statement[_]
statement.Action == "*"
statement.Effect == "Allow"
msg := sprintf("La política IAM '%s' no debe usar comodines (*) en acciones", [name])
}
denied[msg] {
resource := input.resource.aws_iam_policy[name]
statement := resource.policy.Statement[_]
statement.Resource == "*"
statement.Effect == "Allow"
contains(statement.Action[_], "*")
msg := sprintf("La política IAM '%s' tiene acciones demasiado permisivas sobre recursos comodín", [name])
}
# policy/aws_no_public_ingress.rego
package terraform.aws.security_group
denied[msg] {
resource := input.resource.aws_security_group_rule[name]
resource.type == "ingress"
resource.cidr_blocks[_] == "0.0.0.0/0"
resource.from_port <= 22
resource.to_port >= 22
msg := sprintf("La regla del grupo de seguridad '%s' permite SSH desde 0.0.0.0/0", [name])
}
# Evaluar el plano de Terraform contra las políticas OPA
terraform show -json tfplan | opa eval \
--data ./policy/ \
--input /dev/stdin \
"data.terraform.aws" \
--format pretty
# Ejecutar Conftest para pruebas de políticas OPA más sencillas
conftest test tfplan.json --policy ./policy/ --output json
Paso 5: Integrar el Escaneo de Seguridad en el Pipeline CI/CD
Agrega el escaneo de seguridad de IaC como una compuerta obligatoria en CI/CD.
# GitHub Actions: Pipeline de seguridad de Terraform
name: Escaneo de Seguridad de Terraform
on:
pull_request:
paths: ['terraform/**']
jobs:
security-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Configurar Terraform
uses: hashicorp/setup-terraform@v3
- name: Terraform Init & Plan
run: |
cd terraform/
terraform init
terraform plan -out=tfplan
terraform show -json tfplan > tfplan.json
- name: Escaneo Checkov
uses: bridgecrewio/checkov-action@master
with:
directory: terraform/
framework: terraform
output_format: sarif
output_file_path: checkov.sarif
soft_fail: false
- name: Escaneo tfsec
uses: aquasecurity/[email protected]
with:
working_directory: terraform/
soft_fail: false
- name: Subir SARIF
uses: github/codeql-action/upload-sarif@v2
with:
sarif_file: checkov.sarif
- name: Verificación de Políticas OPA
run: |
conftest test terraform/tfplan.json \
--policy ./policy/ \
--output json
Paso 6: Escanear el Estado de Terraform para Malas Configuraciones Desplegadas
Audita el estado actual de Terraform para identificar problemas de seguridad ya desplegados.
# Exportar el estado actual como JSON
terraform show -json > terraform-state.json
# Escanear el estado con Checkov
checkov -f terraform-state.json --framework terraform_plan
# Consultar el estado para problemas de seguridad específicos
terraform state list | while read recurso; do
terraform state show "$recurso" 2>/dev/null | grep -i "public\|0.0.0.0\|encrypt.*false\|password"
done
# Encontrar recursos sin las etiquetas requeridas
terraform state list | grep aws_instance | while read recurso; do
tags=$(terraform state show "$recurso" | grep -A20 "tags")
if ! echo "$tags" | grep -q "Environment"; then
echo "ETIQUETA FALTANTE: a $recurso le falta la etiqueta 'Environment'"
fi
done
Conceptos Clave
| Término | Definición |
|---|---|
| Infraestructura como Código | Práctica de gestionar infraestructura en la nube mediante archivos de configuración declarativos (Terraform, CloudFormation) en lugar de operaciones manuales en la consola |
| Política como Código | Expresar políticas de seguridad y cumplimiento como código ejecutable (Rego, Python) que se puede evaluar automáticamente contra definiciones de infraestructura |
| Desplazar la Seguridad a la Izquierda | Mover las comprobaciones de seguridad a etapas tempranas del ciclo de desarrollo escaneando IaC antes del despliegue en lugar de auditar después del aprovisionamiento |
| Plano de Terraform | Vista previa de los cambios que Terraform realizará, que se puede exportar como JSON para escaneos de seguridad antes de aplicar los cambios |
| Checkov | Herramienta de análisis estático de código abierto para IaC compatible con Terraform, CloudFormation, Kubernetes y Docker, con más de 1000 políticas integradas |
| OPA/Rego | Open Policy Agent y su lenguaje de políticas Rego para definir reglas de seguridad personalizadas que evalúan datos estructurados de entrada |
Herramientas y Sistemas
- Checkov: Escáner integral de IaC con más de 1000 políticas para Terraform, CloudFormation, Kubernetes, ARM y Dockerfile
- tfsec: Herramienta de análisis estático específica de Terraform con guías de remediación detalladas y salida SARIF
- Terrascan: Escáner multi-IaC compatible con marcos de cumplimiento (CIS, NIST, SOC 2) con política como código
- OPA/Conftest: Motor de políticas personalizadas para definir reglas de seguridad específicas de la organización usando el lenguaje Rego
- Bridgecrew: Plataforma comercial basada en Checkov que proporciona detección de desviaciones y seguridad en la cadena de suministro
Escenarios Comunes
Escenario: Agregar Compuertas de Seguridad a un Pipeline CI/CD de Terraform Existente
Contexto: Un equipo de DevOps despliega infraestructura mediante Terraform en GitHub Actions pero no tiene escaneo de seguridad. Hallazgos de auditoría recientes muestran múltiples buckets S3 sin cifrado y grupos de seguridad que permiten SSH desde internet.
Enfoque:
- Agregar Checkov como la primera compuerta de seguridad en el flujo de trabajo de GitHub Actions
- Ejecutar
checkov -d ./terraform/para establecer la línea base actual de hallazgos - Clasificar los hallazgos existentes: corregir los CRÍTICOS, crear tickets para los ALTOS, suprimir los riesgos aceptados
- Agregar tfsec como escáner secundario para comprobaciones específicas de Terraform
- Escribir políticas OPA personalizadas para estándares organizacionales (etiquetas requeridas, convenciones de nombres)
- Configurar el pipeline para bloquear PRs con hallazgos CRÍTICOS o ALTOS
- Generar informes SARIF para la integración con la pestaña de Seguridad de GitHub
Errores Comunes: Agregar escaneo de seguridad a un proyecto existente inicialmente producirá cientos de hallazgos. Implementar gradualmente comenzando con bloqueos solo CRÍTICOS y luego expandir a ALTOS. Usar comentarios de supresión en línea (#checkov:skip=CKV_AWS_18:Bucket público para sitio web estático) para excepciones intencionales con justificación documentada.
Formato de Salida
Informe de Auditoría de Seguridad de Terraform
==================================================
Repositorio: acme-corp/infrastructure
Rama: main
Fecha de Escaneo: 2026-02-23
Herramientas: Checkov 3.x, tfsec 1.x, Políticas OPA personalizadas
RESULTADOS DEL ESCANEO:
Verificaciones Checkov pasadas: 187
Verificaciones Checkov fallidas: 34
Verificaciones tfsec pasadas: 156
Verificaciones tfsec fallidas: 28
Políticas OPA personalizadas: 12 pasadas, 3 fallidas
HALLAZGOS CRÍTICOS:
[TF-001] Bucket S3 Sin Cifrado
Archivo: modules/storage/main.tf:24
Recurso: aws_s3_bucket.data_lake
Verificación: CKV_AWS_19
Solución: Agregar bloque server_side_encryption_configuration
[TF-002] Grupo de Seguridad Permite SSH desde 0.0.0.0/0
Archivo: modules/network/security.tf:45
Recurso: aws_security_group_rule.ssh_access
Verificación: CKV_AWS_24
Solución: Restringir cidr_blocks a la subred bastión
[TF-003] Política IAM con Acciones Comodín
Archivo: modules/iam/policies.tf:12
Recurso: aws_iam_policy.developer_policy
Verificación: CKV_AWS_1
Solución: Limitar las acciones a los servicios específicos requeridos
RESUMEN POR SEVERIDAD:
Crítico: 6 hallazgos
Alto: 14 hallazgos
Medio: 28 hallazgos
Bajo: 18 hallazgos
Info: 12 hallazgos