【问题标题】:Set GOOGLE_APPLICATION_CREDENTIALS securely安全地设置 GOOGLE_APPLICATION_CREDENTIALS
【发布时间】:2020-04-07 20:32:34
【问题描述】:

我正在尝试以安全的方式使用 Google 云服务。我目前正在通过 putenv('GOOGLE_APPLICATION_CREDENTIALS=JSON 文件的路径'); 提供我的凭据。见https://cloud.google.com/docs/authentication/production

我想通过将我的代码放在共享主机/虚拟 Linux 服务器上进行公开测试。但是,如果我将 JSON 文件的权限设置为安全,则无法访问它们。如果我公开,我需要包含的 JSON 文件有一个纯文本的私钥。

我已经进行了一个小时的搜索,但找不到我应该如何安全地提供凭据。

  • 我应该将文件放在我的服务器上的安全位置吗?
  • 生产网站是否可以将公共 URL 传递给 putenv?

【问题讨论】:

    标签: php security google-cloud-platform google-cloud-iam


    【解决方案1】:

    您的问题没有简单的答案。

    第 1 部分 - 您的主机不在 Google Cloud 上

    您的主机安全吗?如果是,则可以将服务帐户 JSON 密钥放置在您的面向公众的应用程序无法访问的目录中。这里我的意思是不要将文件放在与您的网络服务器相同的目录中。使用/config 之类的位置,然后加强该目录的安全性,以便只有授权用户和您的应用程序才能读取该文件。

    确定凭据文件的安全文件位置后,请直接在代码中指定该服务帐户。不要使用环境变量或命令行开关。不要使用GOOGLE_APPLICATION_CREDENTIALS。一些 cmets 将使用 KMS。使用 KMS 是一个好主意,但是您遇到了先有鸡还是先有蛋的情况。您需要凭据才能使用 KMS 解密。如果不法分子可以访问您的加密凭据,他们也可以访问您的源代码,或对应用程序进行逆向工程,以查看解密方法和用于解密的服务帐户。

    注意:为凭据文件指定静态位置并不是 DevOps 的最佳实践。您的问题是关于安全性而不是 CI/CD。您正在使用共享服务器,这可能意味着很多事情,并且 DevOps 可能没有集成到您的部署或系统设计中。

    如果您的主机不安全,那么您就没有可行的选择。任何事情都无法阻止“熟练”工程师扭转您的“遮蔽”方法。

    第 2 部分 - 您的主机位于 Google Cloud 上(Compute Engine、Cloud Run、App Engine 等)

    注意:以下技术处于测试阶段。这是谷歌云授权的未来,它是基于身份的访问控制,以补充基于角色的访问控制,并在某些情况下取代它。

    您可以为主机分配零权限的服务帐户。请注意“分配”一词,而不是“创建”。不涉及文件。然后您可以使用基于身份的访问控制(服务账户的 IAM 成员账户 ID)来访问资源。我为 Google Cloud Run 写了两篇文章,适用于其他 Google 服务(Compute Engine、Cloud Functions、KMS、Cloud Storage、Cloud Scheduler 等):

    【讨论】:

    • 您的网站已关闭:s
    • @Ben - 我刚刚检查了一下,它已经启动了。你能帮我复查一下吗?
    • @Ben - Stackdriver 显示该站点已从太平洋标准时间晚上 11 点左右开始多次重启,每次站点关闭大约 6 分钟。可能是 Google 维护(我希望如此)。
    • 可以确认,已启动
    • 我的站点在负载均衡器、CDN、自动缩放等之后,除了过去两天正在完成一些站点工作。我的流量如此之大,以至于我需要大型 VM 实例、Cloud SQL 等。
    【解决方案2】:

    一种解决方案是将凭证 JSON(base64 编码)的内容放入服务器配置界面上的 ENV 变量中,然后我们从 ENV 变量启动服务器清单文件。

    例如:echo $CREDENTIALS | base64 -d > /path/to/cred.json, 然后 export GOOGLE_APPLICATION_CREDENTIALS="*file_json_path"

    【讨论】:

    • 但是 cred.json 文件是否还需要存在于不安全的位置?这不是同样的问题吗?如上所述,这是一个共享虚拟主机。
    • 其他进程应该根本无法读取您的资源。理想情况下,您的环境体现在 docker 或其他一些完全分离的环境中。此外,只有您和其他拥有权限的人也应该能够读取您的环境设置,因此这也是安全的。 (例如heroku)
    • Cloud Run 不建议使用此方法(请参阅cloud.google.com/run/docs/securing/…)。
    【解决方案3】:

    您可以在终端中使用“gcloud auth application-default login”来使用最终用户凭据进行身份验证。

    通过身份验证后,您可以使用任何 GCP 资源的默认服务对象。

    【讨论】:

    • 使用此方法将导致从库中打印警告消息。除本地测试外,请勿使用此方法。
    • 您可以将您的凭据存储在配置映射文件或 kms 中。
    • KMS 需要凭据才能访问您的加密凭据。
    【解决方案4】:

    您可以编辑 .bashrc 文件:export GOOGLE_APPLICATION_CREDENTIALS="*file_json_path" 然后使用:source .bashrc

    -- linux mint 19

    【讨论】:

      猜你喜欢
      • 2021-02-10
      • 2019-11-29
      • 1970-01-01
      • 2016-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      • 2023-03-15
      相关资源
      最近更新 更多