Blog de Amazon Web Services (AWS)

Cómo utilizar AWS Secrets Manager para almacenar y rotar de forma segura sus claves SSH

Por Maitreya Ranganath, Arquitecto de Soluciones en AWS
y Assaf Namer

 

AWS Secrets Manager proporciona la gestión del ciclo de vida de los secretos dentro de su ambiente. En este post, Maitreya y Yo le mostraremos cómo puede utilizar AWS Secrets Manager para guardar, entregar y rotar sus claves SSH utilizadas para la comunicación entre clústers y nodos de cómputo. La rotación de las claves SSH es una buena práctica de seguridad y, a veces, un requisito reglamentario. Tradicionalmente, la rotación de claves SSH se ha asociado con varios desafíos. Por ejemplo, sincronizar la rotación de claves entre todos los nodos de computo, permitir el registro y la auditoría detallada y administrar el acceso a usuarios para modificar secretos.

Sin embargo, la rotación de las claves SSH en todos los nodos de computo debe realizarse de manera bien coordinada y, por lo general, las fallas pueden generar riesgos de disponibilidad. Además, las claves SSH son puntos muy sensibles para la seguridad de las credenciales, lo que debe ser tratado con cuidado y controlado mediante controles de acceso granulares, monitoreo detallado, auditoría y registro. Estos son precisamente los tipos de desafíos que AWS Secrets Manager puede resolver por usted.

En este post, le mostraremos cómo proteger, rotar y usar sus claves SSH para la comunicación entre clústeres. Usted utilizará una plantilla de AWS CloudFormation para aprovisionar un clúster y configurar AWS Secrets Manager. A continuación, le mostraremos cómo usar AWS Secrets Manager para entregar sus claves SSH al clúster y cómo utilizarlas para administrar operaciones administrativas, como copiar un archivo de forma segura entre nodos. Por último, utilizaremos AWS Secrets Manager para rotar las claves SSH utilizadas por el clúster sin provocar cambios ni falta de disponibilidad. En este post, utilizaremos clústers de computo, pero se puede usar AWS Secrets Manager para aplicar esta solución directamente a otros casos que usen claves SSH.

Descripción general de la solución

El siguiente diagrama representa una descripción general de la solución:


Figura 1: Arquitectura de la solución

En este ejemplo de arquitectura creado por CloudFormation, contiene un nodo principal, tres nodos auxiliares, AWS Secrets Manager, que utiliza la función de rotación de claves mediante una función AWS Lambda, y AWS  Systems Manager. La configuración del clúster está fuera del alcance de este post; en nuestro paso a paso, nos centraremos en la arquitectura de rotación de claves SSH.

AWS Secrets Manager utiliza staging labels para identificar las diferentes versiones de un secreto durante la rotación. Staging Label es un texto en formato string. Por ejemplo, por defecto, AWSCURRENT se coloca en la versión actual del secreto, mientras que AWSPENDING se utilizará con las nuevas versiones del secreto antes de ser verificado y entregado a los recursos correspondientes.

