通过在构建过程中使用gsutil构建器来获取app.yaml来保护GAE env变量?

时间:2019-02-05 23:21:25

标签: google-app-engine gsutil

我有一个与这里提到的问题相同的问题:Securely storing environment variables in GAE with app.yaml-即:

”“我需要将API密钥和其他敏感信息作为环境变量存储在app.yaml中,以便在GAE上进行部署。问题是,如果我将app.yaml推送到GitHub,则该信息将变为公开(而非好)。”

此外,我想检查以下框:

  • (尽可能防止供应商锁定)以及将我的dockerfile转移到其他地方的能力。
  • 易于使用GitHub进行部署。我想要推送到主控来触发构建。
  • 最少的设置,或者独立开发人员或小型团队的适当工作量和工作流程。

我的研究得出以下结论:

Securely storing environment variables in GAE with app.yaml

How to set environment variables/app secrets in Google App Engine

GAE : How to deploy various environments with secrets?

appengine and OS environment variables

How to pass environment variables to the app.yaml using cloud build

GAE : How to deploy various environments with secrets? 的许多有用信息,作者列出了三种解决方法及其不被使用的原因:

  • 使用Google KMS-允许我们将加密的机密直接放入 专案,但这需要我们在应用程式中加入自订程式码才能解密 他们。它在本地, 分期和生产。由于增加了错误的风险 复杂性。
  • 在Google数据存储区中存储机密-我尝试过,我创建了一个帮助程序 在proccess.ENV中搜索env vars,然后在缓存中搜索,最后 在数据存储区中。但是像KMS一样,它大大增加了复杂性。
  • 将机密存储在JSON文件中,然后放入Google Cloud Storage中:再次,它需要通过一个帮助程序来加载环境变量 检查环境变量,然后加载文件等...

然而,最适合我的解决方案来自How to pass environment variables to the app.yaml using cloud build

它允许我使用针对Node.js的GAE灵活环境进行以下部署:

  1. 与我的Github master分支合并将触发云构建
  2. 我的cloudbuild.yaml的第一步使用gsutil builder来获取app.yaml文件,因为app.yaml不在源代码管理中
  3. 我的app.yaml指向运行时的dockerfile并包含我的env变量

这会检查我的所有复选框,这是一个相当简单的解决方案,但,这绝对不是一个受欢迎的解决方案,所以我在这里错过了什么吗? < / p>

最重要的是是否有安全方面的顾虑?

2 个答案:

答案 0 :(得分:2)

我对您如何进行研究感到惊讶,您实际上收集了所有可能的方法来实现它。

正如您提到的,有很多方法可以将变量传递给应用程序,但是我认为您提出的解决方案(将变量存储在Google Cloud Storage中并通过Google Cloud Build检索它们)是您的最佳选择。它不需要太多的代码,而且很优雅,我希望这篇文章可以帮助人们意识到这种解决方案。关于您的安全问题,您可以set the file in the bucket to only be accessible {@ 3}}从Google Cloud Build和项目的所有者那里获得高度的安全性。

答案 1 :(得分:1)

我采用的另一种解决方案是将env变量直接存储在Cloud Build触发器替换变量中,并使用custom Cloud Builder envsubt来呈现模板化的app.yaml

我找不到有关替换变量如何存储在Cloud Build触发器中的文档(此处的任何参考将对您有所帮助)。但是,我认为Google Cloud中的大多数数据都是静态加密的,在使用和传输时也会加密。主要缺点是这些值以纯文本形式显示,因此不会混淆诸如API密钥之类的敏感信息,并且任何有权访问触发器的人都可以看到该敏感信息。

一个好处是,这样可以使模板化的app.yaml与您将使用的代码保持接近,并且可以在相同的请求中对其进行检查。另外,您不需要使用其他服务,例如Google Storage。

步骤:

  1. envsubst云构建器添加到您的项目中,请参阅说明here
  2. 创建模板化的app.yaml文件,例如
runtime: <your runtime>

service: ${GAE_SERVICE}

env_variables:
  MY_VAR: ${MY_VAR}
  MY_VAR_2: ${MY_VAR_2}
  1. app.yaml中添加一个cloudbuild.yaml模板渲染步骤
steps:
- id: "render-app-yaml"
  name: "gcr.io/${PROJECT_ID}/envsubst"
  env:
  - "GAE_SERVICE=${_GAE_SERVICE}"
  - "MY_VAR=${_MY_VAR}"
  - "MY_VAR_2=${_MY_VAR_2}"
  args: ["app.yaml"]
  1. 在Cloud Build触发器中添加替换变量,例如_GAE_SERVICE_MY_VAR_MY_VAR_2。注意:触发器中的用户定义变量以_为前缀。

在进行研究时,我也找不到任何这样的解决方案。欢迎任何反馈。