Uno de los elementos más valiosos para cualquier empresa es la información, y muchas han optado por almacenar grandes cantidades de datos en entornos cloud, creando grandes repositorios conocidos como Data Lakes. Como medida de protección para garantizar la privacidad y la seguridad de estos datos, resulta imprescindible cifrar la información sensible utilizando las herramientas que ofrecen las plataformas de cloud pública.

En Keepler, nos preocupamos por proteger la información de nuestros clientes almacenada en entornos cloud y habitualmente trabajamos con S3 y KMS como servicios de almacenamiento de datos y gestión de claves de cifrado. Una de las principales dudas que nos transmiten nuestros clientes es saber qué ocurre con los datos cuando rotamos una clave de KMS. Con el fin de clarificar este escenario, en este post analizamos los efectos del rotado manual de claves KMS con material criptográfico importado por el cliente sobre ficheros encriptados y almacenados en un bucket de S3.

Conceptos previos

AWS KMS es un servicio gestionado que permite crear y controlar las claves de cifrado. Una clave maestra de cliente (CMK) es una representación lógica de una clave principal que contiene los metadatos de la clave, así como el material criptográfico de claves utilizado para cifrar y descifrar los datos. Se pueden clasificar en dos tipos:

  • Administradas por AWS: no es posible administrarlas, ni gestionar sus políticas de acceso o de rotación de claves, ya que el servicio de AWS que las crea lo hace en tu lugar.
  • Administradas por el cliente: el cliente se encarga de la gestión de la clave, los accesos a ella, sus políticas de acceso y la rotación de claves, es decir, tienes el control completo de la clave.

A su vez, las CMK administradas por el cliente pueden clasificarse en dos grupos en función de la procedencia del material criptográfico de la clave:

  • Claves cuyo material es proporcionado por AWS: en este tipo de claves AWS administra el material de claves y el cliente no es capaz de ver el material.
  • Claves cuyo material es importado por el cliente: el cliente es el encargado de importar el material de claves a AWS KMS y de administrar dicho material.

En ambos casos, AWS recomienda establecer políticas de rotado de las claves por motivos de seguridad. En el caso de las claves cuyo material criptográfico es proporcionado por AWS, es posible habilitar la rotación automática de claves, de modo que AWS se encarga de cambiar el material criptográfico de la clave usado en las operaciones de cifrado, o clave de backup, sin alterar las propiedades de la CMK como el ID o ARN de la clave.

Sin embargo, en el caso de las claves cuyo material criptográfico es importado por el cliente, no es posible activar la rotación automática de claves. En su lugar existen tres parámetros que el cliente es capaz de modificar y que se deben tener en cuenta a la hora de realizar una rotación de claves manual. Esos tres parámetros a tener en cuenta y que se analizarán en nuestro estudio son:

  • Envelope key: clave pública utilizada para el cifrado del material de la clave.
  • Fecha de vencimiento: es la fecha de caducidad de la clave.
  • Material criptográfico: es el material con el que la clave KMS encripta los datos.

Caso de uso

Partimos de un escenario en el que tenemos tres claves en AWS KMS generadas con el algoritmo de encriptación RSAES_OAEP_SHA_1, con distinto material criptográfico importado por el cliente con fecha de vencimiento noviembre de 2020 para cada una de ellas.

  • Clave A: custom-key-a
  • Clave B: custom-key-b
  • Clave C: custom-key-c

Además, contamos con un bucket de S3 con el nombre keepler-example-bucket encriptado con la clave custom-key-a que contiene los ficheros encriptados tal y como se observan en la tabla:

Una vez creado el escenario sobre el que realizar el estudio, se procedió en primer lugar a modificar la envelope key de la clave custom-key-a para comprobar los efectos de esto sobre los ficheros encriptados con la clave custom-key-a. Dicha modificación no afectó a los ficheros, ya que el material criptográfico de la clave custom-key-a, utilizado para el cifrado y descifrado, era el mismo y, por tanto, los ficheros estaban accesibles.

A continuación se analizaron los efectos de modificar la fecha de vencimiento de la clave importada para observar las consecuencias sobre los ficheros encriptados con esa clave en el bucket de S3. Utilizando el mismo token de importación y el mismo material de encriptación con el que se creo la clave custom-key-c, modificamos su fecha de vencimiento para que caducará el día que se estaba haciendo el estudio y observar el resultado.

Después, subimos un nuevo fichero (myfile7.txt) encriptado con la clave custom-key-c, cuyo material vence en el día de hoy, al bucket de S3. Una vez se ha subido el fichero, intentamos descargarlo y comprobamos que es posible acceder a ese fichero sin problemas. Sin embargo, al día siguiente, momento en el cual ya había vencido el material de la CMK custom-key-c, intentamos descargar el fichero myfile7.txt y recibimos el siguiente error ya que la CMK ha vencido:

Por otro lado, al intentar acceder al fichero myfile6.txt, que recordemos estaba encriptado con la clave custom-key-c, recibimos el mismo error dado que la CMK ha vencido y el estado de la clave es “Pendiente de importación”.

Además, al intentar subir un fichero encriptado con esta misma clave al bucket de S3 observamos no es posible por el mismo motivo tal y como se puede ver en el ejemplo.

