我想在GAE上开发一个Django应用,并使用CloudBuild进行CICD。我想知道有什么最好的方法可以将秘密传递给我的应用程序(DB凭证等)。
我能够按照说明在 https:/cloud.google.comcloud-builddocssecuring-buildsus-encrypted-secret-credentials。 来读取我的构建步骤中的秘密,并将其作为环境变量传递到我的应用程序中。虽然有点黑,但很有效。
- 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中的应用程序中,将秘密存储在env变量中是否安全,也就是说,通过 "莫名其妙 "的倾倒,它们会被窃取吗?print(dict(os.environ))
?
2)还是从Django中的Secret Manager中获取更好的选择(例如在 settings.py
)? (我担心这里的重启或版本切换,会不会影响这个选项)
3)还是有更好的选择?
谢谢。
您所做的事情的安全问题不在于环境变量本身,而在于您将秘密的普通解密值存储在环境变量中,从而使其可被用户访问。os.environ
命令,而您的实例正在运行。
更简单的解决方案是将这些敏感信息转储到一个文件中,并将其存储在一个只有你的应用引擎的服务账户才有权限的云存储Bucket上,比如这样。
TEST_PW=$(gcloud secrets versions access latest --secret=test-key)
echo "TEST_PASSWORD=$${TEST_PW}" >> [YOUR_FILE_URL]
unset TEST_PW
如果你想继续使用环境变量,你可以通过使用Cloud KMS来保持数据加密,你可以找到一个如何 此处,这是你在问题上分享的同一文档的不同部分。