当前位置: 首页 > 知识库问答 >
问题:

如何实现零停机密钥循环

艾令雪
2023-03-14
    null

假设服务A需要服务B的密钥K:

  • 假设在开始时,K具有当前值K1和前一个值k0。
  • 服务A将始终在与B的通信中使用(并在本地缓存)AWSCURRENT版本的K,因此在本例中是K1
  • 服务B将在其本地缓存中保留AWSCORRENT和AWSPREVIVION版本,并接受[K1,K0]
  • 当旋转K时,我首先确保服务B使用的秘密被旋转,以便在经过刷新间隔后,服务B的所有实例接受[K2,K1]而不是[K1,K0]。在经过刷新间隔之前,A的所有实例仍使用k1.
  • 当刷新间隔已经过去时,这意味着B的所有实例都必须提取K2,我旋转服务键,这样A将使用K1或K2,直到刷新间隔已经过去,然后只使用K2。
  • 这就完成了密钥的旋转(但是如果K1被认为是被破坏的,我们可以再次旋转B的秘密来推出K1并得到[K3,K2])。

这是最好的方法还是有其他可以考虑的方法?

我可以在这里看到几种方法:

>

  • 用单独的旋转方案分裂成两个秘密,并一次旋转一个秘密,类似于上面。这增加了额外的秘密处理的开销,这些秘密的值相同(除了它们之间要旋转一段时间之外)

    在解密失败时,让解密强制刷新秘密:

    • 加密始终使用AWSCURRENT(J1或J2,取决于是否刷新)
    • 解密将尝试AWSCURRENT,然后尝试awspreviou,如果两者都失败(因为另一个实例使用了J2和[J1,J0]的加密被存储),将请求手动刷新机密([J2,J1]现在被存储),然后再次尝试AWSCURRENT和AWSPREVIOUS。

    还有什么选择?这似乎是一个标准的用例,但我仍然在努力寻找最好的方法。

    编辑--------------

    根据Joeb的回答,我到目前为止提出的算法是这样的:假设最初秘密的当前值为K1,待定值为null。

      null
      null

    这应该适用于单独的秘密和用于加密和解密的对称秘密。

    不幸的是,我不知道如何使用内置的循环机制,因为它需要几个步骤,中间有延迟。一个想法是发明一些自定义步骤,让setsecret步骤创建一个CloudWatch cron事件,该事件将在T秒后再次调用该函数,并用swappendingremovepending步骤调用该函数。如果SecretsManager能够自动支持这一点,那就太棒了,例如支持函数返回一个值,指示下一个步骤应该在T秒后调用

  • 共有1个答案

    农存
    2023-03-14

    对于您的凭据问题,只要服务B支持两个活动凭据,您就不必在应用程序中同时保留当前和以前的凭据。为此,您必须确保凭证在准备好之前不会被标记为AWSCURRENT。然后应用程序总是获取并使用AWSCURRENT凭据。要在循环λ中实现这一点,您可以采取以下步骤:

    1. 在secrets manager中使用stage标签awdending存储新凭据(如果在create上传递stage,则secret不标记为AWSCURRENT)。在创建机密时,还要使用提供给lambda的幂等性令牌,这样重试时就不会创建重复项。
    2. 获取存储在awsending阶段下的秘密管理器中的秘密,并将其作为证书添加到服务B中。
    3. 验证您可以使用awsending凭据登录到服务B。
    4. 将awscurrent凭据的阶段更改为awscurrent。

    这些步骤与secrets manager创建多用户RDS循环λ时所采取的步骤相同。一定要使用awsulting标签,因为secrets manager特别对待这一点。如果服务B不支持两个活动凭据或多个用户共享数据,则可能无法做到这一点。请参见秘密管理器的轮换文档。

    1. A获取阶段AWSCURRENT(由ARN和V1标识)的键J1。
    2. A使用密钥J1将数据D1加密为E1,并以消息M1(ANR,V1,E1)的形式发送给B。
    3. 稍后J1被旋转到J2,而J2被标记为awscurrent。
    4. A获取阶段AWSCURRENT的键J2(由ARN和V2标识)。
    5. A使用密钥J2将数据D2加密为E2,并以消息M2(ANR,V2,E2)的形式发送给B。
    6. b接收M1并通过指定ARN,V1来获取密钥(J1),并解密E1以获得d1。
    7. b接收M2并通过指定ARN,V2来获取密钥(J2),并解密E2以获得D2。

    请注意,密钥可以由A和B缓存。如果要长期存储加密数据,则必须确保在加密数据不再存在或使用当前密钥重新加密之前不删除密钥。还可以通过传递不同的ARN,使用多个秘密(而不是版本)。

    另一种选择是使用KMS进行加密。服务A将发送加密的KMS数据密钥而不是密钥标识符以及加密的有效负载。B可以通过调用KMS来解密加密的KMS数据密钥,然后使用该数据密钥来解密有效载荷。

     类似资料:
    • 在Azure Portal>Key vaults>Secrets,我有json值的秘密(不是我创建的)。类似于: null 谢谢

    • 我使用bouncy-castle来实现SMIME(公钥加密)。要向多个收件人发送加密电子邮件,我选择了此方法

    • 我找到了几种解决方案,在这些方案中,我可以使用RSA提供程序用公钥加密消息,并用私有密钥解密消息。 但我想要的是用私钥加密,用公钥解密。 我想将公钥存储在我的应用程序中,并用私钥在我的dev机器上加密一个许可证,将其发送到应用程序,并让信息用公钥解密。

    • 我试图学习并在java中实现JWE来解决问题。我试图理解内容加密密钥是如何使用特定算法生成的(比如RSA-PKCS1\u 1.5)。 我知道如何使用密钥生成器生成一对密钥,然后使用公钥进行加密,使用私钥进行解密。此外,我知道如何通过给出声明来创建简单的JWT令牌,以及如何对其进行签名。我试着遵循以下步骤: 消息加密过程如下: 生成随机内容加密密钥(CEK)。CEK的长度必须至少等于所需加密密钥的长

    • 我计划在key vault上保留密钥,但我不清楚密钥和秘密的版本控制,我有一些关于Azure key vault上的key/Secret的版本控制的问题。 如何创建现有密钥的新版本? 是否可以解密用不同版本的相同密钥加密的数据? 是否可以为某个版本的密钥设置过期日期?

    • 正在尝试使用证书通过AD身份验证检索KeyVault机密。 创建KeyVault所引用的文档 代码失败 var result=等待上下文。AcquireTokenAsync(资源、断言专家) 包含:"密钥集不存在" 有时“指定的提供程序类型无效”发生错误,不确定问题出在哪里。