S3 Encription:
Para encriptar objetos en Buckets se puede usar 4 métodos:
-
Server Side Encryption (SS3) —> SSE-S3
- Las keys son creadas, manejadas y propietarias de AWS
- Se usa AES-256
- Se debe colocar header “x-amz-server-side-encryption” a “AES256”
- Es el que está activado por defecto para nuevos buckets y nuevos objetos

-
Server Side Encryption con KMS Keys almacenadas en AWS KMS
- Yo mismo manejo las llaves a través de AWS KMS
- User control + auditado del uso de la llave usando CloudTrail
- Se debe colocar header “x-amz-server-side-encryption” a “aws:kms”
- Puede verse impactado por los limites de KMS, se necesiatan llamadas a KMS tanto para carga como para descarga. Esto cuenta como quota por segundo (5500, 1000, 30000 req/s) basado en la región.

-
Server Side Encryption con Customer Provided Keys
- Se manejan por el cliente FUERA de AWS.
- Amazon S3 no guarda nunca la encription key que le proveemos.
- Debemos usar HTTPS y la encription key debe proveerse en los headers de HTTP para cada request HTTP que se haga.

-
Client Side Encryption
- La idea es que el cliente encripte los datos antes de enviarlo usando librerías como Amazon S3 Client-Side Encryption library
- El cliente debe encriptar antes de enviar y desencriptar cuando recuperen de Amazon S3.
- El cliente maneja completamente las llaves y el ciclo de encriptado

Existe también la encripción en tránsito:
—> HTTP Endpoint: No encriptado.
—> HTTPS Endpoints: Encriptado en tránsito.
Se recomienda bastante usar HTTPS y es mandatorio para SSE-C. La mayoría de clientes usará el HTTPS endpoint por defecto.
Sin embargo, Se puede forzar la encripción en tránsito:

S3 Encryption Hands On Notes:
—> Se debe tener versioning activado ya que el encriptado crea una nueva versión del objeto.
El SSE-C debe ser hecho a través de CLI, mientras que el CSE, debido a que es del lado del cliente, no hay necesidad de decirle nada a AWS.
S3 Default Encryption:
Por defecto, a todos los objetos se les aplica un encriptado de SSE-S3, pero se podría cambiar a SSE-KMS por ejemplo.
Opcionalmente, se puede forzar encription usando una bucket policy para que se rechace cualquier llamada a la API para crear un objeto sin headers de encriptado (SSE-KMS o SSE-C).

Nota: Las bucket policies son evaluadas antes del encriptado por defecto.