$ aws s3 cp /home/jota/datos/myfile8.txt s3://keepler-example-bucket/myfile8.txt –sse aws:kms –sse-kms-key-id d805a9e9-838f-452a-9130-2b471eb5b991 –profile keepler-sandbox

Output:
upload failed: ../datos/myfile8.txt to s3://keepler-example-bucket/myfile8.txt An error occurred (KMS.KMSInvalidStateException) when calling the PutObject operation: arn:aws:kms:eu-west-1:144504654788:key/d805a9e9-838f-452a-9130-2b471eb5b991 is pending import.

Sin embargo, al descargar el fichero myfile5.txt que estaba encriptado con la clave custom-key-b, cuya fecha de vencimiento es dentro de 1 año, podemos acceder a su contenido sin problemas.

Llegados a este punto, y dado que hemos perdido el contenido de los ficheros myfile6.txt y myfile7.txt, vamos a intentar recuperarlo. Para ello, volvemos a importar el material de la clave custom-key-c con fecha de vencimiento octubre de 2020. Es importante destacar que el material de claves y el token de importación que vamos a usar son los mismos que ya tenía la clave inicialmente, es decir, no se van a modificar. Una vez ampliada la fecha de vencimiento del material de claves, ya podemos descargar los ficheros myfile6.txt y myfile7.txt y por tanto hemos conseguido recuperarlos.

Hasta este momento no se ha realizado ningún cambio en el material de claves de una CMK, es decir, el material de claves no ha sido rotado, pero ¿qué ocurre si se procede a la rotación de dicho material?

Partimos de un escenario con los ficheros myfile6.txt y myfile7.txt encriptados con la clave custom-key-c cuyo material fue importado por el cliente y cuya fecha de vencimiento es dentro de un año.

En primer lugar se procede a la rotación del material de la clave mediante el siguiente comando:
$ aws kms import-key-material –key-id d805a9e9-838f-452a-9130-2b471eb5b991 –encrypted-key-material fileb://EncryptedKeyMaterial.bin –import-token fileb:/importToken_d805a9e9-838f-452a-9130-2b471eb5b991_11141430 –expiration-model KEY_MATERIAL_EXPIRES –valid-to 2020-08-08T12:00:00-08:00 –profile keepler-sandbox

La respuesta que se obtiene es:
An error occurred (InvalidImportTokenException) when calling the ImportKeyMaterial operation

Esa excepción ocurre porque, tal y como se cita textualmente en la documentación de AWS: “Si la CMK contiene material de claves, debe eliminar el material de claves existente antes de volver a importar el nuevo”. Por lo tanto, para poder importar un nuevo material criptográfico en la clave custom-key-c se debe borrar el material criptográfico existente. Esto supone que los ficheros encriptados con el material criptográfico original quedarán inaccesibles tal y como vamos a comprobar.

Para ello, eliminamos el material de la clave custom-key-c. Antes de confirmar la eliminación de ese material, se muestra un mensaje indicando que los ficheros encriptados con esa clave no estarán a partir de este momento accesibles.

A continuación, se importa un nuevo material a esa clave y se comprueba que no es posible ya que tal y como se cita textualmente en la documentación de AWS: “Debe volver a importar el mismo material de claves originalmente importado en la CMK. No puede importar material de claves diferente en una CMK”.

Sin embargo, si se vuelve a importar el material de claves original a la CMK, los ficheros myfile6.txt y myfile7.txt vuelven a ser accesibles.

Por lo tanto, para realizar la rotación manual de la clave se debe crear una nueva clave KMS con su propio material criptográfico y realizar la encriptación de los nuevos ficheros en el bucket de S3 con esa nueva clave, por ejemplo custom-key-d. Sin embargo, no se puede olvidar que se debe mantener habilitada la clave custom-key-c para acceder a los ficheros antiguos myfile6.txt y myfile7.txt, de lo contrario, se perderán los datos contenidos en estos ficheros.

Conclusiones

A la vista de los resultados obtenidos en el caso de estudio expuesto en este artículo, podemos extraer las siguientes conclusiones:

  • En una CMK solo se puede importar un único material de claves, no se pueden importar materiales de claves diferentes. Sin embargo, es posible utilizar distintas claves de encapsulamiento para importar el mismo material de claves, ya que el procedimiento de encapsulamiento no afecta el contenido del material de claves.
  • Cuando en una CMK el material de claves alcanza la fecha de vencimiento o se elimina, los datos o ficheros encriptados con esa clave no estarán disponibles y no será posible acceder a ellos.
  • Es posible recuperar los ficheros no disponibles actualizando la fecha de vencimiento del material de claves o importando el material de claves original en la CMK.
  • La rotación automática de claves consiste en cambiar únicamente la clave de backup, que es el material criptográfico usado en las operaciones de cifrado. Por lo tanto en la rotación manual de claves, el uso de una nueva CMK tiene el mismo efecto que cambiar la clave de backup de una CMK existente.

Imagen: unsplansh | @mrbrodeur

Author

  • José Javier Martinez

    Cloud Engineer en Keepler Data Tech. "Working with cloud technologies and automation tools since I joined the working world. I love challenges and discovering new things every day. I believe in daily learning, in continuous improvement and I consider fundamental to share knowledge among all. We all have something to learn and to teach."