Comment faire pivoter un secret AWS Secrets Manager pour un utilisateur de base de données qui nécessite une connexion SSL ?

Date de la dernière mise à jour : 15/10/2020

Ma fonction de rotation AWS Secrets Manager ne peut pas se connecter à une instance Amazon Relational Database Service (Amazon RDS) avec SSL. Je reçois un message d'erreur similaire à celui-ci :

« : setSecret: impossible de se connecter à la base de données avec le secret de secret précédent, actuel ou en attente »

Solution

Modifiez la fonction de rotation Lambda d'un utilisateur de base de données pour effectuer la rotation d'un secret pour un utilisateur de base de données qui requiert une connexion SSL. Cet exemple utilise une instance Amazon RDS MySQL Single User pour modifier le modèle RDS MySQL Single User. Pour utiliser une base de données RDS autre que RDS MySQL, consultez les modèles AWS que vous pouvez utiliser pour créer des fonctions de rotation Lambda.

Important :

Créer votre secret et activer la rotation automatique

1.    Ouvrez la console Secrets Manager, puis choisissez Stocker un nouveau secret.

Remarque : veillez à vous connecter à la même région que votre base de données MySQL Amazon RDS.

2.    Dans Select secret type (Sélectionner un type de secret), choisissez Credentials for RDS database (Informations d'identification de la base de données RDS).

3.    Saisissez le même nom d'utilisateur et le même mot de passe que ceux de l'utilisateur de base de données.

4.    Dans Sélectionner la base de données RDS à laquelle doit accéder ce secret, choisissez votre base de données MySQL Amazon RDS, puis Suivant.

5.    Saisissez un nom secret et une description, puis choisissez Suivant.

6.    Dans Configure automatic rotation (Configuration de la rotation automatique), choisissez Enable automatic rotation (Activer la rotation automatique).

7.    Dans Nouveau nom de fonction AWS Lambda, saisissez un nom, puis choisissez Suivant et Stocker.

Personnaliser la fonction de rotation Lambda pour se connecter à la base de données avec une connexion SSL

1.    Ouvrez la console AWS Lambda, puis choisissez Functions (Fonctions).

2.    Dans Function name (Nom de fonction), choisissez votre fonction RDS MySQL.

3.    En haut de la page en regard de ARN (Nom ARN), choisissez l'icône copy (copier).

4.    Téléchargez l’ensemble de certificats rds-combined-ca-bundle.pem dans Utilisation de SSL pour chiffrer une connexion à une instance de base de données..

Remarque : conservez le nom de fichier rds-combined-ca-bundle.pem et ne placez pas le fichier dans un répertoire.

5.    Ajoutez le fichier rds-combined-ca-bundle.pem à Lambda. Pour obtenir des instructions, consultez Création de fonctions à l'aide de l'éditeur de console AWS Lambda.

6.    Dans ambda_function.py, modifiez la ligne de code contenant « pymysql.connect » comme suit :

conn = pymysql.connect(secret_dict['host'], user=secret_dict['username'], passwd=secret_dict['password'], port=port, db=dbname, connect_timeout=5, ssl={'ca': './rds-combined-ca-bundle.pem'})

7.    Sélectionnez Enregistrer.

Exécuter la rotation manuelle du secret

1.    Exécutez la commande suivante pour répertorier les ID de version de votre secret :

Remarque : remplacez EXAMPLESECRETNAME par les variables de votre secret.

aws secretsmanager list-secret-version-ids --secret-id EXAMPLESECRETNAME

2.    À partir de la sortie, recherchez l'ID de version avec une valeur VersionStages de AWSPENDING. Exécutez la commande suivante pour retirer l'étiquette intermédiaire :

aws secretsmanager update-secret-version-stage --secret-id EXAMPLESECRETNAME --remove-from-version-id EXAMPLEVERSIONID --version-stage AWSPENDING

3.    Ouvrez la console Secrets Manager, puis choisissez votre secret.

4.    Dans Configuration de la rotation, choisissez Exécuter la rotation du secret immédiatement, puis choisissez Rotation.

Vérifier la connexion à la base de données pour votre utilisateur de base de données

Suivez les étapes 1 à 5 du Tutoriel : rotation d'un secret pour une base de données AWS afin d'installer le client MySQL et de récupérer le secret temporairement.

Remarque : remplacez l'étape 3 par la commande suivante :

mysql -h $endpoint --ssl-ca=EXAMPLEPATH/rds-combined-ca-bundle.pem --ssl-verify-server-cert -u $user -P $port -p$password