其中一个local_settings.py反模式的原因是,把SECRET_KEY,AWS键等。值到设置文件有问题:
- 秘密往往应该是这一点:秘密! 让他们在版本控制意味着每个人都与仓库的访问访问它们。
我的问题是如何保持所有按键的秘诀是什么?
其中一个local_settings.py反模式的原因是,把SECRET_KEY,AWS键等。值到设置文件有问题:
我的问题是如何保持所有按键的秘诀是什么?
存储您local_settings.py
数据与GPG加密的文件-优选以严格key=value
您解析和分配到字典(其他有吸引力的办法是把它作为可执行蟒蛇线,但在配置文件中的可执行代码让我发抖)。
有一个python GPG模块,所以这不是一个问题。 从你的钥匙圈让你的钥匙,并使用GPG钥匙圈管理工具,让你不必守在输入您的钥匙串密码。 请确保您直接从加密文件读取数据,而不是仅仅创造您在阅读解密的临时文件。这是对失败的良方。
这只是一个大纲,你必须建立它自己。
这样的秘密数据仅保留在进程内存空间,而不是在一个文件或环境变量。
我做的使用Windows 7和PowerShell我的Django的项目,所以对我来说是略有不同,设置环境变量。 一旦它被设置虽然,我只是做了我下面的settings.py
文件:
import os
SECRET_KEY = os.environ["SOME_SECRET_KEY"]
要使用PowerShell的跟随下面的链接中的说明在Windows中设置一个环境变量:
http://technet.microsoft.com/en-us/library/ff730964.aspx
理想情况下, local_settings.py
不应该被用于生产/部署的服务器检查英寸 你可以保持备份在其他地方,但不是在源代码控制。
local_settings.py
可以开发配置进行检查,在短短的便利,让每一个开发者需要去改变它。
这是否解决问题了吗?
原来的问题是如何保持秘密的环境变量。 这是在书中广泛讨论的Django的两勺 。 下面是他们所说的总结,然后是关于使用这种技术需要注意。
启动版第48页(5.3节)对1.11:
通过Django的(和Python)所支持的所有操作系统提供了简单的功能来创建环境变量。
下面是使用环境变量秘密密钥的好处:
- 保守秘密出的设置,使您在版本控制每一个设置文件存储毫不犹豫。 所有的Python代码真的应该被存放在版本控制,包括您的设置。
- 而不是每个开发人员保持发展的local_settings.py.example的自己的拷贝和粘贴的版本中,每个人都拥有相同的版本控制设置/ local.py。
- 系统管理员可以在无需修改包含Python代码文件的快速部署项目。
- 大多数平台作为一种服务的推荐配置中使用的环境变量,并具有用于设置和管理它们的内置功能。
在接下来的页面,这本书继续说:
在您开始设置环境变量之前,您应该具备以下条件:
- 一种方法来管理你要存储的秘密信息。
- 如何bash的设置在服务器上,或愿意工作的一个很好的理解有你的项目由平台作为一种服务托管。
他们描述了如何在本地生产设置环境变量(与Heroku的作为一个例子 - 你需要检查,如果你使用的是不同的主机,这只是一种可能性):
如何在本地设置环境变量
出口SOME_SECRET_KEY = 1C3-cr3am-15-美味如何设置在生产环境变量
Heroku的配置:设置SOME_SECRET_KEY = 1C3-cr3am-15-美味
最后,第52页上他们给了如何访问密钥的说明。 举例来说,你可以把前两行下面的设置文件,以替换被默认放在那里原始密钥字符串:
>>> import os >>> os.environ['SOME_SECRET_KEY'] '1c3-cr3am-15-yummy'
这段代码只是获取从操作系统的SOME_SECRET_KEY环境变量的值,并将其保存到名为SOME_SECRET_KEY一个Python变量。
根据这一模式意味着所有的代码可以留在版本控制,以及所有的秘密保持安全。
请注意,如果您使用的是Apache服务器,这将不会在某些情况下工作,例如。 为了应对情况下这种模式是行不通的,你应该看到他们的书的5.4节(“当你不能使用环境变量”)。 在这种情况下,他们建议使用保密文件。
截至2017年年底,在环境变量中存储的秘密的这种技术是在两个勺与十二因子应用设计模式,推荐的最佳做法。 此外,还建议在Django文档。 不过,也有一定的安全隐患:如果一些开发商或一些代码,访问您的系统,他们将有机会获得你的环境变量,并在不经意间可能(或advertently)予以公布。 这一点是由这里迈克尔·赖因施做:
http://movingfast.io/articles/environment-variables-considered-harmful/
我写了一个getcreds()函数,它会从一个文件中的密钥。 我把文件中www数据访问的地方所以无论我需要在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
您可能需要使用os.environ。 获得 ( “SOME_SECRET_KEY”)
下面是做这件事是与在Heroku上部署兼容:
创建一个名为gitignored文件.env
包含:
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瓦尔。