在哪里存放秘密钥匙DJANGO

nit*_*chi 49 django django-settings

对于我的生活,我一直在寻找这个,并没有找到答案.我希望我不会发布重复内容.

建议您将秘密密钥保存在与常规settings.py不同的文件中.此外,您永远不应提交包含诸如SECRET_KEY,AWS_SECRET_KEY等密钥的"secret.py"文件.

我的问题是:在您的生产服务器中,您需要引用您的密钥,这意味着您的"secret.py"设置文件应该位于服务器周围的某个位置吗?如果是这样,您如何在生产中保护您的密钥?

Zac*_*ché 43

我想添加一个新答案,因为作为初学者,之前接受的答案对我来说没有多大意义(这只是谜题的一部分)。

以下是我在本地和生产环境(Heroku 等)中存储密钥的方式。

注意:只有当您计划将项目放到网上时,您才需要执行此操作。如果只是本地项目,则不需要。

1)安装python-dotenv以创建本地项目环境来存储您的密钥。

pip install python-dotenv
Run Code Online (Sandbox Code Playgroud)

.env2)在您的基本目录(位置)中创建一个文件manage.py

YourDjangoProject
????project
?   ????__init__.py
?   ????asgi.py
?   ????settings.py
?   ????urls.py
?   ????wsgi.py
????.env
????manage.py
????db.sqlite3
Run Code Online (Sandbox Code Playgroud)

如果你有一个 Heroku 项目,它应该看起来像这样:

YourDjangoProject
????.git
????project
?   ????__init__.py
?   ????asgi.py
?   ????settings.py
?   ????urls.py
?   ????wsgi.py
????venv
????.env
????.gitignore
????manage.py
????Procfile
????requirements.txt
????runtime.txt
Run Code Online (Sandbox Code Playgroud)

3) 添加.env到您的.gitignore文件。

echo .env > .gitignore  # Or just open your .gitignore and type in .env
Run Code Online (Sandbox Code Playgroud)

这就是让你的密钥更安全的方法,因为你不会将 .env 文件上传到 git 或 heroku (或其他任何地方)。

4)将 settings.py 文件中的 SECRET_KEY 添加到 .env 文件中,如下所示(不带引号)

**Inside of your .env file**
SECRET_KEY=qolwvjicds5p53gvod1pyrz*%2uykjw&a^&c4moab!w=&16ou7 # <- Example key, SECRET_KEY=yoursecretkey
Run Code Online (Sandbox Code Playgroud)

5) 在 settings.py 文件中添加以下设置:

import os
import dotenv # <- New

# Add .env variables anywhere before SECRET_KEY
dotenv_file = os.path.join(BASE_DIR, ".env")
if os.path.isfile(dotenv_file):
    dotenv.load_dotenv(dotenv_file)

# UPDATE secret key
SECRET_KEY = os.environ['SECRET_KEY'] # Instead of your actual secret key
Run Code Online (Sandbox Code Playgroud)

现在您的密钥已成功存储在本地。

更新:我发现您还可以使用config包中的方法python-decouple,这似乎更容易一些:

from decouple import config

SECRET_KEY = config('SECRET_KEY')

Run Code Online (Sandbox Code Playgroud)

现在您不需要import os或使用,dotenv因为它会为您处理这些部分并且仍将使用 .env 文件。我开始在我的所有项目中使用它。

6) 在您的主机(例如 Heroku)上添加 SECRET_KEY 环境变量。


我主要使用 Heroku 网站,因此如果您想将 Heroku 用于 Django 项目,这部分适合您。

这假设您已经安装了 Heroku 项目并在计算机上下载了 Heroku CLI。

您有 2 个选择:

  1. 从命令行/终端,您可以在项目目录中输入以下命令:
heroku config:set SECRET_KEY=yoursecretkey # Again, no quotes.
Run Code Online (Sandbox Code Playgroud)
  1. 您可以转到 Heroku 仪表板,单击您的应用程序,转到应用程序设置,然后查看“配置变量”部分,然后单击“显示变量”或“添加变量”并在其中添加您的 SECRET_KEY。

然后,当您通过 git 将项目推送到 Heroku 时,它应该可以正常工作,没有任何问题。

就是这样!

这个答案针对的是所有初学者/中级人士,希望能消除任何困惑(因为这对我来说绝对是令人困惑的)。

希望这可以帮助!

快乐编码。

  • 感谢解耦的配置方法。一个提示:您需要安装 pip install python-de Couple (而不是 pip install de Couple) (4认同)
  • 感谢您的“python-de Couple”建议。这似乎是最精确的方法。而且正如 @alexrogo 提到的,需要首先完成 `pip install python-de Couple` 。 (2认同)

Dan*_*rst 29

生产有很多选择.我这样做的方法是将我的敏感数据变量设置为生产环境中的环境变量.然后我像这样检索settings.pyvia中的变量os.environ:

import os
SECRET_KEY = os.environ['SECRET_KEY']
Run Code Online (Sandbox Code Playgroud)

另一种可能的选择是secret.py通过部署脚本复制文件.

