保持秘密密钥

时间:2013-02-09 07:49:04

标签: python django settings

local_settings.py反模式的一个原因是放置SECRET_KEY,AWS 键等设置文件中的值有问题:

  • 秘密通常应该就是:秘密!将它们保存在版本控制中意味着 拥有存储库访问权限的每个人都可以访问它们。

我的问题是如何保密所有密钥?

7 个答案:

答案 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中设置环境变量,请按照以下链接中的说明进行操作:

http://technet.microsoft.com/en-us/library/ff730964.aspx

答案 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上的部署兼容的一种方法:

  1. 创建一个名为.env的gitgitred文件,其中包含:

    export DJANGO_SECRET_KEY = 'replace-this-with-the-secret-key'

  2. 然后编辑settings.py删除实际的SECRET_KEY并添加它:

    SECRET_KEY = os.environ['DJANGO_SECRET_KEY']

  3. 然后,当您要在本地运行开发服务器时,请使用:

    source .env
    python manage.py runserver

  4. 当您最终部署到Heroku时,请转到应用的“设置”标签,然后将DJANGO_SECRET_KEY添加到Config Vars。