Cifrado de datos en AWS: KMS, TLS y mejores prácticas para S3, RDS y EBS

El cifrado es una capa fundamental de defensa. Aprende cómo usar KMS para gestionar claves, TLS para datos en tránsito y las opciones de cifrado en servicios como S3, RDS y EBS.

Cuando hablamos de seguridad en la nube, el cifrado de datos es uno de los pilares más importantes. Protege la confidencialidad y la integridad de tu información tanto cuando está almacenada (en reposo) como cuando se mueve entre servicios o usuarios (en tránsito). AWS ofrece un conjunto robusto de servicios y características para implementar cifrado de manera efectiva, siendo el AWS Key Management Service (KMS) el corazón de la gestión de claves.

En este artículo desglosamos cómo funciona el cifrado en AWS, cuándo usar cada tipo de clave y cómo configurar correctamente el cifrado en servicios de almacenamiento y bases de datos como S3, RDS y EBS. También incluimos mejores prácticas y ejemplos de comandos CLI y políticas que puedes aplicar hoy.

Conceptos básicos: cifrado en reposo vs. en tránsito

Idealmente, deberías aplicar ambos tipos de cifrado para lograr defensa en profundidad. AWS permite habilitar ambos en la mayoría de sus servicios.

💡 Nota
AWS gestiona el cifrado de la infraestructura subyacente (por ejemplo, los discos de los servidores que ejecutan EC2), pero el cifrado de tus datos específicos (como el contenido de un bucket S3 o una base de datos RDS) es tu responsabilidad configurarlo y administrar las claves.

AWS KMS: el centro de gestión de claves

KMS te permite crear, controlar y rotar claves criptográficas utilizadas para cifrar tus datos. Ofrece:

Cuando habilitas el cifrado en un servicio de AWS, generalmente seleccionas una CMK (o usas la predeterminada de AWS) y el servicio se encarga de usar esa clave para cifrar los datos de forma transparente.

Cifrado en S3 (Simple Storage Service)

Amazon S3 ofrece varias opciones de cifrado en reposo:

Para cifrado en tránsito, S3 solo acepta conexiones HTTPS (TLS 1.2+).

Ejemplo: crear un bucket S3 con cifrado SSE‑KMS y una CMK personalizada

# 1. Crear una CMK en KMS (opcional: puedes usar la aws/s3)
aws kms create-key --description "CMK para bucket de datos sensibles" --region us-east-1
# Supongamos que el ID de la clave es: 1111aaaa-bbbb-cccc-dddd-eeeeffff1111

# 2. Crear el bucket y aplicar cifrado SSE‑KMS con esa CMK
aws s3api create-bucket --bucket mi-bucket-seguro --region us-east-1 --create-bucket-configuration LocationConstraint=us-east-1
aws s3api put-bucket-encryption --bucket mi-bucket-seguro --server-side-encryption-configuration '{
    "Rules": [
        {
            "ApplyServerSideEncryptionByDefault": {
                "SSEAlgorithm": "aws:kms",
                "KMSMasterKeyID": "1111aaaa-bbbb-cccc-dddd-eeeeffff1111"
            }
        }
    ]
}'

# 3. (Opcional) Bloquear acceso público y habilitar versionamiento
aws s3api put-public-access-block --bucket mi-bucket-seguro --public-access-block-configuration "BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true"
aws s3api put-bucket-versioning --bucket mi-bucket-seguro --versioning-configuration Status=Enabled

Cifrado en RDS y Aurora

Amazon RDS y Aurora soportan cifrado en reposo usando KMS y cifrado en tránsito usando SSL/TLS.

Cifrado en reposo

Al crear una instancia de RDS, puedes habilitar el cifrado y especificar una CMK. Una vez creado, no puedes desactivar el cifrado ni cambiar la CMK (tienes que crear una nueva instancia y migrar los datos).

Ejemplo: crear una instancia RDS cifrada con KMS

