Blog de Amazon Web Services (AWS)

Rote automáticamente las credenciales de la base de datos en Amazon RDS con AWS Secrets Manager

Por Apurv Awasthi

AWS Secrets Manager  es un servicio que facilita la rotación, la administración y la recuperación de las credenciales de bases de datos, las claves de API y otros secretos a lo largo de su ciclo de vida. Puede configurar AWS Secrets Manager para que rote automáticamente los secretos, lo que puede ayudarle a satisfacer sus necesidades de seguridad y cumplimiento. AWS Secrets Manager ofrece integraciones para MySQL, PostgreSQL y Amazon Aurora en Amazon RDS y puede rotar las credenciales de estas bases de datos de forma nativa. Puede controlar el acceso a sus secretos mediante políticas detalladas de  AWS Identity and Access Management (IAM). Para recuperar los secretos, los empleados sustituyen los secretos almacenados en texto plano por una llamada a las API de AWS Secrets Manager, lo que elimina la necesidad de codificar los secretos en el código fuente o actualizar los archivos de configuración y volver a implementar el código cuando se rotan los secretos.En esta publicación, se presentan las características principales de AWS Secrets Manager así como  el procedimiento para almacenar una credencial de base de datos para una base de datos MySQL alojada en Amazon RDS y cómo sus aplicaciones pueden acceder a ese secreto. Por último, se muestra cómo configurar AWS Secrets Manager para rotar este secreto automáticamente.

Características principales de AWS Secrets Manager

  • Rote los secretos de forma segura. Puede configurar AWS Secrets Manager para que rote automáticamente los secretos sin interrumpir sus aplicaciones. AWS Secrets Manager ofrece integraciones para bases de datos de Amazon RDS para MySQL, PostgreSQL y Amazon Aurora. Puede ampliar AWS Secrets Manager para cumplir con sus requisitos de rotación personalizados mediante la creación de una función de AWS Lambda  para rotar otros tipos de secretos. Por ejemplo, puede crear una función de AWS Lambda para rotar los tokens de OAuth que se utilizan en las aplicaciones móviles. Los usuarios y las aplicaciones pueden recuperar el secreto de AWS Secrets Manager, lo que elimina la necesidad de enviar secretos por correo electrónico a los desarrolladores o de actualizar y volver a implementar las aplicaciones después de que AWS Secrets Manager rote un secreto.
  • Proteja y administre los secretos de forma centralizada. Puede almacenar, ver y gestionar todos sus secretos desde AWS Secrets Manager. De forma predeterminada, AWS Secrets Manager cifra estos secretos con claves criptográficas que usted posee y controla. Mediante políticas de IAM detalladas, puede controlar el acceso a los secretos. Por ejemplo, puede solicitar a los desarrolladores que proporcionen un segundo factor de autenticación al intentar recuperar una credencial de base de datos de producción. También puede crear una etiqueta en los secretos para ayudarle a descubrir, organizar y controlar el acceso a los secretos que se utilizan en toda la organización.
  • Supervise y audite con facilidad. AWS Secrets Manager se integra con los servicios de registro y monitoreo de AWS para que pueda cumplir sus requisitos de seguridad y cumplimiento. Por ejemplo, puede auditar los registros de AWS CloudTrail para comprobar cuándo AWS  Secrets Manager ha rotado un secreto o configurar AWS  CloudWatch Events  para que le avise cuando un administrador elimine un secreto.
  • Pague por uso. Pague por los secretos que almacene en AWS Secrets Manager y por el uso de esos secretos; no hay contratos a largo plazo ni tasas de licencia.

Comience con AWS Secrets Manager

Ahora que conoce las funciones principales, le mostraremos cómo almacenar las credenciales de una base de datos MySQL alojada en Amazon RDS. Para demostrar cómo recuperar y utilizar el secreto, se utilizará una aplicación Python que se ejecute en Amazon EC2 y que requiera esta credencial de base de datos para acceder a la instancia de MySQL. Por último, le mostraremos cómo configurar AWS Secrets Manager para rotar automáticamente esta credencial de base de datos. Empecemos.

