Seguridad en AWS con Terraform

Gestión de identidad y acceso (IAM)

Asegurar los recursos en AWS comienza con el uso eficaz del servicio de Gestión de Identidad y Acceso (IAM). Terraform permite la gestión de políticas y roles IAM de forma declarativa, lo que facilita la replicación y administración coherente de permisos.

Por ejemplo, al definir un rol IAM con permisos específicos, es importante asegurarse de que las políticas adheridas sean las mínimas necesarias para los recursos que va a gestionar. A continuación, se muestra un ejemplo de cómo definir un rol IAM que solo permite acciones de lectura en S3:


resource "aws_iam_role" "read_only_s3" {
  name = "read_only_s3"
  assume_role_policy = jsonencode({
    Version = "2012-10-17",
    Statement = [{
      Effect = "Allow",
      Principal = {"Service": "ec2.amazonaws.com"},
      Action    = "sts:AssumeRole"
    }]
  })
}

resource "aws_iam_policy" "read_only_s3_policy" {
  name        = "ReadOnlyS3Policy"
  description = "Policy to provide read-only access to S3 buckets"
  policy = jsonencode({
    Version = "2012-10-17",
    Statement = [{
      Effect = "Allow",
      Action = ["s3:GetObject", "s3:ListBucket"],
      Resource = ["arn:aws:s3:::your-bucket-name", "arn:aws:s3:::your-bucket-name/*"]
    }]
  })
}

resource "aws_iam_role_policy_attachment" "read_only_s3_attach" {
  role       = aws_iam_role.read_only_s3.name
  policy_arn = aws_iam_policy.read_only_s3_policy.arn
}

Cifrado y protección de datos

Implementar el cifrado de datos es una práctica crítica para protegerlos tanto en tránsito como en reposo. Con Terraform, se pueden declarar recursos como S3 y RDS con cifrado habilitado de manera predeterminada.

Por ejemplo, para crear un bucket en S3 con cifrado predeterminado y las mejores prácticas de seguridad, puedes usar:

resource "aws_s3_bucket" "secure_bucket" {
  bucket = "my-secure-bucket"
  
  server_side_encryption_configuration {
    rule {
      apply_server_side_encryption_by_default {
        sse_algorithm = "AES256"
      }
    }
  }
  
  versioning {
    enabled = true
  }

  lifecycle_rule {
    id      = "log"
    enabled = true

    prefix         = "log/"
    transition {
      days          = 30
      storage_class = "GLACIER"
    }

    expiration {
      days = 365
    }
  }
}

Monitoreo y auditoría

Configuar AWS CloudTrail para registrar todas las acciones realizadas en sus cuentas AWS permite monitoreo y auditoría efectivos. Terraform facilita la creación y configuración de este servicio para garantizar que todas las acciones sean registradas y auditables.

Aquí un ejemplo de cómo definir un trail simple en CloudTrail utilizando Terraform:

resource "aws_cloudtrail" "my_cloudtrail" {
  name                          = "my-cloudtrail"
  s3_bucket_name                = aws_s3_bucket.secure_bucket.id
  include_global_service_events = true
  is_multi_region_trail         = true
  enable_logging                = true
}