我有一个用Java编写的非常标准的应用程序,它还可以对DB运行查询。该应用程序位于GCP上,数据库位于Atlas上。
出于可以理解的原因,我不想在代码中保留DB的用户名和密码。
因此,我想到的选项1是将用户名和密码作为环境变量传递给GCP中的应用程序容器。
选项2是在GCP中使用Secret Manager,并将我的用户名和密码存储在那里,并将GCP凭据作为环境变量传递到GCP中的应用程序容器。
我的问题是,如果选项2有附加值,它的附加值是多少?从安全角度来看,选项2似乎更糟,因为如果某个黑客获得了谷歌凭据,它就可以访问存储在秘密管理器中的所有秘密。
我不知道什么是最佳做法,在这种情况下建议怎么做。谢谢你的帮助。
在GCP机密管理器中拥有凭据将帮助您在集中位置跟踪所有机密和更改,并从任何应用程序进行全局访问。
对于一个标准应用程序,其中一个JAVA连接到一个DB,可能不会增加太多值。
出于这个原因,你可以调查一下库伯内特的秘密。
如果你的应用程序位于GCP中,你不需要服务帐户密钥文件(这是你的安全问题,你是对的。我写了一篇关于这方面的文章(
TL;DR使用ADC(应用程序默认凭据(自动获取谷歌云组件上自动提供的服务帐户凭据(查看元数据服务器了解更多详细信息(。
然后授予此组件身份(默认情况下或用户定义,如果支持(,即服务帐户电子邮件,以访问您的机密。
仅此而已!您的代码和环境变量中没有秘密,登录名/密码和服务帐户密钥文件都没有。
如果您在Java中使用ADC有困难,请毫不犹豫地分享您的代码。我将能够帮助你实现这一目标
要在Google Cloud上使用Secret Manager,需要安装Secret Manager Java SDK库。本文档展示了如何开始使用Secret Manager API的云客户端库,您只需要转到Java部分。此库可帮助您访问密钥,以便应用程序可以使用它。
以下链接显示如何通过查看机密的元数据来获取有关机密的详细信息。请记住,查看机密的元数据需要机密、项目、文件夹或组织上的"机密查看器"角色(roles/secretmanager.viewer
(。
我建议您创建一个特殊的服务帐户来处理应用程序的适当权限,因为如果您没有定义SA,则默认SA将生成请求,并且它不安全。你可以在这个链接中了解更多关于如何创建服务帐户的信息
另一方面,您可以找到一个如何使用以下指南的示例,其中包含一个自动查找凭据的好示例,这比手动传递凭据更方便、更安全。