如何在 Google App Engine 中设置环境变量/应用程序机密

Posted

技术标签:

【中文标题】如何在 Google App Engine 中设置环境变量/应用程序机密【英文标题】:How to set environment variables/app secrets in Google App Engine 【发布时间】:2017-08-10 02:05:38 【问题描述】:

问题是如何设置应用程序机密以使其在application.yml中可用

在 heroku 上,我只是通过为 dyno 设置环境变量来完成它,并将其访问为:

server:
  port: $PORT
security:
  user:
    password: $USERPASSWORD

eureka:
  client:
    register-with-eureka: false
    fetch-registry: false
  instance:
    hostname: localhost
    securePortEnabled: true
  password: $EUREKAPASSWORD

如何在 Google App Engine 中实现这一点?我正在尝试使用datastore

不幸的是,我不知道如何将这些值注入到我的 *.yml 文件中。

编辑:

还有一件更重要的事情要补充。我正在使用 maven appengine 插件通过 CI 管道部署我的应用程序,因此我无法将 app.yaml 文件推送到 App Engine

【问题讨论】:

*.yml 指的是 GAE 服务的 .yaml GAE 基础设施本身使用的配置文件吗?或者其他一些.yml 文件,您的应用启动后为了执行某些功能而读取? 你好。我正在使用 maven appengine 插件,所以我不会将 app.yaml 文件推送到 Google。即使我会这样做,保存在此类文件中的变量也不是保密的 :)。我已经相应地编辑了我的问题。 正如我所说,如果我将密码存储在文件中,它就不再是秘密了。另一方面:这里你得到了一些关于 appengine 插件的东西:cloud.google.com/appengine/docs/standard/java/tools/maven 对不起,我不明白您想如何使用该秘密信息,恕我直言,这对于能够评论 的方法至关重要存储它。你需要澄清这一点。你提到的application.yml到底是什么? docs.spring.io/spring-boot/docs/current/reference/html/… application.yml 是 spring-boot 应用程序的配置文件。在该文件中,我可以指定应用程序应在哪个环境变量下查找给定值(即:$somePassword)。 somePassword 的值我想在 GAE 上设置 不将其存储在存储库或任何本地文件中 【参考方案1】:

最好和最安全的方法是使用 GCP KMS 或一些第三方机密管理器产品,例如 vault。

GCP 知识管理系统

    我们需要使用具有加解密权限(角色)的服务帐号来加密凭证(秘密)文件。 将加密的凭证文件上传到 GCS 从 GCS 获取加密的凭据并在运行时在您的应用程序代码中对其进行解密和解析(例如解析为纯 java 对象)。

数据存储

是的。我们可以将凭证/秘密环境变量存储到数据存储中,并在运行时在应用程序代码中获取它们。

优点:

    简单 几乎可以在任何地方使用,GAE标准环境、GAE柔性环境、GCE、GCF、GKE、Cloud Run。

缺点:

    安全性不如 KMS。

GCE 元数据

我曾经使用 GCE 元数据服务器来存储我的秘密环境变量。

优点:

    支持GAE、GCE、GKE。

    非常简单。我们只需要发送 HTTP 请求到http://metadata.google.internal/computeMetadata/v1/ 端点来获取我们的自定义元数据(秘密环境变量)。

缺点:

    去年,GCE 元数据不支持 Cloud Function。 (运行时:nodejs10)。我无法从云函数中的 GCE 元数据中获取我的自定义机密环境变量。但是可以获取内置元数据,例如projectId

    安全性不如 KMS。

configmap 和 secrets(仅适用于 GKE)

可以进行简单的 base64 加密。使用难度中等。安全性不如 KMS。

另一种破解方式

我也在这里为这个问题创建一个帖子:How to pass system environment variables to app.yaml?

是的,Linux 脚本方式无所不能。但我不喜欢这些 hack 方式。

【讨论】:

Google 现在有一个叫做 Secret Manager 的东西(测试版):cloud.google.com/secret-manager/docs【参考方案2】:

Google 还有一个关于如何存储加密机密的教程。 https://cloud.google.com/kms/docs/store-secrets

TLDR:用于存储加密机密的单独存储桶,实例在需要时下载它,使用 Google KMS (https://cloud.google.com/kms/) 解密并随后删除。

【讨论】:

【参考方案3】:

如果您想存储应用程序在运行时可用的秘密,将它们保存在数据存储区中并不是一个坏主意。我知道有很多应用可以做到这一点。

这是一个app used by the Khan Academy,它是在数据存储中存储秘密凭据的一个很好的例子。它是用 Python 编写的,但您可以大致了解一下。请注意,在 first admin login 上,它会提示您输入要存储的秘密。

【讨论】:

以上是关于如何在 Google App Engine 中设置环境变量/应用程序机密的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 Google App Engine 中设置会话 cookie 路径?

Cron Job-具有Google App Engine的纯Django项目

Google App Engine - 多个域

Google App Engine Node.js 应用程序 - “解析 app.yaml 时出错:未知 url 处理程序类型”

如何在 SQLAlchemy 中设置连接超时

Google Compute Engine:如何从外部提出请求?