1
3
对于凭证问题,只要服务B支持两个活动凭证,就不必在应用程序中同时保留当前和以前的凭证。要做到这一点,您必须确保凭证在准备就绪之前没有标记为“当前”。然后应用程序总是获取并使用当前凭证。要在旋转lambda中执行此操作,请执行以下步骤:
这与Secrets Manager在创建多用户RDS旋转lambda时所采取的步骤相同。一定要使用awspending标签,因为Secrets Manager会专门处理这个问题。如果服务B不支持两个活动凭据或多个用户共享数据,则可能无法实现这一点。见 secrets manager rotation docs 对此。 此外,Secrets Manager旋转引擎是异步的,将在失败后重试(这就是为什么每个lambda步骤必须是等幂的)。有一组初始的重试(大约5次),之后每天都有一些重试。您可以利用这一点,通过异常使第三步(测试秘密)失败,直到满足传播条件为止。或者,您可以将lambda执行时间增加到 15 minutes 并休眠适当的时间,等待传播完成。不过,睡眠法的缺点是不必要地占用资源。 请记住,一旦拆下挂起的阶段或移动到挂起的阶段,旋转引擎将停止。如果应用程序B接受当前和挂起(或当前、挂起和上一个,如果您想更加安全),那么如果您添加所描述的延迟,上述四个步骤将起作用。你也可以看看 AWS Secrets Manager Sample Lambdas 有关如何操作阶段以进行数据库旋转的示例。 对于您的加密问题,我看到的最好的方法是用加密数据存储加密密钥的标识符。因此,当您使用键j1加密数据d1时,您要么存储数据,要么以其他方式传递给下游应用程序,比如将secret arn和version(比如v)传递给应用程序。如果服务A在消息M(…)中向服务B发送加密数据,它的工作方式如下:
请注意,A和B都可以缓存密钥。如果要长期存储加密数据,则必须确保在加密数据不再存在或用当前密钥重新加密之前,不会删除密钥。您还可以通过传递不同的ARN来使用多个机密(而不是版本)。 另一种选择是使用 KMS 用于加密。服务A将发送加密的KMS数据密钥,而不是密钥标识符以及加密的有效负载。加密的KMS数据密钥可以由B通过调用KMS来解密,然后使用数据密钥来解密有效负载。 |