GCP通过计算引擎的服务账户访问和存储密码凭证的正确方法。

问题描述 投票:1回答:1

"不要在源代码中嵌入与认证有关的秘密" - 时有所闻. 好吧,所以我用 钥匙管理服务秘密经理.

但后来, 我如何正确地从Compute Engine的虚拟机和我的本地开发环境访问存储在那里的秘密?

我可以想到两种方法。

  1. 使用 默认服务账户凭证但我如何在本地开发环境和本地Docker容器内部(即在计算引擎之外)访问秘密?

  2. 访问秘密的方法是使用 自定义服务账户但我需要把它的JSON键存储在某个地方,然后从我的代码中访问它。为此,我有两个选择。

    2.1. 把它和源代码一起存储,所以我把它放在开发机和Docker容器中。但这就违背了开头的声明 "不要在源代码中嵌入秘密.". 馊主意。

    2.2. 把它存储在我的开发机器上的某个地方。但是我的Docker容器如何访问它呢?我可以提供密钥作为Docker的秘密,但那岂不是又是一次的 "嵌入源代码"? 在我的虚拟机上启动容器后,我需要从某个地方提供那个秘密,然而又回到了秘密首先是如何到达虚拟机的问题。

我知道 应用程序默认凭证 (ADC)可以尝试使用选项 2,然后回退到选项 1 - 然而,我如何解决选项 2 的冲突?服务账户凭证应该放在哪里,才能在我的本地开发和本地容器中都可以访问--而不是在我的本地容器中。嵌入源码?

google-cloud-platform google-compute-engine gcloud credentials service-accounts
1个回答
1
投票

我发现了一个方法来使这个工作,(算是):

  • 在本地开发环境下,依靠 GOOGLE_APPLICATION_CREDENTIALS 来指向从GCP手动下载的服务账户凭证。

  • 在本地Docker容器上,提供相同的文件作为秘密。然后,我的应用程序搜索 /run/secrets/ 为它 GOOGLE_APPLICATION_CREDENTIALS 未设置。

  • 在 Compute Engine 虚拟机上,从 Google 存储桶中下载该文件(之前已上传)。鉴于使用的是默认的服务账户 如果没有指定其他凭证,我能够 gutils cp 该文件从一个桶中下载。然后把那个下载的文件作为秘密提供给容器。

不过,我还是不知道这样做是否是好的,因为从 没有嵌入到源代码中. 从桶里上传下载凭证,感觉也很手动。任何关于如何改进这种认证的提示都非常欢迎。


0
投票

你的云存储的想法是好的,可以满足你的需求;从虚拟机实例访问存储在Secret Manager上的秘密的最简单的方法是通过curl、gcloud命令或python脚本来访问。"访问一个秘密版本" 然后把它们作为一个短暂的变量存储在要使用的代码中。要使用的服务账户可以是CE默认的服务账户,只是要记住它必须有secretmanager.secretAccessor和or secretmanager.admin角色才能从SM中抓取它们。额外确保虚拟机实例对所有GCP资源有正确的API作用域,或者至少是安全API的作用域。

© www.soinside.com 2019 - 2024. All rights reserved.