Según el diagrama:

  1. El secreto se crea en AWS Secrets Manager. El secreto contiene la clave SSH que el nodo maestro utilizará para conectarse a los demás nodos del clúster. Tras rotar la clave SSH, AWS Secrets Manager ejecutará la función Lambda (denominada 1.a en el diagrama). La función Lambda realizará cuatro pasos:
    • b: createSecret – crea un nuevo par de claves SSH y almacena la clave privada como una nueva versión del secreto.
    • c: setSecret –Añade un staging label AWSPENDING a la nueva versión del secreto creado y copia la clave pública en los nodos auxiliares utilizando AWS System Manager Run Command.

    La función Lambda también realizará dos pasos no descritos en el diagrama.

    • testSecret – Comprobar que la nueva clave SSH se entregó correctamente a los recursos realizando una prueba de conexión SSH.
    • finishSecret – – Establezcer el staging label AWSCURRENT para la nueva versión del secreto, y elimine las claves antiguas de los nodos auxiliares. Esto tambien establecera el staging label de AWSPREVIOUS en el secreto antiguo, lo que permitirá al administrador acceder a la «última contraseña conocida» en caso de que algo no funcione correctamente.

    En la guía del usuario de AWS Secrets Manager encontrará una descripción general de la función Lambda para rotar claves SSH. Usted tiene el control total de la función de rotación de claves, por lo que puede personalizarla según tus necesidades. Tenga en cuenta que no hay ninguna clave instalada en el nodo maestro. En cambio, la función obtendrá la clave privada a través de AWS Secrets Manager solo cuando sea necesario para comunicarse de forma segura con los nodos auxiliares. Por lo tanto, la clave privada no se almacena en el sistema de nodos principal, sino en la memoria volátil (como buena practica, la variable de clave privada se sobrescribe después de una conexión satisfactoria y se elimina antes de que el script finalice); los detalles sobre cómo mantener los valores secretos en la memoria volátil se analizarán más adelante en este post.

  2. Cuando el nodo principal necesita comunicarse con alguno de los nodos auxiliares, utilizara el SDK de AWS (Python Boto3) para leer la clave privada SSH desde AWS Secrets Manager (2.a) y utilizara la clave privada para establecer un túnel SSH con el nodo auxiliar (2.b). El nodo maestro es autorizado a leer la clave privada de AWS Secrets Manager porque hay una regla en AWS Identity and Access Management (IAM) con una política que le permite acceder al secreto, y esta regla está configurada para el nodo maestro. La clave pública respectiva fue entregada a cada uno de los nodos auxiliares durante el proceso de rotación de claves explicado en el paso anterior.
  3. Los secretos almacenados en AWS Secrets Manager se cifran con AWS Key Management System (KMS) y cada versión del secreto se cifra con una clave de cifrado de datos única. La clave SSH del clúster se rotará periódicamente según el intervalo configurado, el cual usted va a configurar en la consola de AWS Secrets Manager más adelante en este post. Cada rotación de claves repite los procesos descritos en los pasos 1 y 2, lo que da como resultado una nueva versión del secreto. Cada nueva versión se cifrará con una nueva clave de datos de KMS, que proporciona una capa adicional de seguridad.
  4. El AWS Systems Manager Run Command utilizará la etiqueta RotatesshKeys de Amazon Elastic Compute Cloud (EC2) con el valor True para identificar los nodos auxiliares. Tenga en cuenta que para confiar en las etiquetas como control de seguridad, debe tener un plan de gobierno claro y controlar qué usuarios tienen permisos para cambiar las etiquetas y los valores de las etiquetas en sus instancias de EC2.

Costo de la solución

En la actualidad, esta solución aplicada en la región de Virginia del Norte costará $0.0577 USD por hora para cuatro instancias EC2 t2.micro y NAT Gateway que componen el clúster de ejemplo. AWS Secrets Manager cuenta con un período de prueba gratuito de 30 días, despues del cual un secreto costará $0.40 USD al mes y $0.05 USD por cada 10,000 llamadas a la API. El uso de AWS Systems Manager no conlleva ningún coste adicional.

Implementación de la solución

En esta sesión, implementará un entorno de pruebas en el que se mostrará toda la solución. Tras la implementación, iniciará sesión en el nodo principal y copiará de forma segura un archivo en los nodos auxiliares. Por último, utilizará AWS Secrets Manager para rotar y aplicar la nueva clave SSH. La plantilla de CloudFormation y el código para rotar el secreto están disponibles en el repositorio GitHub de AWS.

Configure el entorno de ejemplo seleccionando “Launch Stack” de AWS CloudFormation que aparece a continuación; de forma predeterminada, el entorno se creará en la región us-east-1 (N. Virginia).

Select this image to open a link that starts building the CloudFormation stack

