谷歌AppEngine(GAE)上Django应用程序中的秘密

谷歌AppEngine(GAE)上Django应用程序中的秘密,django,google-app-engine,google-app-engine-python,google-cloud-build,secret-key,Django,Google App Engine,Google App Engine Python,Google Cloud Build,Secret Key,我正在尝试在GAE上开发Django应用程序,并使用CloudBuild for CI/CD。我想知道向我的应用程序传递秘密的最佳方式是什么(DB凭据等) 在构建步骤中,我能够按照的说明从中读取秘密,并将其作为环境变量传递到我的应用程序中。这有点老套,但它很管用: - name: gcr.io/cloud-builders/gcloud entrypoint: 'bash' args: - '-c' - | TEST_PW=$(gcloud sec

我正在尝试在GAE上开发Django应用程序,并使用CloudBuild for CI/CD。我想知道向我的应用程序传递秘密的最佳方式是什么(DB凭据等)

在构建步骤中,我能够按照的说明从中读取秘密,并将其作为环境变量传递到我的应用程序中。这有点老套,但它很管用:

  - name: gcr.io/cloud-builders/gcloud
    entrypoint: 'bash'
    args:
    - '-c'
    - |
      TEST_PW=$(gcloud secrets versions access latest --secret=test-key)
      echo "TEST_PASSWORD=$${TEST_PW}" >> env_vars
      unset TEST_PW
然而,我不确定这种做法是否安全。我在我的应用程序中运行时转储了env变量(使用
print(dict(os.environ))
,其中唯一的敏感值是我传入的秘密(所有其他与GAE应用程序相关的值都是非敏感数据)

因此,问题是:

1) 在AppEngine的应用程序中,将机密存储在环境变量中是否安全,即通过
打印(dict(os.environ))
“以某种方式”转储这些机密是否会被窃取

2) 或者从Django中的Secret Manager(例如在
settings.py
)中获取它们是更好的选择?(我担心重新启动或版本切换,以及它们是否会影响此选项)

3) 还是有更好的选择


谢谢。

您所做的事情的安全性问题不是环境变量本身,而是您正在其中存储机密的普通解密值,从而在实例运行时通过
os.environ
命令访问它

一个更简单的解决方案是将敏感信息转储到一个文件中,并将其存储在只有应用引擎的服务帐户才能访问的云存储桶中,如下所示:

TEST_PW=$(gcloud secrets versions access latest --secret=test-key)
echo "TEST_PASSWORD=$${TEST_PW}" >> [YOUR_FILE_URL]
unset TEST_PW

如果你想继续使用环境变量,你可以使用云KMS来加密数据,你可以找到一个,这是您就您的问题共享的同一文档的不同部分。

但是,将解密值作为应用程序中的env变量与AppEngine使用解密值访问GCS中的文件有什么区别?两人之间的安全顾虑是一样的。与将值设置为env var相比,将该文件与应用程序代码打包是否是一个更好的选择?除了通过Cloud IAM添加一层安全性之外,这两者之间没有什么真正的区别,只允许您的服务帐户访问这些值。但是我要说的是,最安全的选择仍然是使用云KMS来加密变量。谢谢!我试试看