Un recorrido guiado por AWS Key Management Service (KMS) como código

Comencé a realizar trabajos de auditoría de PCI-DSS en 2008 (sí, lo sé). Desde entonces, PCI-DSS siempre ha tenido el “Requisito 3”, un conjunto de requisitos de seguridad de PCI-DSS que generalmente se consideraban infames debido a la cantidad de organizaciones que simplemente no podrían cumplirlos. ¿Cuál fue el requisito 3? Se refería a “Protección de datos de titulares de tarjetas”, más específicamente “en reposo”. Y cuando alguien dice “Protección de datos en reposo”, naturalmente gravitas hacia esa palabra temida, “Cripto”. No, no me refiero al otro avatar temido de “Crypto” (como en CryptoCurrency), sino a “Crypto” como en Cryptography.

El problema nunca fue encriptar y desencriptar datos, sino el mayor desafío: “¿Cómo administramos y protegemos las claves?” La gestión de claves no es una tarea fácil, y lo era aún menos en ese entonces. He visto implementaciones que involucran servidores de administración de claves “de cosecha propia”, implementaciones PGP / GPG de administración de claves con claves simétricas, ejecutables de Windows compartidos entre el CEO y el COO que se usarían para realizar la “custodia dual de claves de cifrado” en algo más simplista como “Oye, no podemos cifrar y administrar claves, veamos los controles de compensación”. Pero algunos de ustedes se preguntarán “¿Qué pasa con los bancos? ¿No tenían esos HSM sofisticados que podían administrar el cifrado y la administración de claves? “

Sí, los bancos tenían HSM, pero solía ser muy difícil trabajar con ellos y mucho más allá del alcance financiero de otras organizaciones

Por eso sonreí cuando vi Amazon Key Management System (KMS). El KMS de Amazon es una entre varias otras soluciones, incluidas Hashicorp Vault, Google Key Management Service, etc., que han tenido como objetivo abordar de manera integral el problema de la administración de claves y secretos. En mi opinión, los buenos sistemas de gestión de claves deben facilitar:

Con Amazon KMS y Amazon Secrets Manager, puede hacer casi todas esas cosas y de manera bastante completa. KMS también está respaldado por HSM, lo que proporciona la garantía necesaria de calidad de cifrado, etc.

En este artículo, exploraré algunas de las características clave de Amazon KMS con Terraform y el AWS SDK para Python, boto3 . Este de ninguna manera es un tutorial completo, pero lo guiaré a través de algunas de las funciones de uso común de KMS y Amazon Secrets Manager.

Generar y rotar claves

Amazon KMS utiliza el concepto de claves maestras de clientes (CMK). Las claves maestras de clientes son los recursos principales del KMS de Amazon. Las CMK son claves simétricas que nunca abandonan el KMS (es decir, nunca tiene acceso a la propia CMK). Puede usar y generar cualquier cantidad de CMK para los diferentes requisitos que pueda tener. Puede utilizar CMK, ya sea para cifrar o descifrar datos directamente. O puede utilizar CMK para generar una clave de datos que se utiliza para cifrar y descifrar datos. Este último parece estar más de moda. De hecho, este último es el que utiliza Amazon S3 cuando necesita realizar el cifrado del lado del servidor con Amazon KMS. De cualquier manera, la CMK nunca abandona los confines de KMS. Si la rotación para la CMK está habilitada, la versión de AWS también administra el cifrado por usted. Por ejemplo, si ha cifrado algunos datos con la CMK y luego los ha rotado. Una vez que necesite descifrar los datos nuevamente, AWS reconoce que el texto cifrado se ha generado con la versión anterior de la clave y maneja el proceso de descifrado en consecuencia. De esta forma, la rotación de claves es un proceso simple.

Veamos dos ejemplos. Uno con terraform, donde usaremos una CMK generada y directamente encriptaremos y desencriptaremos datos con esa CMK y el otro, donde generaremos una CMK, posteriormente generaremos una Data Key y usaremos la Data Key para encriptar y desencriptar datos.

En el ejemplo anterior (Terraform), estoy generando una CMK y, posteriormente, la uso para cifrar texto sin formato. La CMK se ha configurado para rotar automáticamente (después de 365 días). También agregué algo de contexto a la clave con el atributo `Etiquetas`. Ahora, la clave se registrará en Cloudtrail con este nombre con el que se ha “etiquetado”. Una vez que ejecute este ejemplo, debería obtener el texto cifrado de carga útil y, posteriormente, el texto sin formato.

Ahora, veamos el siguiente ejemplo

El código anterior está en Python. Estoy usando la biblioteca boto3 y pycrypto para:

En el siguiente ejemplo, usaremos Terraform para generar una nueva CMK y usaremos el cifrado del lado del servidor con Amazon S3. En este enfoque, la CMK genera una clave de datos, que se utiliza para cifrar un objeto en Amazon S3

Políticas clave y subvenciones

Uno de los otros aspectos clave de la administración de claves es controlar el acceso a las claves en sí. Esto puede ser un problema bastante serio si no está centralizado o administrado bajo un paraguas de acceso único.

Aquí es donde resulta beneficioso tener el marco de Amazon IAM (Identity and Access Management) a nuestra disposición. No entraré demasiado en el marco de IAM de Amazon, pero le brinda un conjunto completo de herramientas para brindar acceso a los recursos, basado en usuarios, grupos, roles, etc.

El primer tipo de control de acceso es KeyPolicy . Con la Política de claves, puede definir quién puede hacer qué con las claves en KMS. Por ejemplo, tiene una función sin servidor que cifra y descifra los datos del usuario. Esta función es administrada por una función de IAM, llamémosla … functionUserRole . Este rol debería permitir que la función sin servidor:

Para esto, puede crear una Política de IAM que permita que esa función solo realice las siguientes acciones.

Este es un ejemplo de una política de claves

La otra forma de restringir los privilegios de acceso para Amazon KMS es con el uso de Grant . El concepto de una subvención no requiere que un usuario genere una configuración de IAM compleja, sino que localiza las configuraciones de acceso a claves dentro de Amazon KMS.

Este es un ejemplo de una subvención con Amazon KMS

En el ejemplo anterior, estoy creando una CMK, un usuario (con un nombre de usuario aleatorio) y una concesión, llamada “hugh-grant” (porque estaba cansado de nombrar recursos en este momento 😛). Esta concesión permite a este usuario utilizar una CMK específica para las funciones Cifrar , Descifrar y GenerateDataKey . El usuario también necesita agregar un contexto de cifrado (atributos adicionales) mientras realiza estas operaciones, con una clave de Departamento con un valor de finanzas que implica que la clave y el usuario son para el uso del departamento de Finanzas de la organización.