如何使用Google Cloud KMS存储由其他应用程序生成的访问令牌?

时间:2018-02-14 11:56:59

标签: security encryption google-cloud-platform google-cloud-kms

我正在构建一个Node.js应用程序,该应用程序从我需要访问的另一个应用程序接收长期访问令牌。我不想直接在数据库中存储这些访问令牌,因为任何有权访问这些令牌的人基本上可以随心所欲地做任何事情。

我不熟悉Cloud KMS和这样的系统,但是花了最后几个小时来学习它。这似乎是解决我的问题的理想解决方案,但我不完全确定应该遵循哪种策略来存储这些访问令牌:

  1. 我是否应该在Cloud KMS中存储加密密钥,并将该加密密钥与this one等NPM软件包一起用于在我的数据库中存储访问令牌?
  2. 我应该直接在KMS中存储访问令牌吗?我的假设是,我会有一个钥匙库和钥匙每14天轮换一次。每当我收到访问令牌时,我只需加密它并将其存储在KMS中。我只将密文存储在我的数据库中。当我需要从KMS访问访问令牌时,我使用密文对其进行解密。
  3. 以上哪种方法是使用KMS的正确方法?如果是选项2,我还有其他问题:

    • 我是否可以使用单个密钥加密大量访问令牌,还是需要为每个访问令牌创建新密钥?
    • 如果我需要修改在KMS加密的访问令牌,我可以简单地修改它,还是需要销毁旧版本并再次加密?

    感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

我认为您最好的选择是使用Node.js API provided by Google加密令牌并将生成的密文存储在您的数据库中。

当应用程序从另一个应用程序接收到令牌时,它会使用API​​对其进行加密,并将其与数据库中的内容进行比较以查看它是否有效,这样纯文本令牌只有所有者知道。

  

我可以使用单个密钥加密大量访问令牌,还是需要为每个访问令牌创建新密钥?

您可以使用相同的密钥加密任意数量的令牌。为每个令牌创建一个密钥很快就会变得无法管理,除非他们自己关键,否则它会受到损害(很难想象只存储在Google上),没有明显的风险。

  

如果我需要修改在KMS加密的访问令牌,我可以简单地修改它,还是需要销毁旧版本并再次加密?

KMS不存储您的数据,无论是加密的还是纯文本的,它只是存储您加密或解密数据所需的KEY。

按照只存储令牌加密版本的方法,当你需要修改一个令牌时,它应该是这样的:

  • 客户端会向您发送需要撤销的令牌。
  • 您的应用程序对其进行加密,并将其与存储在数据库中的令牌进行比较
  • 生成新令牌(我理解的客户端应用程序?)
  • 将其发送到您的应用程序,并对其进行加密
  • 旧版本的令牌将替换为新版本
  • 客户端现在可以使用新令牌,因为它具有与之前相同的有效性。如果它试图使用旧令牌,因为它不再在数据库中,它将无法工作。

关于密钥轮换,当它发生时,新密钥将使用新密钥加密。旧令牌仍然是无法加密的,因为旧密钥仍然在KMS上,而不再用于加密。 但是,如果您销毁了加密的密钥,那么它们将无法恢复。

答案 1 :(得分:1)

您的选项2很好,只要访问令牌足够小就可以使用API​​加密(几千字节或更小)。您可以根据需要使用相同的密钥加密任意数量的令牌,而不会影响安全性。

除非您有特殊需要,否则14天的钥匙轮换似乎比必要时更频繁。

我不明白你的修改问题。如果您修改了访问令牌并希望保存修改后的版本,则应该使用密钥对其进行加密,然后保存加密数据。

答案 2 :(得分:0)

截至2019年12月,在Secret Manager上存储和管理机密信息的首选方式是:

$ echo -n "my-access-token" | gcloud beta secrets create "access-token" \
  --data-file=- \
  --replication-policy "automatic"

然后您可以从应用程序访问机密。这是Node的示例:

function getSecret() {
  const [version] = await client.accessSecretVersion({
    name:"projects/<YOUR-PROJECT-ID>/secrets/access-token/versions/1",
  });

  const auth = version.payload.data.toString('utf-8');

  // auth is "my-access-token"
  return auth
}

任何需要访问机密的服务都需要对机密拥有roles/secretmanager.secretAccessor权限。