使用开放连接在 AWS 中轮换 RDS 机密

foo*_*baz 5 amazon-web-services amazon-rds aws-secrets-manager

如果在当前打开与 RDS 的连接时轮换机密,该连接是否仍然能够查询数据库,还是会变为非活动状态?

myr*_*ack 5

如果您轮换用户帐户的密码,则用户将被从数据库中切断,直到他们获取新密码。

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

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

  • 我相信这个答案是错误的措辞。确实,在轮换之后,任何后续连接请求都需要获取新密码。但是,数据库不会自动关闭现有连接(见下文)。 (3认同)

Joe*_*oeB 5

大多数数据库,包括 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)

Run Code Online (Sandbox Code Playgroud)