如果在与 RDS 的连接当前打开时轮换机密,该连接是否仍能够查询数据库,还是会变为非活动状态?
3 回答
如果您轮换用户帐户的密码,用户将被从数据库中切断,直到他们获取新密码。
一个常见的策略是拥有两个用户帐户(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 来保持连接打开
- 转储当前密码
- 启动异步轮换并稍等片刻
- 通过转储新密码来验证轮换
- 通过退出子外壳返回 CLI 中现有的 MySQL 连接
- 运行另一个查询
$ 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)
从 Secret Manager文档中:
Secrets Manager 可以按指定的时间表自动为您轮换您的密钥。如果您选择为用户或帐户存储一组完整的凭据,而不仅仅是密码,则可以轮换凭据而不会中断服务。如果您只更改或轮换密码,则旧密码会立即失效,客户端必须立即开始使用新密码,否则会失败。如果您可以改为使用新密码创建新用户,或者至少在两个用户之间交替使用,那么旧用户和密码可以继续与新用户一起使用,直到您选择弃用旧用户。这为您提供了一个时间窗口,当您测试和验证新凭据时,您的所有客户端都可以继续工作。在您的新凭证通过测试后,