如何使用通过 AWS Secrets Manager 的密钥轮换创建的新密钥

How to use new secret created by key rotation from AWS Secrets Manager

我有一个使用 MongoDB 的 Java 应用程序(或者它可以是任何类似的服务)。在启动时,该应用程序会创建一个到数据库的单例连接。为了连接,我从 AWS Secrets Manager 获得了 MongoDB... 因此应用程序在与 MongoDB.

通信后一直愉快地运行

我的问题是:AWS Secrets Manager 轮换密钥时会发生什么情况?

例如轮换设置为 7 天。所以我在我的应用程序中编写了每 7 天刷新一次的代码......不好,因为很难精确计时。

另一种方法是,如果我的应用程序面临身份验证异常,只需刷新密码并建立新连接并重试应用程序逻辑。

行业标准是什么?

我的应用程序如何 'know' 秘密已轮换?

-AWS Secrets Manager 发布 CloudTrail 事件 - 'RotationSucceeded' 轮换成功,cloudtrail 事件 'RotationFailed' 轮换失败。您可以在此 cloudtrail 事件上设置 cloudwatch 规则 - https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/Create-CloudWatch-Events-CloudTrail-Rule.html

并将 SNS 或 Lambda 设置为规则的目标,并在轮换成功后执行您想要的任何逻辑

这通常使用两种策略中的一种来处理,或者在 MongoDB 的 Secrets Manager speak, by using single user rotation or multi user rotation. Secrets Manager provides lambda implementations for both single and multi user 轮换中处理。

在单用户轮换中有一对 DB user/password。在轮换期间,使用原始 user/password 或通过获取主用户凭据并使用这些凭据更新密码来更新密码。在这种情况下,使用旧凭据建立的任何连接在轮换后都会失败。为了处理这个问题,应用程序将使用一个连接管理器来检测身份验证错误(或所有错误,如果需要的话)并在重试之前刷新密码。这是 Secrets Manager provided JDBC wrapper.

使用的策略

另一种选择(多用户轮换)是从原始密码中读取用户名,然后在第一次轮换时使用主用户密码创建该用户的克隆。之后轮换包括交替原始和克隆之间的秘密 user/password 对和更新密码。在这种情况下,应用程序只需要在轮换间隔内刷新一次秘密。如果它使用旧的 user/password 对,它将在两个旋转间隔内保持有效。

如果您在 AWS 上使用 MongoDB(相对于具有 Mongo 兼容性的 DocumentDB),最简单的方法是启动一个临时 DocumentDB 并使用 Secrets Manager 控制台进行设置旋转。然后在拆除 DocumentDB 实例之前,为您的 Mongo 应用程序复制那里使用的 Lambda、角色和策略以及秘密。如果您已经在使用 DocumentDB,那么如前所述,只需使用 SecretsManager 控制台进行设置。