在构建期间使用 gsutil builder 获取 app.yaml 来保护 GAE 环境变量?

Posted

技术标签:

【中文标题】在构建期间使用 gsutil builder 获取 app.yaml 来保护 GAE 环境变量?【英文标题】:Securing GAE env variables by using gsutil builder to source app.yaml during build? 【发布时间】:2019-06-29 20:51:51 【问题描述】:

我和这里提到的有同样的问题: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 中搜索环境变量,然后在缓存中,最终 在数据存储中。但与 KMS 一样,它大大增加了复杂性。 将机密存储在 JSON 文件中并放入 Google Cloud Storage:同样,它需要通过帮助程序加载 env 变量 检查环境变量,然后加载文件等...

但是对我来说最好的解决方案来自How to pass environment variables to the app.yaml using cloud build

它允许我使用适用于 nodejs 的 GAE 灵活环境进行以下部署流程:

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

这会检查我的所有选项,并且是一个相当简单的解决方案但是,这绝对不是一个受欢迎的解决方案,所以我在这里遗漏了什么吗?

最重要的是有什么安全问题吗?

【问题讨论】:

【参考方案1】:

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

正如您所提到的,有很多方法可以将变量传递给应用程序,但我相信您提出的解决方案(将变量存储在 Google Cloud Storage 中并使用 Google Cloud Build 检索它们)最适合您的目的。它不需要太多代码而且很优雅,我希望这篇文章能帮助人们了解这个解决方案。关于您的安全问题,此解决方案包含高度安全性,您可以从 Google Cloud Build 和项目所有者set the file in the bucket to only be accessible 获得。

【讨论】:

感谢您的反馈 - 您给了我正在寻找的健全性检查。 @AndrewBass 也看看这个答案。你可能会发现它很有用。 ***.com/a/54587656/7757976【参考方案2】:

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

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

一个好处是这样可以使模板化的app.yaml 与您将使用它的代码保持一致,并且可以在同一个拉取请求中进行审查。此外,您无需使用其他服务,例如 Google Storage。

步骤:

    envsubst Cloud builder 添加到您的项目中,请参阅说明here。 创建一个模板化的app.yaml 文件,例如
runtime: <your runtime>

service: $GAE_SERVICE

env_variables:
  MY_VAR: $MY_VAR
  MY_VAR_2: $MY_VAR_2
    cloudbuild.yaml 中添加app.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"]
    在 Cloud Build 触发器中添加替换变量,例如_GAE_SERVICE_MY_VAR_MY_VAR_2。注意:触发器中用户定义的变量以_为前缀。

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

【讨论】:

这是最快的解决方案。这是有关如何将图像添加到容器存储库github.com/GoogleCloudPlatform/cloud-builders-community 的说明,因为附加链接中并不清楚。

以上是关于在构建期间使用 gsutil builder 获取 app.yaml 来保护 GAE 环境变量?的主要内容,如果未能解决你的问题,请参考以下文章

在构建 CupertinoTabScaffold 期间调用 setState() 或 markNeedsBuild()

在小部件构建期间如何在颤动中导航?

如何从 Electron-builder NSIS 获取选定的语言

gsutil - 如何从 google play 获取 Android 应用审查报告

如何从 Django 中的 js html builder 获取 url?

无法使用 PHP exec 运行 gsutil