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
fmtyvalidatecomprueban 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
- 1.1 El modelo cliente-servidor tradicional
- 1.2 Problemas que venía a resolver la nube
- 1.3 On-premise vs cloud vs híbrido
- 1.4 Los tres modelos de servicio: IaaS, PaaS, SaaS
- 1.5 Los cinco pilares del cloud (según NIST)
- 1.6 Ventajas reales: elasticidad, pago por uso, disponibilidad global
Capítulo 2 · El mercado cloud y los grandes proveedores
- 2.1 AWS, Azure y GCP: diferencias y cuotas de mercado
- 2.2 Por qué aprender AWS primero
- 2.3 Conceptos que son universales entre proveedores
Capítulo 3 · Regiones, zonas de disponibilidad y edge
- 3.1 Qué es una región AWS y cómo elegirla
- 3.2 Availability Zones: alta disponibilidad desde el diseño
- 3.3 Edge locations y CloudFront
- 3.4 Latencia, resiliencia y soberanía de datos
Capítulo 4 · Cómputo: EC2
- 4.1 Instancias: tipos, familias y cuándo elegir cada una
- 4.2 AMIs, key pairs y Security Groups
- 4.3 Ciclo de vida de una instancia
- 4.4 Elastic IPs y Placement Groups
- 4.5 Savings Plans vs Reserved vs On-Demand vs Spot
Capítulo 5 · Almacenamiento: S3
- 5.1 Buckets, objetos y claves
- 5.2 Clases de almacenamiento (Standard, IA, Glacier…)
- 5.3 Versionado y ciclo de vida de objetos
- 5.4 Políticas de bucket y ACLs
- 5.5 Hosting de sitios web estáticos
Capítulo 6 · Redes: VPC
- 6.1 Qué es una VPC y por qué la necesitas
- 6.2 Subredes públicas y privadas
- 6.3 Internet Gateway y NAT Gateway
- 6.4 Route Tables y Network ACLs
- 6.5 VPC Peering y endpoints
Capítulo 7 · Identidad y acceso: IAM
- 7.1 Usuarios, grupos, roles y políticas
- 7.2 El principio de mínimo privilegio
- 7.3 Políticas basadas en identidad vs en recurso
- 7.4 MFA y credenciales temporales (STS)
- 7.5 Buenas prácticas de seguridad IAM
Capítulo 8 · Bases de datos gestionadas
- 8.1 RDS: motores, Multi-AZ y réplicas de lectura
- 8.2 Aurora y sus ventajas sobre RDS vanilla
- 8.3 DynamoDB: modelo clave-valor / documentos
- 8.4 ElastiCache para caché en memoria
- 8.5 Cuándo usar cada tipo de base de datos
Capítulo 9 · Por qué Infraestructura como Código
- 9.1 Problemas del aprovisionamiento manual
- 9.2 IaC declarativo vs imperativo
- 9.3 Terraform vs CloudFormation vs Pulumi vs CDK
- 9.4 El ciclo plan → apply → destroy
Capítulo 10 · HCL: el lenguaje de Terraform
- 10.1 Bloques resource, variable, output, locals
- 10.2 Tipos de datos: string, number, bool, list, map, object
- 10.3 Expresiones, referencias y funciones built-in
- 10.4 Condicionales y bucles (count, for_each, for)
Capítulo 11 · Providers y estado
- 11.1 Cómo funciona el provider de AWS
- 11.2 El fichero terraform.tfstate y su importancia
- 11.3 State local vs state remoto (S3 + DynamoDB)
- 11.4 Comandos esenciales: init, plan, apply, destroy, fmt, validate
Capítulo 12 · Tu primera infraestructura real en Terraform
- 12.1 Crear una VPC con subredes desde cero
- 12.2 Levantar una instancia EC2 pública
- 12.3 Asociar un Security Group y una Elastic IP
- 12.4 Outputs y referencias entre recursos
- 12.5 Flujo de trabajo en equipo: PR review de planes
Capítulo 13 · Balanceo de carga y autoescalado
- 13.1 Application Load Balancer vs Network Load Balancer
- 13.2 Target Groups, listeners y reglas
- 13.3 Auto Scaling Groups: políticas y métricas
- 13.4 Warm pools y lifecycle hooks
Capítulo 14 · Serverless con Lambda
- 14.1 El modelo de ejecución de Lambda
- 14.2 Triggers: API Gateway, S3, DynamoDB Streams, SQS
- 14.3 Gestión de dependencias y capas (Layers)
- 14.4 Cold starts y estrategias para reducirlos
- 14.5 Límites y antipatrones
Capítulo 15 · Mensajería y eventos
- 15.1 SQS: colas estándar vs FIFO, DLQ
- 15.2 SNS: topics, suscripciones, fan-out
- 15.3 EventBridge: event buses y reglas
- 15.4 Patrones: pub/sub, desacoplamiento, saga
Capítulo 16 · Entrega de contenido y DNS
- 16.1 Route 53: tipos de registros y routing policies
- 16.2 CloudFront: distribuciones, cachés y origins
- 16.3 ACM: certificados SSL/TLS gratuitos
- 16.4 WAF integrado con CloudFront
Capítulo 17 · Contenedores en AWS
- 17.1 Docker: repaso exprés de conceptos clave
- 17.2 ECR: registro privado de imágenes
- 17.3 ECS: task definitions, services, Fargate vs EC2
- 17.4 EKS: cuándo Kubernetes y cuándo no
Capítulo 18 · Módulos: reutilización y composición
- 18.1 Anatomía de un módulo Terraform
- 18.2 Variables de entrada, outputs y dependencias
- 18.3 Módulos locales vs módulos del Terraform Registry
- 18.4 Versionado de módulos con Git tags
- 18.5 Diseño de módulos genéricos vs específicos de dominio
Capítulo 19 · Workspaces y gestión de entornos
- 19.1 Workspaces de Terraform: casos de uso y limitaciones
- 19.2 Estrategia de directorios por entorno (dev/stg/prod)
- 19.3 Terragrunt: DRY para configuraciones de entorno
- 19.4 Variables de entorno y archivos .tfvars
Capítulo 20 · Backends remotos y locking
- 20.1 Configurar S3 + DynamoDB como backend
- 20.2 State locking: evitar corrupción en equipo
- 20.3 Migración de estado entre backends
- 20.4 terraform import: traer recursos existentes al estado
Capítulo 21 · Testing de infraestructura
- 21.1 Terraform validate y fmt en CI
- 21.2 Checkov y tfsec: análisis de seguridad estático
- 21.3 Terratest: tests de integración en Go
- 21.4 Contract testing entre módulos
Capítulo 22 · Terraform en CI/CD
- 22.1 Pipeline básico: lint → plan → apply en GitHub Actions
- 22.2 Atlantis: GitOps para Terraform
- 22.3 Terraform Cloud / HCP Terraform
- 22.4 Drift detection y reconciliación automática
Capítulo 23 · Seguridad en profundidad
- 23.1 AWS Organizations y Service Control Policies
- 23.2 AWS Config: compliance continuo
- 23.3 GuardDuty: detección de amenazas
- 23.4 Security Hub: visión centralizada
- 23.5 KMS: gestión de claves y rotación
- 23.6 Secrets Manager vs Parameter Store
Capítulo 24 · Observabilidad: logs, métricas y trazas
- 24.1 CloudWatch Logs, métricas y alarmas
- 24.2 CloudWatch Dashboards y Contributor Insights
- 24.3 X-Ray: trazado distribuido
- 24.4 OpenTelemetry en AWS
- 24.5 Managed Grafana y Managed Prometheus
Capítulo 25 · Optimización de costes
- 25.1 AWS Cost Explorer y presupuestos con alertas
- 25.2 Trusted Advisor y Compute Optimizer
- 25.3 Rightsizing: cómo detectar sobredimensionamiento
- 25.4 Savings Plans vs Reserved Instances: decisión estratégica
- 25.5 FinOps: cultura y procesos para controlar el gasto
Capítulo 26 · Alta disponibilidad y disaster recovery
- 26.1 RTO y RPO: definir los objetivos
- 26.2 Estrategias: backup/restore, pilot light, warm standby, multi-site
- 26.3 Route 53 health checks y failover automático
- 26.4 AWS Backup: política centralizada de copias
Capítulo 27 · Well-Architected Framework de AWS
- 27.1 Los seis pilares: excelencia operacional, seguridad, fiabilidad, eficiencia de rendimiento, optimización de costes, sostenibilidad
- 27.2 Well-Architected Tool: revisiones formales
- 27.3 Cómo aplicar el framework en decisiones de diseño
Capítulo 28 · Arquitecturas serverless a escala
- 28.1 Event-driven architecture con Lambda + EventBridge
- 28.2 Saga pattern para transacciones distribuidas
- 28.3 Step Functions: orquestación de workflows complejos
- 28.4 Lambda@Edge y CloudFront Functions
Capítulo 29 · Plataformas de datos en AWS
- 29.1 Data Lake con S3, Glue y Athena
- 29.2 Kinesis Data Streams y Firehose para streaming
- 29.3 Redshift: data warehousing a escala
- 29.4 Lake Formation: gobierno del dato
Capítulo 30 · Multi-cuenta y landing zones
- 30.1 Por qué separar workloads en cuentas distintas
- 30.2 AWS Control Tower y Account Factory
- 30.3 Gestión centralizada de logs y seguridad
- 30.4 Terraform a escala multi-cuenta con módulos compartidos
Capítulo 31 · Platform Engineering e Internal Developer Platform
- 31.1 Golden paths y abstracciones sobre Terraform
- 31.2 Service Catalog de AWS
- 31.3 Backstage como portal de desarrolladores
- 31.4 Módulos Terraform como producto interno
Capítulo 32 · Certificaciones AWS relevantes
- 32.1 Cloud Practitioner: ¿vale la pena?
- 32.2 Solutions Architect Associate → Professional
- 32.3 DevOps Engineer Professional
- 32.4 Specialty: Security, Database, Networking
- 32.5 HashiCorp Terraform Associate
Capítulo 33 · Proyectos para consolidar lo aprendido
- 33.1 Proyecto 1: blog serverless (S3 + CloudFront + Lambda + DynamoDB)
- 33.2 Proyecto 2: API REST con ECS Fargate + RDS + ALB
- 33.3 Proyecto 3: plataforma de datos con Glue + Athena + Redshift
- 33.4 Proyecto 4: landing zone multi-cuenta con Terraform y Control Tower