aws rds create-db-instance \
    --db-instance-id mi-base-segura \
    --db-instance-class db.t4g.micro \
    --engine mysql \
    --master-user-admin usuarioadmin \
    --master-user-password Claud3s3cr3t4! \
    --allocated-storage 20 \
    --storage-encrypted \
    --kms-key-id 1111aaaa-bbbb-cccc-dddd-eeeeffff1111 \
    --backup-retention-period 7 \
    --region us-east-1

Para cifrado en tránsito, debes configurar tu aplicación o cliente para usar SSL al conectarse a la instancia. La mayoría de los drivers y conectores lo hacen por defecto, pero verifica que el parámetro require_ssl esté activado o que la cadena de conexión incluya sslmode=require (PostgreSQL) o equivalente.

Cifrado en EBS (Elastic Block Store)

Los volúmenes EBS pueden crearse cifrados usando una CMK de KMS. El cifrado es transparente para el sistema operativo y las aplicaciones.

Ejemplo: crear un volumen EBS cifrado

aws ec2 create-volume \
    --availability-zone us-east-1a \
    --size 100 \
    --volume-type gp3 \
    --encrypted \
    --kms-key-id 1111aaaa-bbbb-cccc-dddd-eeeeffff1111

Si estás lanzando una instancia EC2 y quieres que su volumen raíz esté cifrado, debes especificar la en la plantilla de lanzamiento (launch template) o en la configuración de la instancia.

Mejores prácticas de gestión de claves en KMS

  • Usa CMKs administradas por el cliente para cargas de trabajo sensibles; así controlas la rotación, políticas y auditoría.
  • Habilita la rotación automática de claves cada año (o según tus requisitos de cumplimiento).
  • Aplica políticas de clave mínimas (principio de menor privilegio) usando condiciones en la política de la clave (por ejemplo, limitar el uso a ciertos roles o servicios).
  • Utiliza alias para facilitar la rotación de claves sin cambiar el código de tu aplicación.
  • Monitorea el uso de KMS con CloudTrail y crea alarmas en CloudWatch para operaciones inusuales (por ejemplo, intentos de deshabilitar una clave).
  • Never disable or delete a CMK that is still in use; programa su eliminación con una ventana de espera (por ejemplo, 30 días) para poder recuperarla si es necesario.
⚠️ Atención
Si usamos la clave predeterminada de AWS (aws/s3, aws/ebs, etc.), no podemos administrar su rotación ni políticas. Para cargas de trabajo que requieren cumplimiento (PCI, HIPAA, etc.) es casi siempre necesario usar CMKs propias.

Resultado esperado: lista de verificación de cifrado

Antes de lanzar cualquier recurso de almacenamiento o base de datos, verifica:

  1. ¿El servicio soporta cifrado en reposo? Si sí, ¿está habilitado?
  2. ¿Estás usando una CMK adecuada (administrada por el cliente si necesitas control)?
  3. ¿La política de la clave permite solo los usos necesarios (encriptar/desencriptar por ciertos roles o servicios)?
  4. ¿El cifrado en tránsito está forzado (HTTPS/TLS)?
  5. ¿Has habilitado registro y auditoría (CloudTrail) para operaciones de KMS?
  6. ¿Tienes un plan de rotación de claves y de recuperación ante pérdida de acceso?

Bloque de código: listar y verificar claves KMS

# Listar las CMKs en tu cuenta (alias y descripción)
aws kms list-aliases --query 'Aliases[?AliasName!==`alias/aws/*`].{Name:AliasName, TargetKey:AliasName, TargetKey:TargetKeyId}' --output table

# Ver detalles de una CMK específica (por alias)
aws kms describe-key --key-id alias/mi-clave-s3 --query 'KeyDescription' --output text

✅ Resultado
El resultado esperado o un tip extra.

Conclusión

El cifrado no es una característica opcional en la nube; es una responsabilidad esencial para proteger la confidencialidad y cumplir con normas de seguridad. Al comprender cómo funciona KMS y aplicar correctamente las opciones de cifrado en S3, RDS, EBS y otros servicios, construyes una base sólida para la protección de tus datos en AWS.

Recuerda: la seguridad es un proceso continuo. Revisa periódicamente tus configuraciones de cifrado, rota tus claves y auditoriza el uso de KMS para mantenerte un paso adelante de las amenazas.