我有一个使用MongoDB的Java应用程序(或者它可以是任何类似的服务)。在启动时,该应用程序将创建与数据库的单例连接。为了进行连接,我从AWS Secrets Manager获得了MongoDB ...因此与MongoDB通信之后,该应用程序运行异常。
我的问题是:AWS Secrets Manager旋转键时会发生什么?
例如轮播设置为7天。因此,我在我的应用中编写代码,每隔7天刷新一次……不好,因为很难精确计时。
另一种方法是,如果我的应用程序遇到身份验证异常,只需刷新密码并建立新连接并重试应用程序逻辑即可。
什么是行业标准?
答案 0 :(得分:1)
我的应用程序如何“知道”秘密已被旋转?
-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设置作为规则的目标,并在旋转成功后执行您想要的任何逻辑
答案 1 :(得分:1)
通常使用两种策略之一来解决此问题,或者在Secrets Manager speak中通过使用单用户轮换或多用户轮换来解决。 Secrets Manager为MongoDB的single和multi user轮换提供lambda实现。
在单用户轮换中,有一对DB用户/密码。在轮换期间,可以使用原始用户名/密码或通过获取主用户凭据并使用这些凭据来更新密码来更新密码。在这种情况下,使用旧凭据建立的任何连接在旋转后都会失败。为了解决这个问题,应用程序将使用连接管理器,该管理器检测到身份验证错误(或所有错误,如果需要),并在重试之前刷新机密。这是Secrets Manager provided JDBC wrapper使用的策略。
另一种选择(多用户轮换)是从原始密码中读取用户名,然后在第一次轮换中,使用主用户密码使用新密码创建该用户的克隆。之后,轮换包括在原始密码和克隆密码之间交替使用秘密用户/密码对并更新密码。在这种情况下,应用程序仅需要在轮换间隔中刷新一次机密。如果使用的是旧的用户名/密码对,它将在两个旋转间隔内保持有效。
如果您在AWS上使用MongoDB(与具有Mongo兼容性的DocumentDB并置),最简单的方法是启动一个临时DocumentDB并使用Secrets Manager控制台对其进行设置。然后在关闭DocumentDB实例之前,复制用于Mongo应用程序的Lambda,角色和策略以及机密。如果您已经在使用DocumentDB,则如前所述,只需使用SecretsManager控制台进行设置即可。