使用开放连接在AWS中旋转RDS机密



如果在RDS连接当前打开的情况下轮换机密,该连接是否仍然可以查询数据库,或者是否处于非活动状态?

当您更改密码时,大多数数据库,包括RDS中的所有数据库,都不会关闭会话/连接(例如,oracle的答案)。终止会话需要显式终止命令。

如果您使用Java和连接池管理器,则可以使用AWS提供的JDBC包装器在需要重新建立连接时自动获取最新密码。

我可以通过以下方式进行测试:

  • 构建MySQL RDS实例
  • 在Secrets Manager中存储主密码
  • 通过控制台设置单用户轮换
  • 使用MySQL CLI连接到数据库
  • 使用查询验证连接
  • 通过从CLI启动子shell来保持连接打开
  • 转储当前密码
  • 启动异步旋转并等待一段时间
  • 通过伪设新密码验证旋转
  • 退出子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)

如果轮换用户帐户的密码,则用户在获取新密码之前将无法启动与数据库的新连接。现有连接将继续工作。

一种常见的策略是拥有两个用户帐户(user1和user2),并按交错的时间表轮换密码。当客户端检测到user2并开始使用它时,user1的凭据仍然有效。请注意,要使其有效,客户端必须定期检查更新的凭据。

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

来自Secret Manager文档:

Secrets Manager可以按照指定的时间表自动为您轮换机密。如果选择存储用户或帐户的完整凭据集,而不是仅存储密码,则可以在不中断服务的情况下轮换凭据。如果只更改或轮换密码,则旧密码将立即作废,客户端必须立即开始使用新密码,否则将失败。如果您可以使用新密码创建一个新用户,或者至少在两个用户之间进行替换,则旧用户和密码可以继续与新用户并肩操作,直到您选择弃用旧用户为止。这为您提供了一个时间窗口,当您测试和验证新凭据时,所有客户端都可以继续工作。在您的新凭据通过测试后,您将提交所有客户端使用新凭据并删除旧凭据。

最新更新