Seguridad en IaC: Arquitectura Blindada con Terraform

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.

Riesgo Crítico: Nunca almacene el archivo 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.

Best Practice: Utilice 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