如何从 Google 云上的 Java 应用程序 运行 安全地引用 .json 私钥文件

How to securely reference a .json private key file from a Java app running on Google Cloud

我正在开发一个将 运行 在 Google 云平台上运行的应用程序,它需要向 Google Admin 'Directory' SDK 进行身份验证。每个人(包括 Google)似乎都建议的推荐方法是在 Google 云平台中创建一个服务帐户,并使用服务帐户的私钥凭据在 Google 的应用程序中进行身份验证=40=]宁 Google 云平台。这是 Google 推荐的方法:

Perform G Suite Domain-Wide Delegation of Authority

总结方法,对于 Java 应用程序,它需要以下内容:

我的问题是 - 如果文件直接上传到 Google 云平台上 运行 应用程序的 src/main/resources 文件夹,这是一个重要的安全措施风险?黑客访问该文件有多容易?如果存在风险,那么这种方法的安全替代方法是什么?

对于这个答案,我假设您 运行 使用 Google Compute Engine。相同类型的答案将适用于 App Engine、容器、Kubernetes 和 Cloud Functions。

My question is this - if the file is directly uploaded to the src/main/resources folder for the application that runs on the Google Cloud Platform, is this is a significant security risk?

这是一个安全风险,是一种非常糟糕的安全措施。许多知名公司都因存储在源代码中的凭据而遭到破坏。

How easy would it be for a hacker to access the file?

未知。有许多不同类型的违规行为。如果黑客获得 shell 访问您的实例的权限,那您就有大麻烦了。如果黑客获得 root shell 访问权限,他们几乎可以为所欲为。

If it's a risk, then what is a secure alternative to this approach?

关于凭据的安全最佳实践:不要将凭据存储在源代码或计算资源中。

通常您会从 Compute Engine 元数据服务器访问您的凭据。这些凭据由 Google Cloud 在您的实例启动时创建。您可以在 "Cloud API access scopes" 下的 Google 控制台中或通过您为 VM 指定的服务帐户控制这些权限。

但是,对于 G-Suite,您需要创建委托凭据。我不建议将您的 VM 使用的凭据与用于 G-Suite 的凭据混合使用。这意味着您仍然需要访问 Json 格式的凭据(或旧版应用程序的 P12)。

由于最佳安全做法是不要将这些凭据存储在源代码或实例中,因此您需要将它们安全地存储在您可以安全访问的其他地方。一种选择是 Google 云存储。为您的实例分配一个 Cloud Storage 只读范围,以便您可以从 Cloud Storage 读取凭据 Json 文件。使用您的 SDK 直接将凭据读取到内存中,不涉及磁盘操作或实用程序,例如 gsutil。我建议您为凭证等特权文件创建一个单独的存储桶。

请注意,您正在使用多个凭据。 1) 存储在 Google 的元数据服务器中的凭据。 2) 您从 Cloud Storage 下载的凭据。 3) 您创建的用于访问 G-Suite 和其他 Google 应用程序的委托凭据。

第一组凭据(应用程序默认凭据 - ADC)用于正常的云访问,包括从云存储读取第二组凭据。第三组是在您的软件中创建的。

您存储在 Cloud Storage 上的凭据不需要任何权限,除了全域授权。当您创建 G-Suite 凭证(凭证 #3)时,权限是通过范围添加的。

注意:不要在源代码中存储用于委托凭据的电子邮件地址。将其存储在云存储上的另一个 Json 文件中。