Blog de Amazon Web Services (AWS)
Rote automáticamente las credenciales de la base de datos en Amazon RDS con AWS Secrets Manager
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
- Abra la consola de AWS Secrets Manager y seleccione Guardar un nuevo secreto.
- 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. - 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
- 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. - 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. - 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.
- 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.
- A continuación, seleccione la opción Ver código de ejemplo.
- 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.
- Conéctese a su instancia de Amazon EC2 mediante Secure Shell (SSH).
- 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 config
def 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)
- 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.# 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í.
- 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
.
- 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
.
- Navegue hasta la pantalla de configuración de rotación y haga clic en Editar rotación.
- 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.
- 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.
- 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.
- 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