Rotating RDS secrets in AWS with open connections
如果在与RDS的连接当前打开时轮换秘密,该连接是否仍能查询数据库,还是会变为非活动状态?
如果您旋转用户帐户的密码,将从数据库中删除用户,直到他们获取新密码。
一种常见的策略是拥有两个用户帐户(user1和user2)并按交错的时间表轮换密码。当客户端检测到user2并开始使用它时,user1的凭据仍然有效。请注意,为了使此操作有效,客户端必须定期检查更新的凭据。
https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets-two-users.html
大多数数据库(包括RDS中的所有数据库)在更改密码时都不会关闭会话/连接(例如,请参阅oracle的此答案)。终止会话需要显式终止命令。
如果您使用的是Java和连接池管理器,则可以使用AWS提供的JDBC包装器在需要重新建立连接时自动获取最新密码。
我可以通过以下方式测试:
- 启动MySQL RDS实例
- 在Secrets Manager中存储主密码
- 通过控制台设置单用户旋转
- 使用MySQL CLI连接到数据库
- 验证与查询的连接
- 通过从CLI启动子shell来保持连接打开
- 转储当前密码
- 启动异步旋转并稍等片刻
- 通过dummping新密码验证轮换
- 通过退出子shell返回CLI中的现有MySQL连接
- 运行另一个查询
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | $ 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) |