Etapa 1: Guarde el secreto en AWS Secrets Manager

  1. Abra la consola de AWS Secrets Manager y seleccione Guardar un nuevo secreto.
    Secrets Manager console interface
  2. Seleccione   Credenciales para la base de datos RDS dado que almacenaremos las credenciales de una base de datos MySQL alojada en Amazon RDS.  Para este ejemplo, almacene las credenciales del superusuario (superuser) de la base de datos.  Comience por proteger al superusuario, ya que es la credencial de base de datos más poderosa y tiene acceso total a la  base de datos.

    Nota: Para este ejemplo, necesitará permisos para almacenar secretos en AWS Secrets Manager.  Para conceder estos permisos, puede utilizar la política administrada AWSSecretsManagerReadWriteAccess. Consulte la documentación de AWS Secrets Manager para obtener más información sobre el permiso mínimo de IAM para almacenar un secreto.

  3. A continuación, revise la configuración de cifrado y elija utilizar la configuración de cifrado predeterminada.  AWS Secrets Manager cifrará este secreto con la clave DefaultEncryptionKey de esta cuenta.  También, puede optar por cifrar mediante una clave de KMS almacenada en AWS KMS
  4. A continuación, consulte la lista de instancias de Amazon RDS de la cuenta y seleccione la base de datos a la que pertenece esta credencial.  Para este ejemplo, seleccioné la instancia de base de datos mysql-rds-database, y a continuación, seleccione Siguiente.

    Select the RDS database interface

  5. En este paso, especifique los valores del  nombre y descripción del secreto.  Para este ejemplo, utilizamos el nombre Applications/MyApp/MySQL-RDS-Database e incluimos una descripción de este secreto. A continuación, seleccione Siguiente.

    Secret Name and description interface

  6. Para el siguiente paso, mantenga desactivada la rotación automática (configuración predeterminada), ya que el secreto es usado por la aplicación que se ejecuta en Amazon EC2. Tras actualizar la aplicación, habilitaremos la rotación (consulte la Etapa 2) para utilizar las API de AWS Secrets Manager a fin de recuperar los secretos. A continuación, haga clic en Siguiente.

    Nota: Si guarda un secreto que no está siendo usado en su aplicación, seleccione    Habilitar la rotación automática. Consulte nuestra guía de introducción a la rotación de secretos de AWS Secrets Manager para obtener más información.

  7. Revise la información en la siguiente pantalla y, si todo es correcto, seleccione Almacenar un nuevo secreto. Con esto, hemos completado correctamente el almacenamiento del secreto en AWS Secrets Manager.
  8. A continuación, seleccione la opción Ver código de ejemplo.
  9. Tome nota del código de ejemplo que aparece en la pestaña Python3.  Este código se utilizará para actualizar la aplicación a fin de recuperar el secreto mediante las API de AWS Secrets Manager.

Etapa 2: Actualice la aplicación para obtener el secreto a través de AWS Secrets Manager

Ahora que hemos almacenado el secreto en AWS Secrets Manager, actualizaremos la aplicación para recuperar la credencial de la base de datos en AWS Secrets Manager, en lugar de codificar esa información en un archivo de configuración o en el código fuente. En este ejemplo se muestra cómo configurar una aplicación de Python para recuperar ese secreto de AWS Secrets Manager.

  1. Conéctese a su instancia de Amazon EC2 mediante Secure Shell (SSH).
  2. Anteriormente, a aplicação foi configurada para obter o usuário e senha do banco de dados através de um arquivo de configuração. Veja abaixo o código utilizado pela aplicação.
    import MySQLdb
    import configdef no_secrets_manager_sample()# Recopila información sobre el usuario, la contraseña y la conexión a la base de datos de un archivo de configuración.
    database = config.database
    user_name = config.user_name
    password = config.password# Usa la información de usuario, contraseña y conexión a la base de datos para conectar la base de datos
    db = MySQLdb.connect(database.endpoint, user_name, password, database.db_name, database.port)
  3. Utilice el ejemplo de código copiado en la Etapa 1 y actualice la aplicación para recuperar el nombre de usuario y la contraseña a través de AWS Secrets Manager.  Este código configura el cliente, recupera y descifra el secreto Applications/MyApp/MySQL-RDS-Database.  Se han añadido comentarios al código para facilitar su comprensión.
    1. # Utilice el código proporcionado por Secrets Manager
      import boto3
      from botocore.exceptions import ClientError

    def get_secret():

    #Defina el secreto que quiere recuperar
    secret_name = "Applications/MyApp/MySQL-RDS-Database"
    #Define the Secrets mManager end-point your code should use.
    endpoint_url = "https://secretsmanager.us-east-1.amazonaws.com"
    region_name = "us-east-1"

    #Configuración del cliente
    session = boto3.session.Session()
    client = session.client(
    service_name='secretsmanager',
    region_name=region_name,
    endpoint_url=endpoint_url
    )

    #Use el cliente para recibir el secreto
    try:
    get_secret_value_response = client.get_secret_value(
    SecretId=secret_name
    )

    #Error handling to make it easier for your code to tolerate faults
    except ClientError as e:
    if e.response['Error']['Code'] == 'ResourceNotFoundException':
    print("The requested secret " + secret_name + " was not found")
    elif e.response['Error']['Code'] == 'InvalidRequestException':
    print("The request was invalid due to:", e)
    elif e.response['Error']['Code'] == 'InvalidParameterException':
    print("The request had invalid params:", e)
    else:

    #  Descifrar el secreto mediante la clave KMS asociada
    # Dependiendo de si el secreto es una cadena o un binario, se rellenará uno de estos campos
    if 'SecretString' in get_secret_value_response:
    secret = get_secret_value_response['SecretString']
    else:
    binary_secret_data = get_secret_value_response['SecretBinary']

    # Tu código va aquí.

  4. Adjunte la siguiente política al rol de IAM para conceder acceso a las aplicaciones para que utilicen AWS Secrets Manager. Recuerde que la aplicación se ejecuta en Amazon EC2 y usa un rol de IAM para acceder a los servicios de AWS.  Esta política utiliza la acción GetSecretValue para conceder permisos para leer el secreto en AWS Secrets Manager para la aplicación. Esta política también usa el ARN de recurso para limitar mi aplicación para leer solo el secreto de la base de datos Applications/MyApp/MySQL-RDS-Database  desde AWS Secrets Manager. Puede consultar la documentación de AWS Secrets Manager para conocer  los permisos mínimos de IAM necesarios para recuperar un secreto.
    {
    "Version": "2012-10-17",
    "Statement": {
    "Sid": "RetrieveDbCredentialFromSecretsManager",
    "Effect": "Allow",
    "Action": "secretsmanager:GetSecretValue",
    "Resource": "arn:aws:secretsmanager:::secret:Applications/MyApp/MySQL-RDS-Database"
    }
    }

