Ya tienes fmt y validate cazando errores básicos. Pero esos comandos comprueban que el código sea correcto, no que sea seguro. Un código perfectamente válido puede crear una infraestructura peligrosa: un bucket S3 abierto al mundo, una base de datos sin cifrar, un Security Group con SSH expuesto. Para detectar esto existe el análisis de seguridad estático, con herramientas como Checkov y tfsec.

El problema: código válido pero inseguro

validate (subcapítulo 21.1) te diría que este código está «bien»:

resource "aws_s3_bucket" "datos" {
  bucket = "datos-confidenciales"
}

resource "aws_s3_bucket_public_access_block" "datos" {
  bucket                  = aws_s3_bucket.datos.id
  block_public_acls       = false   # ⚠️ ¡permite acceso público!
  block_public_policy     = false   # ⚠️ ¡peligroso!
}

Sintácticamente es correcto. Pero estás creando un bucket con datos confidenciales abierto a internet (recuerda el peligro del subcapítulo 5.4). validate no detecta esto, porque no es un error de código: es un error de seguridad. Necesitas algo que conozca las buenas prácticas y te avise.

Qué es el análisis estático de seguridad

El análisis estático examina tu código sin ejecutarlo (sin crear nada en AWS) y lo compara con una base de reglas de seguridad y buenas prácticas. Si encuentra una configuración peligrosa, te avisa señalando exactamente qué está mal y por qué.

Tu código Terraform
       │
       ▼
  Analizador (Checkov / tfsec)  ──compara con cientos de reglas de seguridad──►
       │
       ├─ ✓ todo seguro
       └─ ✗ "El bucket S3 permite acceso público (línea 5)"
          "La base de datos no tiene cifrado activado (línea 20)"

Analogía: es como un inspector de seguridad que revisa los planos de un edificio antes de construirlo. No espera a que el edificio esté hecho para descubrir que falta una salida de incendios: lo detecta en el plano y te obliga a corregirlo antes. El análisis estático revisa los «planos» (tu código) y caza los problemas de seguridad antes de desplegar.

Las herramientas: Checkov y tfsec

Hay varias herramientas para esto; las dos más conocidas en el mundo Terraform son:

Checkov

Checkov (de la empresa Prisma/Bridgecrew) es una herramienta muy popular y completa. Trae cientos de reglas predefinidas que comprueban buenas prácticas de seguridad y cumplimiento en AWS (y otras nubes). Detecta cosas como buckets públicos, recursos sin cifrar, puertos abiertos peligrosos, falta de logs, etc.

tfsec

tfsec es otra herramienta muy usada, centrada específicamente en Terraform y enfocada en seguridad. Es rápida y fácil de integrar. (Conviene saber que tfsec se ha ido integrando con Trivy, otra herramienta del mismo ámbito; el ecosistema evoluciona, pero la idea es la misma.)

Ambas hacen un trabajo parecido: analizan tu código y te listan los problemas de seguridad encontrados. Muchos equipos usan una u otra (o ambas).

checkov -d .       # analiza el directorio actual
tfsec .            # analiza el directorio actual
   → ambas listan los problemas de seguridad detectados

Qué tipo de problemas detectan

Estas herramientas cazan justamente los errores de seguridad que hemos ido mencionando a lo largo del libro:

Problema detectado Lo vimos en...
Bucket S3 con acceso público Subcapítulo 5.4
SSH abierto a 0.0.0.0/0 Subcapítulo 4.2 / 12.3
Base de datos sin cifrar Capítulo 8
Recursos sin etiquetas requeridas Buenas prácticas
Falta de logs / auditoría Capítulo 24
Permisos IAM demasiado amplios Capítulo 7 (mínimo privilegio)

Es como tener un experto en seguridad revisando cada cambio, que nunca se cansa ni se distrae, aplicando consistentemente cientos de reglas que una persona no podría recordar todas.

Integración en CI: seguridad automática

Igual que fmt y validate (subcapítulo 21.1), estas herramientas se ejecutan en CI, automáticamente, en cada Pull Request:

Pull Request abierto
   ├─ terraform fmt -check
   ├─ terraform validate
   ├─ checkov / tfsec        ← análisis de seguridad
   │     → si encuentra un problema grave → BLOQUEA el cambio ✗
   └─ terraform plan

