如何使用virtualenv和Django隐藏我的secret_key?

18

我正在使用DjangoPythonvirtualenvvirtualenvwrapperVagrant

到目前为止,我只是将我的secret_key留在settings.py文件中。这对本地文件有效。但是,我已经将文件放入了Git中。我知道这对于生产(Apache)来说是不可接受的。

如何正确地隐藏我的secret_key

我应该使用virtualenv来隐藏它吗?


2
我不确定virtualenv以何种方式隐藏密钥。 - Daniel Roseman
您有以下两种方式进行操作。只是想指出一个警告:如果您现在将您的密钥放在您的代码库中,请更改您的密钥! - Ryan O'Donnell
@RyanO'Donnell 只有当你的代码库是公开的时候才需要这样做。如果你的代码库只存在于你的服务器上,而且没有其他人可以访问,那就不会太糟糕。但如果它在 GitHub 上作为公共代码库,那就很糟糕了。 - Alex Van Liew
没错,不过谁知道你将来会用它做什么 :) - Ryan O'Donnell
5个回答

18

有许多不同的方法可以隐藏秘密。

  1. 使用另一个非版本化文件。

    创建一个新文件secrets.py或其他文件,将您的秘密内容放入其中。将其与设置文件放在一起,并将所有秘密内容放在里面;然后在设置文件中添加from secrets import *。然后,像Rahul所说的那样,添加一个.gitignore文件并将secrets.py添加到该文件中,以便不会被提交。

    这种方法的缺点是该文件上没有任何源代码控制;如果丢失了该文件,您就无法找回。

  2. 使用环境变量。

    使用Apache SetEnvPassEnv指令向进程传递环境变量,然后在设置文件中使用os.environ()检索它们。这样做的好处是,在开发过程中,您可以设置新变量(只需简单地键入:VAR1=whatever VAR2=whatever ... ./manage.py runserver ...)或从您用于启动开发项目的任何机制中设置它们。

    缺点也大致相同;如果您丢失了Apache配置,就无法恢复。

  3. 使用第二个存储库与方法1结合使用。

    个人而言,我喜欢的想法是创建一个专用的secrets存储库,将所有秘密内容放入其中,并将该存储库保护起来。然后,在部署过程中,您可以使用git archive或另一个类似的命令提取适用于您要部署到的位置的正确密钥,这样您就可以轻松地备份并进行版本控制。您还可以将secrets存储库中的适当文件添加到站点存储库的.gitingore文件中,以防止它们被意外提交。

    这样做的缺点是你需要额外的仓库和部署步骤。个人认为这很值得,但最终决定还是取决于你。

通常来说,你想要更安全,访问这些秘密会更加不方便。不过这通常是一个普遍的规则。


一旦你从secrets import *导入变量,如何在settings.py中访问它? - Jake Mulhern

17

你可以创建一个名为secret_settings.py的文件,并在其中放置你的SECRET_KEY。然后将这个文件添加到.gitignore中。 然后在你的设置文件中,你可以删除这个秘钥变量并从那里导入它。这应该确保SECRET_KEY变量不被纳入版本控制。

创建一个名为secret_settings的文件,然后将你的SECRET_KEY和其他机密设置放入其中。

SECRET_KEY = .. # add your setting here

然后在您的settings.py文件中,导入这些设置。

from secret_settings import *

最后,将secret_settings.py添加到您的 .gitignore 文件中。

注意:

如果您已经向代码库提交了一些敏感数据,请进行更改!

根据 Github 网站在删除敏感数据文章中的说法:

  

如果您提交了密码,请更改它! 如果您提交了密钥,请生成新密钥。

请查看此链接,了解如何从存储库历史记录中清除文件。


这个答案对我来说是最简洁的方法! - 1QuickQuestion
@Rahul Gupta,我们部署时需要一个密钥吗? - Talha Anwar
1
对我来说,我需要在这部分中包含一个点:from .secret_settings import * - Claudio Shigueo Watanabe

2

如果您想配置区域,但不想将敏感信息存储在存储库中,则常见方法是通过环境变量传递它。当您需要时,只需调用os.environ('SECRET')(甚至在您的settings.py中)。最好提供一些备用值。

Virtualenv并不能帮助您隐藏任何内容,它只是防止单个项目所需包使系统范围内的Python安装混乱。


0
我使用的解决方案是创建一个名为sec.py的文件,并将其放置在与我的settings.py文件相邻的位置。然后在settings.py的第1行调用from .sec import *。请确保在文件名前面包括句点。请务必在.gitignore文件中列出sec.py。

0
我在项目的根目录中创建了一个 .env 文件。接下来,我将 SECRET_KEY 复制到 .env 文件中。我从密钥中删除引号和空格(SECRET_KEY=django-insecureхjsdsdk 8747373884dydfds)。然后,安装 pip install python-decouple 库。在 settings.py 中进行导入 - from decouple import config。在 SECRET_KEY 字段中使用 config('SECRET_KEY')。别忘了在 gitignore 中添加 .env。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接