3

我需要知道发送到 Google CloudKMS 的plaintext/ciphertext以及用于身份验证的公钥/私钥在传输过程中是安全的,但我不知道如何证明这一点。

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

我正在使用google-api-client gem(在0.10.313 个月前发布的版本,因为我mime-types >= 3.0在使用 padrino-mailer 时无法安装:请参阅此提交),已经测试了这些Google::Apis::CloudkmsV1::CloudKMSService方法encrypt_crypto_keydecrypt_crypto_key并且它们运行良好。

我尝试通读google-api-clientgoogleauthsignet gems 的源代码。我唯一确定的是:

  1. JSON密钥文件被加载,private_key值用于OpenSSL::PKey::RSA.new 这里
  2. Signet::OAuth2::Client给出了signing_key这个文件中的 RSA 密钥

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

谁能帮我证明或反驳这种调用 CloudKMS 来加密/解密用户数据的方法——使用google-api-client gem和根据文档下载的 JSON 密钥文件——是否安全?


相关:对于那些感兴趣的人,CloudKMS API 已在路线图中包含在较新的 google-cloud gem中。

4

1 回答 1

3

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

您的请求使用 OAuth 进行身份验证。在这种情况下(使用 GCP 外部的服务帐户),这是使用Using OAuth 2.0 for Server to Server Applications中记录的流程完成的:

  • 您负责使用颁发给您希望声明的服务帐户的私钥来配置您的非 GCP 应用程序;
  • 然后它使用该私钥签署 JWT并将其提交给 Google 的 OAuth 服务器;
  • Google 回复一个 OAuth 访问令牌,它是一个承载凭证,用于标识相关服务帐户;
  • 然后,您将该访问令牌与您对 KMS 的请求一起提供,以将发出请求的实体标识为服务帐户并使用其权限;
  • 然后,KMS 和 GCP 使用该身份来评估 IAM 访问控制,以确定是否授权特定操作。

这是端到端的安全性(TLS 连接是端到端的安全性,因为通信的各方——您的服务和 Google——是 TLS 端点)。由于您的问题似乎是“这些请求在传输过程中是否安全,以及如何显示这一点”,我认为足以表明正在协商 TLS 连接,Wireshark 应该能够向您展示这一点。(您的连接库还需要对所提供的证书进行适当的 PKI 评估;验证这是否正确发生有点复杂,但如果您调查您正在使用的工具,那么相信正确发生是一件合理的事情以及他们关于证书验证的断言)。

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

于 2018-05-01T14:24:21.970 回答