local_settings.py反模式的一个原因是放置SECRET_KEY,AWS 键等设置文件中的值有问题:
我的问题是如何保密所有密钥?
答案 0 :(得分:6)
将您的local_settings.py
数据存储在使用GPG加密的文件中 - 最好是严格的key=value
行,您解析并分配给dict(另一种有吸引力的方法是将其作为可执行的python,但是配置文件中的可执行代码让我颤抖。)
有一个python gpg模块,所以这不是问题。从密钥环获取密钥,并使用GPG密钥环管理工具,这样您就不必一直输入密钥链密码。确保您直接从加密文件中读取数据,而不仅仅是创建一个您读入的解密临时文件。这是失败的秘诀。
这只是一个大纲,你必须自己构建它。
这样,秘密数据仅保留在进程内存空间中,而不是文件或环境变量中。
答案 1 :(得分:6)
我使用Windows 7和Powershell进行Django项目,所以对我来说设置环境变量略有不同。一旦设置完毕,我只是在我的settings.py
文件中执行了以下操作:
import os
SECRET_KEY = os.environ["SOME_SECRET_KEY"]
要使用PowerShell在Windows中设置环境变量,请按照以下链接中的说明进行操作:
答案 2 :(得分:5)
理想情况下,不应为生产/部署的服务器签入local_settings.py
。您可以将备份副本保留在其他位置,但不能保留在源代码管理中。
local_settings.py
,以便每个开发人员都需要更改它。
这能解决您的问题吗?
答案 3 :(得分:4)
最初的问题是关于如何在环境变量中保密。这在Two Scoops of Django一书中进行了广泛讨论。下面是他们所说内容的摘要,然后是关于使用这种技术的警告。
从1.11版本的第48页(第5.3节)开始:
Django(和Python)支持的每个操作系统都提供了 轻松创建环境变量的能力。
以下是使用环境变量进行密钥的好处:
- 保密设置允许您毫不犹豫地将每个设置文件存储在版本控制中。你的所有Python代码 确实应该存储在版本控制中,包括你的设置。
- 不是每个开发人员都维护自己的local_settings.py.example复制粘贴版本进行开发,而是每个人都分享 相同的版本控制设置/ local.py。
- 系统管理员可以快速部署项目,而无需修改包含Python代码的文件。
- 大多数平台即服务建议使用环境变量进行配置,并具有内置的设置和功能 管理他们。
在下一页上,本书继续:
在开始设置环境变量之前,您应该拥有 以下内容:
- 管理您要存储的秘密信息的方法。
- 很好地理解bash设置如何在服务器上运行,或者是否愿意让平台即服务托管您的项目。
他们描述了如何在本地和生产中设置环境变量(以Heroku为例 - 您需要检查是否使用不同的主机,这只是一种可能性):
如何在本地设置环境变量
export SOME_SECRET_KEY = 1c3-cr3am-15-yummy如何在生产环境中设置环境变量
heroku config:设置SOME_SECRET_KEY = 1c3-cr3am-15-yummy
最后,在第52页,他们提供了如何访问密钥的说明。例如,您可以将下面的前两行放在设置文件中,以替换默认情况下放在那里的原始键字符串:
>>> import os >>> os.environ['SOME_SECRET_KEY'] '1c3-cr3am-15-yummy'
此代码段只是获取SOME_SECRET_KEY环境的值 来自操作系统的变量并将其保存到Python变量中 叫做SOME_SECRET_KEY。
遵循此模式意味着所有代码都可以保留在版本控制中, 所有的秘密都是安全的。
请注意,在某些情况下这不起作用,例如,如果您使用的是Apache服务器。要处理这种模式不起作用的情况,您应该看到他们的书的第5.4节('何时可以使用环境变量')。在这种情况下,他们建议使用秘密文件。
截至2017年底,这种在您的环境变量中存储秘密的技术是Two Scoops和Twelve Factor App设计模式中的推荐最佳实践。它也被推荐在Django文档中。但是,存在一些安全风险:如果某些开发人员或某些代码可以访问您的系统,他们将可以访问您的环境变量,并可能无意中(或通知)将其公开。这一点由Michael Reinsch在这里提出:
http://movingfast.io/articles/environment-variables-considered-harmful/
答案 4 :(得分:2)
我写了一个getcreds()函数,它从文件中获取密钥。我将文件保存在www-data可访问的位置,因此无论我在settings.py中需要凭据,我只需调用getcreds()作为参数传递文件名。它返回文件和宾果游戏中所有行的列表我有隐藏的秘密。这是代码......
from __future__ import unicode_literals, absolute_import
import os
def getcreds(fname, project, credsroot='/var/www/creds', credsdir=None):
""" return a list of userid and password and perhaps other data """
if credsdir is None:
credsdir = os.path.join(credsroot, project)
creds = list()
fname = os.path.join(credsdir, fname).replace("\\", "/")
with open(fname, 'r') as f:
for line in f:
# remove leading/trailing whitespace and append to list
creds.append(line.strip())
assert creds, "The list of credentials is empty"
return creds
答案 5 :(得分:0)
您可能需要使用os.environ。获取(“SOME_SECRET_KEY”)
答案 6 :(得分:0)
这是与Heroku上的部署兼容的一种方法:
创建一个名为.env
的gitgitred文件,其中包含:
export DJANGO_SECRET_KEY = 'replace-this-with-the-secret-key'
然后编辑settings.py
删除实际的SECRET_KEY
并添加它:
SECRET_KEY = os.environ['DJANGO_SECRET_KEY']
然后,当您要在本地运行开发服务器时,请使用:
source .env
python manage.py runserver
当您最终部署到Heroku时,请转到应用的“设置”标签,然后将DJANGO_SECRET_KEY添加到Config Vars。