Así, ningún cambio inseguro puede llegar a producción sin que alguien lo apruebe conscientemente. Si un desarrollador, sin querer, escribe un bucket público, el CI lo detecta y bloquea el PR. Esto es «shift left»: detectar los problemas de seguridad lo más temprano posible (en el código), no cuando ya están en producción y un atacante los encuentra antes que tú.

Ejemplo del mundo real: un desarrollador, con prisa, configura una base de datos sin cifrado para una prueba y, sin darse cuenta, ese código acaba en un PR hacia producción. El CI ejecuta Checkov, que detecta «base de datos RDS sin cifrado en reposo» y bloquea el PR con un mensaje claro. El desarrollador añade el cifrado, vuelve a subir, y ahora sí pasa. El fallo de seguridad nunca llegó a producción, y todo de forma automática.

Una nota sobre los falsos positivos

A veces estas herramientas marcan algo que, en tu caso concreto, es intencionado y aceptable (por ejemplo, un bucket que debe ser público porque sirve una web estática, subcapítulo 5.5). Para esos casos, puedes excluir reglas concretas de forma justificada (con anotaciones en el código o en la configuración de la herramienta). Pero hazlo conscientemente y documentándolo, no para silenciar avisos molestos sin pensar: cada excepción debe tener una razón clara.

Lo que debes recordar

  • fmt y validate comprueban que el código sea correcto, pero no que sea seguro: un código válido puede crear infraestructura peligrosa (buckets públicos, BD sin cifrar, SSH abierto).
  • El análisis estático de seguridad examina tu código sin ejecutarlo y lo compara con cientos de reglas de buenas prácticas, avisando de las configuraciones peligrosas. Como un inspector que revisa los planos antes de construir.
  • Las herramientas principales son Checkov (muy completa, multi-nube) y tfsec (centrada en Terraform, ahora ligada a Trivy). Hacen un trabajo similar.
  • Se integran en CI para bloquear automáticamente los cambios inseguros en cada PR: es el principio «shift left» (cazar los problemas lo antes posible).
  • Gestiona los falsos positivos excluyendo reglas concretas de forma justificada y documentada, no silenciando avisos a la ligera.

En el siguiente subcapítulo daremos el salto a las pruebas más completas: los tests de integración con Terratest, que crean infraestructura real y verifican que funciona.

Cloud, AWS & Terraform — De cero a experto

Capítulo 1 · Qué es el cloud computing

Capítulo 2 · El mercado cloud y los grandes proveedores

Capítulo 3 · Regiones, zonas de disponibilidad y edge

Capítulo 4 · Cómputo: EC2

Capítulo 5 · Almacenamiento: S3

Capítulo 6 · Redes: VPC

Capítulo 7 · Identidad y acceso: IAM

Capítulo 8 · Bases de datos gestionadas

Capítulo 9 · Por qué Infraestructura como Código

Capítulo 10 · HCL: el lenguaje de Terraform

Capítulo 11 · Providers y estado

Capítulo 12 · Tu primera infraestructura real en Terraform

Capítulo 13 · Balanceo de carga y autoescalado

Capítulo 14 · Serverless con Lambda

Capítulo 15 · Mensajería y eventos

Capítulo 16 · Entrega de contenido y DNS

Capítulo 17 · Contenedores en AWS

Capítulo 18 · Módulos: reutilización y composición

Capítulo 19 · Workspaces y gestión de entornos

Capítulo 20 · Backends remotos y locking

Capítulo 21 · Testing de infraestructura

Capítulo 22 · Terraform en CI/CD

Capítulo 23 · Seguridad en profundidad

Capítulo 24 · Observabilidad: logs, métricas y trazas

Capítulo 25 · Optimización de costes

Capítulo 26 · Alta disponibilidad y disaster recovery

Capítulo 27 · Well-Architected Framework de AWS

Capítulo 28 · Arquitecturas serverless a escala

Capítulo 29 · Plataformas de datos en AWS

Capítulo 30 · Multi-cuenta y landing zones

Capítulo 31 · Platform Engineering e Internal Developer Platform

Capítulo 32 · Certificaciones AWS relevantes

Capítulo 33 · Proyectos para consolidar lo aprendido

Capítulo 34 · Recursos y comunidad

© Copyright 2024. Todos los derechos reservados