Un archivo terraform.tfstate no cifrado, commiteado accidentalmente en un repositorio Git público, representa una vulnerabilidad de severidad crítica. Este archivo contiene, por diseño, valores de salida y configuración en texto plano, incluyendo claves de acceso a bases de datos y tokens de API. En entornos de alta concurrencia y sistemas distribuidos, confiar en la seguridad por oscuridad es negligencia técnica. A continuación, analizamos la arquitectura necesaria para mitigar vectores de ataque en la capa de Infraestructura como Código (IaC).
Gestión Criptográfica del Estado (State File)
El backend local es inaceptable para cualquier entorno de producción. El bloqueo de estado (state locking) es esencial para prevenir condiciones de carrera (race conditions) durante despliegues concurrentes, pero la seguridad de los datos en reposo es prioritaria.
tfstate en el sistema de archivos local ni en sistemas de control de versiones. Terraform almacena todos los atributos de los recursos gestionados, lo que expone secretos incluso si se declaran como variables sensibles en el código HCL.
La arquitectura recomendada utiliza un backend remoto (como AWS S3) con cifrado del lado del servidor (SSE-KMS) y una tabla DynamoDB para la gestión de bloqueos distribuidos.
// Configuración de Backend Seguro (AWS)
// Se fuerza el cifrado AES-256 y el bloqueo vía DynamoDB
terraform {
backend "s3" {
bucket = "tf-state-prod-sec-v1"
key = "core/infrastructure.tfstate"
region = "us-east-1"
encrypt = true
dynamodb_table = "terraform-state-lock"
kms_key_id = "alias/terraform-bucket-key"
}
}
// Recurso con protección de datos
resource "aws_db_instance" "default" {
allocated_storage = 10
engine = "mysql"
username = "admin"
password = var.db_password
// Evita que este recurso se destruya accidentalmente
lifecycle {
prevent_destroy = true
}
}
Validación SAST en el Pipeline CI/CD
Implementar seguridad "Shift-Left" implica escanear el código HCL antes de que llegue al plan de ejecución. Herramientas como tfsec y Checkov analizan el árbol de sintaxis abstracta (AST) para detectar configuraciones erróneas, como puertos 22 abiertos a 0.0.0.0/0 o discos sin cifrar.
| Característica | tfsec | Checkov |
|---|---|---|
| Motor de Análisis | Específico para Terraform, muy rápido. | Multi-framework (Terraform, K8s, CloudFormation). |
| Personalización | Reglas custom en JSON/YAML. | Políticas en Python (mayor flexibilidad). |
| Integración Graph | Limitada. | Soporte robusto para análisis basado en grafos. |
Implementación en GitHub Actions
El siguiente pipeline bloquea el Pull Request si se detectan vulnerabilidades de alta severidad. Esto establece un "Quality Gate" de seguridad obligatorio.
name: "Terraform Security Audit"
on: [pull_request]
jobs:
tfsec_audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Run tfsec
uses: aquasecurity/tfsec-action@v1.0.0
with:
soft_fail: false # Falla el build si encuentra errores
additional_args: --minimum-severity HIGH
- name: Run Checkov
uses: bridgecrewio/checkov-action@master
with:
directory: .
framework: terraform
# Solo falla en errores críticos para evitar falsos positivos masivos iniciales
soft_fail: true
output_format: cli
Manejo de Secretos y Drift Detection
El código Terraform nunca debe contener secretos hardcodeados. Utilice gestores de secretos externos (AWS Secrets Manager, HashiCorp Vault) y referéncielos mediante data sources. Además, marque explícitamente las variables sensibles.
sensitive = true en las definiciones de variables y outputs. Esto instruye a Terraform para que redacte estos valores en la salida de la consola (stdout), evitando que las credenciales aparezcan en los logs del CI/CD.
variable "db_password" {
description = "Password maestro para RDS"
type = string
sensitive = true // Redacta el valor en logs
}
output "db_connection_string" {
value = "mysql://${aws_db_instance.default.endpoint}"
sensitive = true // Obligatorio si depende de una variable sensible
}
Finalmente, la seguridad no termina en el despliegue. El "Drift" (desviación entre el estado real y el código) puede indicar cambios manuales no autorizados o compromisos de seguridad. Configure tareas programadas (cron jobs) que ejecuten terraform plan -detailed-exitcode para alertar a los equipos de SecOps si la infraestructura en vivo difiere de la definición en IaC.
Post a Comment