将您的local_settings.py数据存储在使用GPG加密的文件中 - 最好是严格按照key=value您解析并分配给dict的行(另一种有吸引力的方法是将其作为可执行的python,但配置文件中的可执行代码让我颤抖).
有一个python gpg模块,所以这不是问题.从密钥环获取密钥,并使用GPG密钥环管理工具,这样您就不必一直输入密钥链密码.确保您直接从加密文件中读取数据,而不仅仅是创建您读入的解密临时文件.这是失败的秘诀.
这只是一个大纲,你必须自己构建它.
这样,秘密数据仅保留在进程内存空间中,而不保留在文件或环境变量中.
我使用Windows 7和Powershell进行Django项目,所以对我来说设置环境变量略有不同.一旦设置完毕,我只是在我的settings.py文件中执行了以下操作:
import os
SECRET_KEY = os.environ["SOME_SECRET_KEY"]
Run Code Online (Sandbox Code Playgroud)
要使用PowerShell在Windows中设置环境变量,请按照以下链接中的说明操作:
http://technet.microsoft.com/en-us/library/ff730964.aspx
理想情况下,local_settings.py不应为生产/部署的服务器签入。您可以将备份副本保留在其他位置,但不能保留在源代码管理中。
local_settings.py 为了方便起见,可以使用开发配置进行签入,因此每个开发人员都需要对其进行更改。
这样可以解决您的问题吗?
最初的问题是关于如何在环境变量中保密。这在《Django 的两个勺子》一书中进行了广泛的讨论。下面是他们所说的摘要,然后是有关使用此技术的警告。
从 1.11 版的第 48 页(第 5.3 节)开始:
Django(和 Python)支持的每个操作系统都提供了创建环境变量的简单功能。
以下是使用环境变量作为密钥的好处:
- 保密设置允许您毫不犹豫地将每个设置文件存储在版本控制中。您的所有 Python 代码都应该存储在版本控制中,包括您的设置。
- 不是每个开发人员都为开发维护自己复制粘贴的 local_settings.py.example 版本,而是每个人都共享相同的版本控制 settings/local.py 。
- 系统管理员无需修改包含 Python 代码的文件即可快速部署项目。
- 大多数平台即服务建议使用环境变量进行配置,并具有用于设置和管理它们的内置功能。
在下一页,本书继续:
在开始设置环境变量之前,您应该具备以下条件:
- 一种管理您要存储的秘密信息的方法。
- 很好地了解 bash 设置如何在服务器上工作,或者愿意让您的项目由平台即服务托管。
他们描述了如何在本地和生产中设置环境变量(以 Heroku 为例——您需要检查是否使用不同的主机,这只是一种可能性):
如何在本地设置环境变量
export SOME_SECRET_KEY=1c3-cr3am-15-yummy如何在生产
heroku 配置中设置环境变量:set SOME_SECRET_KEY=1c3-cr3am-15-yummy
最后,在第 52 页,他们给出了如何访问密钥的说明。例如,您可以将下面的前两行放在您的设置文件中以替换默认情况下放置在那里的原始密钥字符串:
Run Code Online (Sandbox Code Playgroud)>>> import os >>> os.environ['SOME_SECRET_KEY'] '1c3-cr3am-15-yummy'此代码段只是从操作系统获取 SOME_SECRET_KEY 环境变量的值,并将其保存到名为 SOME_SECRET_KEY 的 Python 变量中。
遵循此模式意味着所有代码都可以保留在版本控制中,并且所有机密都保持安全。
请注意,这在某些情况下不起作用,例如,如果您使用的是 Apache 服务器。要处理此模式不起作用的情况,您应该查看他们书中的第 5.4 节(“当您无法使用环境变量时”)。在这种情况下,他们建议使用机密文件。
截至 2017 年底,这种在环境变量中存储秘密的技术是两勺和十二因素应用程序设计模式中推荐的最佳实践。在 Django 文档中也推荐使用它。但是,存在一些安全风险:如果某些开发人员或某些代码可以访问您的系统,他们将可以访问您的环境变量,并且可能会无意(或无意中)将它们公开。这一点是由 Michael Reinsch 在这里提出的:http :
//movingfast.io/articles/environment-variables-thinked-harmful/