Le Blog Amazon Web Services
Sécuriser les identifiants de base de données dans une fonction Lambda avec AWS Secrets Manager
En tant qu’architectes solution AWS, nous aidons régulièrement nos clients à concevoir des architecture et à déployer des applications métiers basées sur des APIs et des microservices qui s’appuient sur des service Serverless comme AWS Lambda et des base de données comme Amazon Relational Database Service (Amazon RDS). Nos clients peuvent bénéficier des avantages de ces services managés pour libérer leurs équipes d’opérations à réaliser sur l’infrastructure ainsi que des tâches communes d’administration comme le déploiement de correctifs de sécurité, la maintenance applicative ou les prévisions de capacités nécessaires au bon fonctionnement de leurs propres services.
Dans cet article, nous vous montrons comment utiliser AWS Secrets Manager pour sécuriser les identifiants de connexion à la base de données et comment les partager avec des fonctions Lambda qui les utiliseront pour se connecter et interroger le service Amazon RDS – sans avoir à inscrire en dur dans le code ces identifiants et sans avoir à les passer en variables d’environnement. Cette approche vous permet de sécuriser cette partie du code et ainsi de mieux protéger vos bases de données. Une bonne pratique consiste à changer régulièrement les identifiants ayant une durée de vie longue afin de s’assurer que l’accès reste bien sécurisé. La rotation manuelle des identifiants peut parfois être lourde et AWS Secrets Manager vous aide à gérer cette rotation pour votre base de données Amazon RDS.
Description de la solution
Dans cette exemple, nous allons utiliser un template AWS CloudFormation pour déployer les composants suivants afin de tester le point d’accès de l’API depuis votre navigateur :
- Une base de données RDS MySQL sur une instance
db.t2.micro
- Deux fonctions Lambdas avec les roles AWS IAM (AWS Identity & Access Management) et les politiques associées incluant l’accès à AWS Secrets Manager :
LambdaRDSCFNInit
: cette fonction Lambda va être exécutée immédiatement après la création de la stack CloudFormation. Elle va créer la table “Employees” dans la base de données et insérer 3 enregistrement exemples,LambdaRDSTest
: cette fonction va interroger la table “Employees” et renvoyer le nombre d’enregistrements de dans un chaine de caractères au format HTML,
- Une API RESTful sur AWS API Gateway avec une méthode “GET”.
Voici un diagramme d’architecture des ressources qui vont être crées avec le déploiement de la stack CloudFormation :
- Les clients appellent l’API RESTful hébergée par AWS API Gateway,
- API Gateway va exécuter la fonction Lambda
LambdaRDSTest
, - La fonction lambda
LambdaRDSTest
va récupérer les identifiants de la base de données en utilisant l’API de Secrets Manager, - La fonction Lambda va se connecter à la base de données RDS en utilisant les identifiants récupérées dans Secrets Manager et retourner les résultats de la requête.
Le code source de cet exemple est disponible sous Github : https://github.com/awslabs/automating-governance-sample/tree/master/AWS-SecretsManager-Lambda-RDS-blog.
Déploiement de la solution d’exemple
Configurer le lancement de la stack CloudFormation en cliquant sur le bouton “Launch Stack” ci-après. Si vous n’êtes pas identifié sur votre compte AWS, suivez la procédure qui vous sera proposée.
Par défaut, la stack sera déployée sur la region us-east-1. Si vous voulez deployer cette stack dans une autre région, télécharger le code depuis GitHub avec le lien présenté précédemment, placez le fichier du code de la lambda dans un bucket créé dans la région de votre choix et effectuez les changements nécessaires dans le template CloudFormation pour pointer vers le bucket S3 que vous avez créé. (Référez vous au guide de l’utilisateur de AWS CloudFormation pour des détails complémentaires sur la création de stacks avec la console AWS CloudFormation).
Ensuite, suivez les étapes suivantes pour exécuter la stack :
- Laissez la valeur proposée par défaut pour l’emplacement du template et cliquez sur Suivant.
- Dans la page des détails de la stack, les paramètres seront pré-renseignés, incluant le nom de la base de données et le nom de l’utilisateur de la base de données. Cliquez sur Suivant.
- Dans l’écran des options, cliquez sur Suivant
- Dans l’écran de confirmation finale, sélectionnez les 3 cases à cocher puis cliquez sur “Créer un jeu de modifications”
- Une fois le change set créé, cliquez sur “Executer” pour lancer la création de la stack
- La stack mettra entre 10 et 15 minutes a être créée. Une fois créée avec succès, sélectionnez l’onglet “Sorties” de la stack puis cliquez sur le lien.
Cette dernière action exécutera le code de la fonction Lambda, qui interrogera la table “Employees” de la base de données MySQL et retournera le résultat du comptage des enregistrements à l’API. Ce résultat sera proposé en retour de la requête à l’API dans l’écran suivant :
Votre stack est déployée avec succès et vous avez testé votre point d’accès à l’API incluant la fonction Lambda et la base de données RDS MySQL. La fonction lambda a réussi à communiquer avec la base de données et a été capable de renvoyer les résultats.
Que s’est-t-il passé durant la création de la stack ?
La stack CloudFormation a déployé une base de données RDS MySQL avec un mot de passe généré aléatoirement en utilisant un secret. Maintenant que le secret a été généré, la stack CloudFormation va utiliser une référence dynamique pour résoudre la valeur du mot de passe depuis Secrets Manager afin de créer l’instance RDS. La référence dynamique permet sous un format concis et puissant de spécifier des valeurs externes qui sont stockés dans d’autres services AWS, comme AWS Secrets Manager. Cette référence dynamique permet de garantir que CloudFormation n’enregistrera ou ne persistera pas la valeur résolue, gardant ainsi le mot de passe en sécurité. Le template CloudFormation va aussi créer une fonction Lambda pour activer la rotation automatique du mot de passe de la base de données RDS MySQL tous les 30 jours. La rotation des identifiants natifs améliore votre posture de sécurité en éliminant la nécessité de gérer manuellement les mots de passes durant son cycle de vie.
Voici la partie du code CloudFormation qui couvre ces points :
Vérification de la solution
Pour être certain que tous les éléments sont configurés correctement, vous pouvez inspecter le code de la fonction Lambda qui interroge la base de données en suivant les étapes décrites ici :
- Naviguez vers la page du service AWS Lambda depuis la console,
- Dans la liste des fonctions Lambda, cliquez sur la fonction avec le nom
scm2-LambdaRDSTest-...
- Localisez les variables d’environnements situés en bas de la page de détails. Aucun mot de passe de base de données n’est fourni à la fonction dans les variables d’environnements
Dans AWS Secrets Manager, vous pouvez également remarquer qu’un nouveau secret a été créé après l’exécution de la stack CloudFormation :
- Naviguez vers la page du service AWS Secrets Manager en disposant des droits nécessaires,
- Dans la liste des secrets, cliquez sur le secret le plus récent avec le nom
RDS-InstanceRotationSecret-....
- Vous pourrez visualiser les détails du secret et les information sur la rotation, comme le montre cette copie d’écran :
Conclusion
Dans cet article, nous avons abordé la gestion des secrets de bases de données avec AWS Secrets Manager et comment utiliser l’API de Secrets Manager pour récupérer ce secret dans une fonction AWS Lambda afin d’améliorer la sécurité de la base de données et ainsi protéger les informations sensibles. AWS Secrets Manager vous aide à protéger les accès à vos applications, services et ressources informatiques sans avoir à investir vous même dans la création d’une architecture de sécurisation de secrets et dans sa maintenance quotidienne. Pour démarrer avec le service, visitez la page du service Secrets Manager dans la console AWS. Pour en découvrir plus sur le service, visitez la page de documentation.
Si vous avez un retour à faire sur cette article, ajoutez un commentaire dans la section des commentaires ci-après. Pour toute question concernant l’implémentation de l’exemple décrit dans cet article, ouvrez un fil de discussion sur le forum Secrets Manager.
Vous voulez en savoir plus sur la sécurité sur AWS, rester à jour et connaître les nouveautés des services ? Suivez-nous sur Twitter.
Article original rédigé en anglais par Ramesh Adabala, et traduit par Vivien de Saint Pern, Senior Solutions Architect dans l’équipe AWS France.