4
votes

Rotation des secrets RDS dans AWS avec des connexions ouvertes

Si les secrets sont tournés alors qu'une connexion à RDS est actuellement ouverte, cette connexion pourra-t-elle toujours interroger la base de données ou deviendra-t-elle inactive?


0 commentaires

3 Réponses :


5
votes

Si vous modifiez le mot de passe d'un compte utilisateur, les utilisateurs seront exclus de la base de données jusqu'à ce qu'ils récupèrent le nouveau mot de passe.

Une stratégie courante consiste à avoir deux comptes utilisateur (utilisateur1 et utilisateur2) et à alterner leurs mots de passe selon un calendrier échelonné. Les informations d'identification de l'utilisateur1 continueront de fonctionner pendant que les clients détectent l'utilisateur2 et commencent à l'utiliser. Notez que pour que cela soit efficace, les clients devront vérifier périodiquement les informations d'identification mises à jour.

https://docs.aws. amazon.com/secretsmanager/latest/userguide/rotating-secrets-two-users.html


1 commentaires

Je pense que cette réponse est mal formulée. Il est vrai qu'après la rotation, toutes les demandes de connexion ultérieures devront récupérer le nouveau mot de passe. Cependant, les connexions existantes ne seront pas automatiquement fermées par le DB (voir ci-dessous).



3
votes

La plupart des bases de données, y compris toutes les bases de données dans RDS, ne fermeront pas les sessions / connexions lorsque vous modifiez un mot de passe (par exemple, consultez ceci réponse pour oracle ). La fin des sessions nécessite des commandes de terminaison explicites.

Si vous utilisez Java et un gestionnaire de pool de connexions, vous pouvez utiliser l'AWS fourni JDBC wrapper pour récupérer automatiquement le dernier mot de passe lorsque vos connexions doivent être rétablies.

Je peux tester ceci en:

  • Lancer une instance MySQL RDS
  • Stockage du mot de passe principal dans Secrets Manager
  • Configuration de la rotation mono-utilisateur via la console
  • Connectez-vous à la base de données avec l'interface de ligne de commande MySQL
  • Vérifier la connexion avec une requête
  • Gardez la connexion ouverte en démarrant un sous-shell depuis la CLI
  • Vider le mot de passe actuel
  • Lancez une rotation asynchrone et attendez un peu
  • Vérifiez la rotation en supprimant le nouveau mot de passe
  • Revenez à la connexion MySQL existante dans la CLI en quittant le sous-shell
  • Exécuter une autre requête
    $ mysql -h testdb -Dmysql -u root -p$(aws --region us-east-2 secretsmanager get-secret-value --secret-id testdb-root --query SecretString --output text | jq -r '.password')
       ...
    mysql> select user from user;
    +-----------+
    | user      |
    +-----------+
    | root      |
    | mysql.sys |
    | rdsadmin  |
    +-----------+
    3 rows in set (0.05 sec)

    mysql> \! bash
    $ # Show current password
    $ aws --region us-east-2 secretsmanager get-secret-value --secret-id testdb-root --query SecretString --output text | jq -r '.password'
    3%c70'-e9s<Dy5ecX-(0mV%&E6Y[<jnJ
    $ aws --region us-east-2 secretsmanager rotate-secret --secret-id testdb-root
       ...
    $ sleep 60 # Give rotation time to complete
    $ aws --region us-east-2 secretsmanager get-secret-value --secret-id testdb-root --query SecretString --output text | jq -r '.password'
    .z,B{,P]jE~pr3?0mZ5H,6rJi;aXrQVO
    $ exit
    mysql> select user from user;
    +-----------+
    | user      |
    +-----------+
    | root      |
    | mysql.sys |
    | rdsadmin  |
    +-----------+
    3 rows in set (0.05 sec)


5 commentaires

Après avoir exécuté un test, la réponse de @ myron-semack était correcte, la connexion a été coupée lors de la rotation du mot de passe.


Quel type de base de données RDS avez-vous utilisé pour cela? Avez-vous également utilisé la configuration Lambdas de rotation standard par la console Secrets Manager?


J'ai édité ma réponse. Je n'obtiens pas les mêmes résultats lorsque je teste cela avec une instance MySQL RDS.


nous avons utilisé une instance RDS postgres avec la rotation standard, cependant, nous n'utilisions pas le wrapper JDBC. C'est probablement la direction dans laquelle nous allons maintenant, merci pour l'info!


J'ai relancé le test ci-dessus avec une instance RDS postgres 10.4 en remplaçant psql -h testdb ... -U root -d postgres pour la CLI et SELECT datname FROM pg_database; pour la requête. Encore une fois, je ne vois pas la connexion se réinitialiser / se fermer. Est-il possible que vous ayez idle_in_transaction_session_timeout défini ou votre code est en quelque sorte fermeture des connexions entre les commits?



1
votes

Depuis la documentation de Secret Manager: < / p>

Secrets Manager peut automatiquement faire pivoter votre secret pour vous selon un calendrier spécifié. Vous pouvez faire pivoter les informations d'identification sans interrompre le service si vous choisissez de stocker un ensemble complet d'informations d'identification pour un utilisateur ou un compte, au lieu du mot de passe uniquement. Si vous modifiez ou modifiez uniquement le mot de passe, l'ancien mot de passe devient immédiatement obsolète et les clients doivent immédiatement commencer à utiliser le nouveau mot de passe ou échouer. Si vous pouvez à la place créer un nouvel utilisateur avec un nouveau mot de passe, ou au moins alterner entre deux utilisateurs, alors l'ancien utilisateur et le mot de passe peuvent continuer à fonctionner côte à côte avec le nouveau, jusqu'à ce que vous choisissiez de désapprouver l'ancien. Cela vous donne une fenêtre de temps pendant laquelle tous vos clients peuvent continuer à travailler pendant que vous testez et validez les nouvelles informations d'identification. Une fois que vos nouvelles informations d'identification ont réussi le test, vous engagez tous vos clients à utiliser les nouvelles informations d'identification et à supprimer les anciennes informations d'identification.


1 commentaires

Il s'agit d'établir de nouvelles connexions. L'OP a posé des questions sur la connexion existante et la connexion existante n'est pas abandonnée par la base de données.