Etapa 3: Activa la rotación de tu secreto

Rotar los secretos periódicamente es una buena práctica de seguridad, ya que reduce el riesgo de uso indebido de los secretos. AWS Secrets Manager facilita el seguimiento de estas prácticas recomendadas de seguridad y ofrece características integradas para rotar las credenciales de las bases de datos de MySQL, PostgreSQL y Amazon Aurora alojadas en Amazon RDS. Al habilitar la rotación, AWS Secrets Manager crea una función Lambda y le asigna un rol de IAM para ejecutar rotaciones con la frecuencia que usted defina.

Nota:Configurar la rotación es una acción privilegiada que requiere varios permisos de IAM y solo debe conceder ese acceso a personas de confianza. Para conceder estos permisos, puede utilizar la política administrada de AWS IAMFullAccess.

A continuación, le mostraremos cómo configurar AWS Secrets Manager para que rote automáticamente el secreto de la base de datos Applications/MyApp/MySQL-RDS.

  1. En la consola de AWS Secrets Manager, explore la lista de secretos y seleccione el secreto creado en la Etapa 1 Applications/MyApp/MySQL-RDS .
    List of secrets in the Secrets Manager console
  2. Navegue hasta la pantalla de configuración de rotación y haga clic en Editar rotación.
    Rotation configuration interface
  3. Para habilitar la rotación, active la opción Rotación automática.A continuación, seleccione la frecuencia con la que AWS Secrets Manager debe rotar el secreto.  Para este ejemplo, el intervalo de rotación se estableció en 60 días.
  4. A continuación, crearemos una función Lambda a través de AWS Secrets Manager para rotar el secreto. Para ello, seleccione la opción  Crear una función de rotación  y proporcione un nombre para esa función. En este caso utilizamos mysql-rotation-lambda. AWS Secrets Manager añadirá el nombre SecretsManager al principio del nombre de la función creada.
  5. En la opción Usar credenciales separadas para rotar este secreto, seleccione No,  dado que usaremos la misma credencial proporcionada en la Etapa 1. A continuación, haga clic en Guardar.
  6. El banner de la siguiente pantalla confirma que la configuración de rotación se ha realizado correctamente y que la primera rotación está en curso, lo que le permite comprobar que la rotación funciona según lo previsto.  AWS Secrets Manager cambiará esta credencial automáticamente cada 60 días.

Conclusión

En esta publicación, presentamos el servicio AWS Secrets Manager, donde explicamos las principales ventajas y cómo AWS Secrets Manager puede ayudar a cumplir con los requisitos de cumplimiento al configurar la rotación automática de las credenciales de la base de datos en su nombre. AWS Secrets Manager le ayuda a proteger el acceso a sus aplicaciones, servicios y recursos de TI sin la inversión inicial ni el costo de mantener el funcionamiento de su propia infraestructura de gestión de secretos. Para empezar a usar este servicio, visite  la consola de AWS Secrets Manager. Para obtener más información, consulte  la documentación de AWS Secrets Manager.

Si tiene comentarios sobre esta publicación, envíelos en la sección de comentarios que aparece a continuación. Si tiene preguntas sobre algún punto de esta publicación, inicie un tema nuevo en  el foro de AWS Secrets Manager.

 

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


Acerca del autor

Apurv Awasthi

 

 

 

 

Revisores

Verónica Ambrosio es Technical Account Manager (TAM) en México. Como parte del equipo de AWS Enterprise Support, proporciona apoyo y asesoramiento a los clientes para planificar y crear soluciones utilizando las mejores prácticas de AWS. Como TAM, presenta recomendaciones para optimizar y mantener los entornos de AWS en buen estado operativo, así como brindar ayuda con la administración y escalación de casos de soporte