在构建期间使用 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 应用审查报告