当前位置: 首页 > 知识库问答 >
问题:

在GAE中安全存储环境变量,app.yaml

文喜
2023-03-14

我需要将API密钥和其他敏感信息存储在app.yaml中,作为在GAE上部署的环境变量。这样做的问题是,如果我将app.yaml推送到GitHub,这些信息将变得公开(不好)。我不想将信息存储在数据存储中,因为它不适合项目。相反,我想在应用程序的每个部署上从. gitignore中列出的文件中交换值。

这是我的应用程序。yaml文件

application: myapp
version: 3 
runtime: python27
api_version: 1
threadsafe: true

libraries:
- name: webapp2
  version: latest
- name: jinja2
  version: latest

handlers:
- url: /static
  static_dir: static

- url: /.*
  script: main.application  
  login: required
  secure: always
# auth_fail_action: unauthorized

env_variables:
  CLIENT_ID: ${CLIENT_ID}
  CLIENT_SECRET: ${CLIENT_SECRET}
  ORG: ${ORG}
  ACCESS_TOKEN: ${ACCESS_TOKEN}
  SESSION_SECRET: ${SESSION_SECRET}

有什么想法吗?

共有3个答案

姚嘉容
2023-03-14

这在你发帖的时候是不存在的,但是对于其他在这里遇到麻烦的人来说,谷歌现在提供了一个名为Secret Manager的服务。

这是一个简单的REST服务(当然是SDK包装的),可以将你的秘密存储在谷歌云平台上的一个安全位置。这是一种比数据存储更好的方法,需要额外的步骤来查看存储的机密,并具有更细粒度的权限模型——如果需要,您可以为项目的不同方面保护不同的机密。

它提供版本控制,因此您可以相对轻松地处理密码更改,以及强大的查询和管理层,使您能够在必要时在运行时发现和创建机密。

开发包

用法示例:

from google.cloud import secretmanager_v1beta1 as secretmanager

secret_id = 'my_secret_key'
project_id = 'my_project'
version = 1    # use the management tools to determine version at runtime

client = secretmanager.SecretManagerServiceClient()

secret_path = client.secret_version_path(project_id, secret_id, version)
response = client.access_secret_version(secret_path)
password_string = response.payload.data.decode('UTF-8')

# use password_string -- set up database connection, call third party service, whatever
景温书
2023-03-14

如果是敏感数据,则不应将其存储在源代码中,因为它将被签入源代码管理。错误的人(组织内部或外部)可能会在那里找到它。此外,开发环境可能使用与生产环境不同的配置值。如果这些值存储在代码中,您将不得不在开发和生产中运行不同的代码,这是一种混乱和糟糕的做法。

在我的项目中,我使用以下类将配置数据放入数据存储:

from google.appengine.ext import ndb

class Settings(ndb.Model):
  name = ndb.StringProperty()
  value = ndb.StringProperty()

  @staticmethod
  def get(name):
    NOT_SET_VALUE = "NOT SET"
    retval = Settings.query(Settings.name == name).get()
    if not retval:
      retval = Settings()
      retval.name = name
      retval.value = NOT_SET_VALUE
      retval.put()
    if retval.value == NOT_SET_VALUE:
      raise Exception(('Setting %s not found in the database. A placeholder ' +
        'record has been created. Go to the Developers Console for your app ' +
        'in App Engine, look up the Settings record with name=%s and enter ' +
        'its value in that record\'s value field.') % (name, name))
    return retval.value

您的应用程序会这样做以获得一个值:

API_KEY = Settings.get('API_KEY')

如果数据存储中有该键的值,您将获得它。如果没有,将创建一个占位符记录并抛出一个异常。异常将提醒您转到开发人员控制台并更新占位符记录。

我发现这消除了设置配置值的猜测。如果您不确定要设置什么配置值,只需运行代码,它就会告诉您!

上面的代码使用ndb库,它使用memcache和后台的数据存储,所以速度很快。

更新:

杰尔德询问如何在App Engine控制台中找到Datastore值并设置它们。以下是方法:

>

  • 转到https://console.cloud.google.com/datastore/

    如果尚未选择项目,请在页面顶部选择该项目。

    在种类下拉框中,选择设置。

    如果您运行上面的代码,您的密钥将显示出来。它们都将具有未设置的值。单击每个并设置其值。

    希望这有帮助!

  • 李捷
    2023-03-14

    此解决方案很简单,但可能不适合所有不同的团队。

    首先,将环境变量放在env_variables.yaml,例如,

    env_variables:
      SECRET: 'my_secret'
    

    然后,在app.yaml中包含这个env_variables.yaml

    includes:
      - env_variables.yaml
    

    最后,添加env_变量。yaml。gitignore,这样存储库中就不会存在秘密变量。

    在这种情况下,env_variables.yaml需要在部署管理器之间共享。

     类似资料:
    • 问题内容: 如果我在终端输入 … shell在哪里存储该环境变量? 我正在使用Ubuntu 8.10。我查看了文件〜/ .profile和/ etc / profile,找不到DISPLAY的痕迹。 问题答案: 进程的环境变量在运行时存在,并且未存储在某些文件中。它们存储在进程自己的内存中(在那里,它们会传递给子进程)。但是其中有一个虚拟文件 该文件显示了在调用进程时传递的所有环境变量(除非进程覆

    • 我通过Github将我的项目部署到GAE。有一些外国API密钥,我不想保存在存储库中并公开它们。是否可以在GAE控制面板中为项目设置环境变量,以便在应用程序中捕获它?

    • 问题内容: 我使用martini在Go中有一个GAE应用程序。我需要能够设置环境变量以告诉martini它应该使用生产设置进行初始化。根据Python文档,您可以在app.yaml中设置环境变量。我没有在Go docs中 看到任何有关此的内容,但我猜想它应该可以正常工作。 我需要能够将环境变量设置为,但是我只想在实际投入生产时(即)进行操作。有什么方法可以告诉您仅在非开发服务器上运行吗? 问题答案

    • 我正在使用GAE部署我的应用程序,我想把一些环境变量传递给我的GAE实例。例如,每次我使用DB时,分配当前是这样的: 这很好,但问题是它是一个共享代码,每次有人进行本地测试时,它都会更改路径,并将更改推送到存储库。当有人拉动新的更改时,它需要更改以发出db请求,因为每个人都有不同的套接字更改路径。因此,我创建了以下声明: 因此,如果某个人的系统中有一个环境变量,那么它会接受该变量并避免绝对路径。问

    • 问题内容: 如何在Windows中为Java(类路径)设置环境变量? 问题答案: 64位Windows 7或Windows 8上的Java SE Development Kit 8u112 设置以下用户环境变量(== 用户变量类型的环境变量) JAVA_HOME : C:\Program Files\Java\jdk1.8.0_112 JDK_HOME : %JAVA_HOME% JRE_HOME

    • Git 总是在一个 bash shell 中运行,并借助一些 shell 环境变量来决定它的运行方式。 有时候,知道它们是什么以及它们如何让 Git 按照你想要的方式去运行会很有用。 这里不会列出所有的 Git 环境变量,但我们会涉及最有的那部分。 全局行为 像通常的程序一样,Git 的常规行为依赖于环境变量。 GIT_EXEC_PATH 决定 Git 到哪找它的子程序 (像 git-commit