我确信不同的Web服务器还有其他特定选项.

  • 对于linux:http://unix.stackexchange.com/questions/21598/how-do-i-set-a-user-environment-variable-permanently-not-session.对于上面的示例,您可以在`.bash_profile`,`.bash_login`或`.profile`中添加`export secret_KEY ='ABABABABABDSFJKEWLSK' - 取决于哪个存在. (2认同)
  • 我将我的密钥移至 .bash_profile 并使用 os.environ.get,它完全破坏了我的网站,尽管 `echo $SECRET_KEY` 工作正常。 (2认同)

mik*_*725 8

您应该以模块化方式存储设置.我的意思是将您的设置分布在多个文件中.

例如,您必须base_settings.py存储所有基本设置; dev_settings.py用于您的开发服务器设置; 最后prod_base_settings.py是所有的生产设置.所有非基本设置文件将导入所有基本设置,然后只更改所需的任何内容:

# base_settings.py
...

# dev_settings.py
from base_settings import *
DEBUG = TRUE
...

# prod_base_settings.py
from base_settings import *
DEBUG = FALSE
...
Run Code Online (Sandbox Code Playgroud)

此方法允许您从不同的设置中进行不同的设置.您也可以提交所有这些文件,除非在生产服务器上,您可以创建实际的生产设置文件prod_settings.py,您可以在其中指定所有敏感设置.此文件不应在任何地方提交,其内容应保持安全:

# prod_settings.py
from prod_base_settings import *
SECRET_KEY = 'foo'
Run Code Online (Sandbox Code Playgroud)

至于文件名,您可以使用您认为合适的任何文件名.我个人实际上为设置创建了一个Python包,然后将各种设置保存在包中:

project/
  project/
    settings/
      __init__.py
      base.py
      dev.py
      ...
  app1/
    models.py
    ...
  app2/
    models.py
    ...
Run Code Online (Sandbox Code Playgroud)

  • 通过在单独的文件中进行所有秘密设置是一种保护它的方式.它只是不保护,以防服务器被攻击文件受到攻击.但在这种情况下,环境变量只是易受攻击,与我所知道的任何其他方法相同.有完全保护此类信息的方法,但所有这些方法都涉及存储安全数据的第三方,然后您的服务器可以询问他们的信息,但为了确保安全,每次请求时,这些服务都会向您发送通知验证请求,使它们不是完全自动化的. (7认同)

Non*_*714 8

将秘密存储在环境中仍然会将它们放置在环境中;如果未经授权的用户获得对环境的访问权限,则可能会被利用。列出环境变量是一项微不足道的工作,而命名一个环境变量对于坏人SECRET或不需要的用户来说更加有帮助和明显。

然而,秘密在生产中是必要的,那么如何在最小化攻击面的同时访问它们呢?使用git-secret等工具加密文件中的每个秘密,然后允许授权用户读取该文件,如django 文档中所述。然后“告诉”非 root 用户该秘密,以便在初始化期间可以读入该秘密。

(或者,也可以使用 Hashicorp 的 Vault,并通过HVAC python模块访问存储在 Vault 中的秘密。)

一旦告诉这个非 root 用户,类似这样的事情就很容易了:

# Remember that './secret_key.txt' is encrypted until it's needed, and only read by a non-root user
with open('./secret_key.txt') as f:
    SECRET_KEY = f.read().strip() 
Run Code Online (Sandbox Code Playgroud)

这并不完美,是的,攻击者可以枚举变量并访问它——但在运行时很难做到这一点,而 Django 在保护其密钥免受此类威胁向量方面做得很好。

这是比在环境中存储秘密更安全的方法。

  • 谢谢你!几天来我一直在试图找出如何隐藏 SECRET_KEY ,但每个人都直接跳到“环境变量”解决方案而不质疑它。这篇文章是我第一次发现将秘密放入任何进程都可以访问的环境中存在明显的危险。我以为我要疯了。 (2认同)

Dun*_* MT 5

您应该使用专为提取敏感数据而设计的工具,而不是 if/then 逻辑。我使用 YamJam https://pypi.python.org/pypi/yamjam/。它具有 os.environ 方法的所有优点,但更简单——您仍然需要设置这些环境变量,您需要将它们放在脚本中的某个地方。YamJam 将这些配置设置存储在机器配置存储中,并且还允许按项目能力覆盖项目。

from YamJam import yamjam

variable = yamjam()['myproject']['variable']
Run Code Online (Sandbox Code Playgroud)

是基本用法。和 os.environ 方法一样,它不是特定于框架的,您可以将它与 Django 或任何其他应用程序/框架一起使用。我已经尝试了所有这些,多个 settings.py 文件,if/then 的脆弱逻辑和环境争吵。最后,我改用了yamjam,并没有后悔。


Mic*_*aël 5

我知道已经有很长时间了,但是我只是开源了一个小Django应用程序,如果它尚不存在,我会使用它来生成一个新的密钥。它称为django-generate-secret-key

pip install django-generate-secret-key
Run Code Online (Sandbox Code Playgroud)

然后,在配置/部署运行我的Django项目的新服务器时,我运行以下命令(来自Ansible):

python manage.py generate_secret_key
Run Code Online (Sandbox Code Playgroud)

它只是:

  • 检查是否需要生成密钥
  • secretkey.txt文件中生成(可以自定义)

然后,您需要做的就是在您的设置文件中:

with open('/path/to/the/secretkey.txt') as f:
    SECRET_KEY = f.read().strip()
Run Code Online (Sandbox Code Playgroud)

现在,您可以从全自动的供应过程中受益,而不必在存储库中存储静态密钥