La plantilla crea una Amazon Virtual Private Cloud (VPC), una subred privada y una subred pública, instancia EC2 (nodo maestro y clúster de simulación), la regla de IAM y sus políticas respectivas necesarias para la instancia EC2.

  1. Seleccione su keypair SSH de EC2 e introduzca el rango de IP deseado para sus recursos en los parámetros. En el campo “YourIPrange”, introduzca únicamente el CIDR de su computadora o red para garantizar que solo los hosts de su red puedan acceder al nodo principal. Puede dejar los demás parámetros como predeterminados. Esta plantilla de CloudFormation crea cuatro instancias t2.micro en una nueva VPC. Una instancia recibirá la etiqueta MasterServer y las otras instancias recibirán la etiqueta WorkerServer1-3.

    Nota: El keypair SSH al que se hace referencia aquí se utilizará para conectarse desde su equipo local al nodo principal. Este par de claves es diferente del que utilizará el nodo principal para conectarse a los nodos auxiliares.

    Figure 2: Enter the CIDR of your machine or network
    Figura 2: Configurar el CIDR desde el ordenador o la red

    Importante: Para simplificar, el nodo principal que se creará paso a paso se colocará en una subred pública, lo que permitirá acceder a él a través del CIDR que especificó en el paso 2. Sin embargo, esta no es la mejor práctica de seguridad. Siga la guía de la documentación de Amazon EC2 VPN para configurar de forma segura su clúster en una subred privada siguiendo el principio de “defensa en profundidad».

  2. Supervise el estado de los recursos. Cuando el estado sea CREATE_COMPLETE, se habrá completado el deployment. Seleccione la pestaña Outputs para buscar información sobre los recursos que se crearon y anote el DNS público del nodo principal y la IP de uno de los nodos auxiliares. Necesitarás esta información en los próximos pasos de este post.
  3. Seleccione el botón “Launch Stack” para implementar la plantilla de AWS CloudFormation que creará la función Lambda utilizada por AWS Secrets Manager y acepte los valores por defecto de los parámetros. Esta plantilla se diseñó para ser reutilizada; se puede aplicar a cualquier caso de uso de rotación de claves SSH.Select this image to open a link that starts building the CloudFormation stack

Después, cree y configure un nuevo secreto desde la consola de AWS Secrets Manager para almacenar el par de claves de comunicación SSH del clúster.

Configuración de un secreto en AWS Secrets Manager

La plantilla de CloudFormation no hizo el deploy de ningún secreto, siga los pasos que se indican a continuación para crear un secreto desde la consola y configurar la función de rotación de claves.

