从非Google系统调用时,CloudKMS加密/解密如何安全地工作?

时间:2018-05-01 13:37:47

标签: ruby encryption google-api-client google-api-ruby-client google-cloud-kms

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

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

我使用的是google-api-client gem(版本为0.10.3,发布时间为13个月,因为我在使用padrino-mailer时无法安装mime-types >= 3.0:请参阅this commit) ,测试了Google::Apis::CloudkmsV1::CloudKMSService方法encrypt_crypto_keydecrypt_crypto_key,并且它们运行良好。

我试过阅读google-api-clientgoogleauthsignet宝石的源代码。我所能确定的是:

  1. 加载了JSON密钥文件,private_key值用于生成OpenSSL::PKey::RSA.new here
  2. Signet::OAuth2::Clientthis file
  3. 中获得了signing_key的RSA密钥

    如果使用JSON密钥文件加密通过调用服务器上的encrypt_crypto_key发送的字符串,并且同样解密decrypt_crypto_key和CloudKMS服务器收到的字符串,我会考虑安全性。在另一端表现相似。这就是我假设的库 - 端到端加密 - 但我必须看到它相信它。我试图查看Wireshark中的流量,但对它没有任何意义(也许事实证明了这一点?我不知道)

    任何人都可以帮助我证明或反驳这种调用CloudKMS来加密/解密用户数据的方法 - 使用google-api-client gem下载的per the docs JSON密钥文件 - 是否安全?

    相关:对于您感兴趣的人,CloudKMS API on the roadmap包含在newer google-cloud gem中。

1 个答案:

答案 0 :(得分:3)

您的客户与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端点)。由于您的问题似乎是“这些请求是否在传输过程中是安全的,我如何才能显示”,我认为足以证明正在协商TLS连接,Wireshark应该能够向您展示这一点。 (您的连接库还需要对所提供的证书进行适当的PKI评估;验证这是正确发生的更为复杂,但如果您调查正在使用的工具,那么信任是正确的,这是合理的。以及他们关于证书验证的断言。)

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