从非 Google 系统调用时,CloudKMS encryption/decryption 如何安全工作?

How does CloudKMS encryption/decryption work securely when being called from a non-Google system?

我需要知道发送到 Google CloudKMS 的 plaintext/ciphertext 和用于验证的 public/private 密钥在传输过程中是安全的,但是我不知道如何证明这一点。

根据 KMS docs,我创建了一个服务帐户,下载了 JSON 密钥文件,并通过环境变量 GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account-key.json.

连接了它

我正在使用 google-api-client gem (at version 0.10.3, released 13 months old, because I can't install mime-types >= 3.0 whilst using padrino-mailer: see this commit), have tested the Google::Apis::CloudkmsV1::CloudKMSService methods encrypt_crypto_key and decrypt_crypto_key,它们运行良好。

我已经尝试阅读 google-api-client, googleauth, and signet gem 的源代码。我唯一确定的是:

  1. 加载JSON密钥文件,private_key值用于制作OpenSSL::PKey::RSA.newhere
  2. Signet::OAuth2::Clientthis file
  3. 中被赋予 RSA 密钥 signing_key

如果 JSON 密钥文件用于加密调用服务器上通过 encrypt_crypto_key 发送的字符串,并且同样解密由 [=19= 接收的字符串,我认为安全性已得到证实],另一端的 CloudKMS 服务器的行为类似。这就是我假设图书馆所做的——端到端加密——但我必须亲眼所见才能相信它。我试图在 Wireshark 中查看流量,但无法理解它(也许事实证明了这一点?我不知道)

任何人都可以帮助我证明或反驳这种调用 CloudKMS 到 encrypt/decrypt 用户数据的方法 – 使用 google-api-client gem with a JSON key file downloaded as per the docs – 是安全的吗?


相关:对于那些感兴趣的人,CloudKMS API 是 on the roadmap to be included in the newer google-cloud gem

您的客户端与 Google 之间的通信通过 TLS 进行保护。您可以在 Wireshark 中看到通信在端口 443 上进行,并且协商了 TLS 连接。

您的请求已使用 OAuth 进行身份验证。在这种情况下(使用来自 GCP 外部的服务帐户),这是使用 Using OAuth 2.0 for Server to Server Applications:

中记录的流程完成的
  • 您有责任使用颁发给您希望断言的服务帐户的私钥来配置您的 GCP 外应用;
  • 然后使用该私钥 sign a JWT 并将其提交给 Google 的 OAuth 服务器;
  • Google 使用 OAuth 访问令牌进行回复,该令牌是标识相关服务帐户的不记名凭据;
  • 然后您将该访问令牌与您对 KMS 的请求一起提供,以将发出请求的实体标识为服务帐户并使用其权限;
  • KMS 和 GCP 然后使用该身份来评估 IAM 访问控制以确定特定操作是否获得授权。

这是端到端安全的(TLS 连接是端到端安全的,因为通信的各方——您的服务和 Google——是 TLS 端点)。由于您的问题似乎是 "are these requests secure in transit, and how can I show this",我认为这足以表明正在协商 TLS 连接,Wireshark 应该能够向您显示这一点。 (您的连接库还需要对提供的证书进行适当的 PKI 评估;验证这是否正确发生有点复杂,但如果您调查您正在使用的工具,相信正确发生是合理的以及他们关于证书验证的断言)。

衷心祝愿并感谢您使用 GCP 和 Cloud KMS。如果您还有其他问题,请告诉我们。