Para crear un secreto nuevo:

  1. Abra la consola de AWS Secrets Manager y seleccione Store New Secret.
  2. Seleccione Other type of secrets, a continuación seleccione la pestaña Plaintext.
  3. Como se muestra en la figura 3, coloque {} para crear un JSON vacío sin valores ni propiedades. Este valor sera inicializado y rellenado con un keypair mediante la función Lambda de rotación de claves.


    Figura 3: Crear un JSON vacío sin valores ni propiedades

     

  4. Conserve la clave de cifrado predeterminada y seleccione Next. En este ejemplo, mantendremos la clave de cifrado predeterminada para simplificar el proceso; sin embargo, como buena práctica de seguridad, se recomienda utilizar una clave AWS KMS que haya creado usted.
  5. En el Paso 2: Secret Name and description, nombre el secreto como /dev/ssh. La ruta de un secreto se puede utilizar en la política del secreto de IAM para restringir a los usuarios y las reglas a un secreto o a un conjunto de secretos. Por ejemplo, la política de IAM puede incluir /dev/* o /prod/* para controlar el acceso a los secretos en el entorno de desarrollo o producción respectivamente.
  6. Añada una descripción y, a continuación, seleccione Next.


    Figura 4: Añadir una descripción

  7. En el Paso 3: Configure automatic rotation, haga clic en el botón Automatic rotation y active el intervalo de rotación que desee, puede seleccionarlo con una expresión o a través una lista.
  8. Seleccione la lista de Lambda rotation function y seleccione RotateSSH. Esta es la función Lambda que se creó mediante la plantilla de CloudFormation.
  9. Seleccione Next, revise las opciones que fueron seleccionadas y haga clic en Store. Cuando se guarda la configuración del nuevo secreto, la función Lambda de rotación se activa inmediatamente, rellenando el valor del secreto.

    Figura 5: Configurar la rotación

Probando la solución

Una vez finalizada la configuración del secreto y con las instancias creadas y funcionando, tendra que copiar de forma segura un archivo del nodo maestro a uno de los nodos auxiliares, utilizando la clave SSH almacenada en AWS Secrets Manager para probar la solución.

  1. Inicie sesión en el nodo maestro mediante SSH con la clave EC2 que especificó en la plantilla de CloudFormation.
  2. Una vez conectado, copie de forma segura un archivo del nodo principal al nodo auxiliar mediante la función SCP (secure copy protocol) mediante el siguiente comando. Sustitúya <ip-privado-nodo-auxiliar> por la IP del nodo auxiliar que anotó en el paso 3:
  3. SCP (secure copy protocol) utilizando o comando abaixo. Substitua <ip-privado-no-auxiliar> com o IP do nó auxiliar que você anotou no passo 3:
            python copy_file.py ec2-user <ip-privado-nodo-auxiliar>

La figura 6 muestra el inicio de sesión en el nodo principal y el comando copy_file.py para el nodo auxiliar.

Figure 6: The <span style="font-family: courier">ssh</span> login to master node, and the <span style="font-family: courier">copy_file.py</span> command
Figura 6: El inicio de sesión de SSH en el nodo maestro y el comando copy_file.py

Durante la ejecución, el script de Python utilizará la API get_secret_value de AWS Secrets Manager para obtener el secreto que contiene la clave privada. Luego utilizará esta clave para establecer una conexión segura con los nodos auxiliares, sin necesidad de guardar la clave privada en alguno de los nodos principales.

Puedes revisar el archivo copy_file.py del nodo principal en GitHub. En la función get_private_key(), se puede leer el valor del secreto, que contiene la clave privada.

    get_secret_value_response = client.get_secret_value(
    SecretId=secret_name)           

En la función copy_file, se crea un túnel SSH seguro para copiar un archivo utilizando la clave privada que está en la memoria, mediante Paramiko, una implementación de SSHv2 para Python.

    private_key_str = io.StringIO()
    # Write private key to a memory file
    private_key_str.write(private_key)
    
    # Create key object
    key = paramiko.RSAKey.from_private_key(private_key_str)
    
    # Open a channel and authenticate 
    trans = paramiko.Transport(ip, 22) 
    trans.start_client()
    trans.auth_publickey(user, key)
    del key        

Para demostrar la rotación de las claves SSH, tendrás que activar manualmente la función de rotación.

  1. Vuelva a la consola de AWS Secrets Manager, seleccione su secreto  /dev/ssh y seleccione Retrieve secret value para ver el keypair.
  2. Seleccione Rotate secret Immediately.  En la ventana emergente, confirme seleccionando Rotate.

    Figure 7: Set the "Secret value" and "Rotation configuration"
    Figura 7:  Obtenga el valor del secreto y rote el secreto

  3. Seleccione Rotate nuevamente para completar la rotación de claves.
    Figure 8: Select "Rotate"
    Figura 8: Seleccione Rotate
  4. Seleccione el botón Close para actualizar la página y, a continuación, vuelva a seleccionar Retrieve Secret Value.
  5. Una vez finalizada la rotación, podrá inspeccionar la nueva clave a través de la consola de AWS Secrets Manager. Regrese a la terminal y ejecute el mismo comando de python para copiar un archivo mediante SCP. Sustituya <ip-privado-nodo-auxiliar> por la IP de su nodo auxiliar:
                    python copy_file.py ec2-user <ip-privado-nodo-auxiliar>

El archivo se transfirió correctamente mediante un nuevo keypair, sin necesidad de actualizaciones.

Auditoría y monitoreo

Puede auditar y supervisar todas las llamadas a la API utilizadas para crear y rotar sus claves en AWS Secrets Manager a través de AWS CloudTrail. Para ver los eventos de CloudTrail, siga los pasos que se indican a continuación:

  1. Abra la consola de CloudTrail y seleccione Event history..
  2. En las opciones del campo Filter, seleccione Event source, coloque secret en el campo de filtro y, a continuación, seleccione amazonaws.com de la lista.
    1. Tras la búsqueda, puede revisar todos los eventos de AWS Secrets Manager, tales como GetSecretValue, PutSecretValue, UpdateSecretVersionStage (el método responsable de las staging labels que se aplican a cada versión de un secreto) y RotationSuccceed, en el historial de eventos de CloudTrail. Estos logs de eventos ayudan a auditar la configuración de secretos, rotaciones y accesos a clave.
      Figure 9: The "Event history" window
      Figura 9: Ventana del historial de eventos de CloudTrail

Además, AWS Secrets Manager puede trabajar junto con CloudWatch para disparar alertas  cuando se produce una operación de administrador específica en una organización (Por ejemplo, notificarle cuando se intenta eliminar un secreto).

Limpiar sus recursos a través de CloudFormation

Para eliminar todos los recursos creados mediante CloudFormation:

  1. Seleccione el Stack con el nombre RotateSSH en la consola de
  2. Seleccione Actions y, a continuación, Delete Stack. Esto eliminará todos los recursos de AWS creados por ese stack.
  3. Repita el mismo proceso descrito anteriormente para el stack con el nombre
  4. Desde la consola de AWS Secrets Manager, elimine el secreto /dev/ssh. Obtenga más información sobre el proceso de eliminación y restauración de secretos en la guía de usuario de AWS Secrets Manager

Conclusión

En esta publicación, demostramos cómo puede utilizar AWS Secrets Manager para almacenar, rotar y entregar una clave SSH a fin de garantizar una comunicación segura entre nodos de computo. Las claves se almacenan y cifran de forma segura en AWS Secrets Manager, el cual tambien hara la rotacion de las claves y el deploy de las claves públicas en todos los nodos auxiliares por usted. Con este método, no tendrá que hacer el deploy de manera manual de sus claves SSH en varias instancias de EC2 ni tampoco rotar las claves del mismo modo. Las llamadas de API utilizadas en AWS Secrets Manager se registran en CloudTrail para su auditoría y monitoreo. Esta solución para rotar claves es una solución Serverless, no requiere servidores para mantener la solución y puede escalar rápidamente.

Si tiene algún feedback sobre este blog post, envíelo en los comentarios de abajo. Si tiene preguntas sobre este blog post, inicie un tema nuevo en el foro de AWS Secrets Manager.

 

Este artículo fue traducido del Blog de AWS en Inglés.


Sobre os autores

Assaf Namer

 

 

 

 

Maitreya Ranganath es Arquitecto de Soluciones centrado en seguridad. Disfruta ayudando a los clientes a resolver desafíos de seguridad y compliance, arquitecturas escalables y optimización de costos en AWS.

 

 

 

 

Revisores

Felipe Gonzales es Arquitecto de Soluciones para socios en AWS apoyando a los socios del sector público en su viaje a la nube de AWS. Con enfoque en seguridad perimetral e interés en arquitecturas resilientes e IoT.

 

 

 

 

Marcelo Oliveira es Arquitecto de soluciones para socios en AWS apoyando a los socios del sector público en su viaje a la nube de AWS. Se centra en proyectos que involucran arquitecturas distribuidas y escalables, además de un gran interés en el área de infraestructura, redes y seguridad de la información.

 

 

 

 

Adrian Diaz se desempeña actualmente como Technical Account Manager, apoyando a clientes de Enterprise Support en su viaje a la nube de AWS. Cuenta con más de 15 años de experiencia en TI, habiéndose desempeñado como administrador de sistemas e ingeniero de infraestructura, en donde ha participado de proyectos de networking, telefonía IP, virtualización, migración de centro de cómputos, entre otros