Django SECRET_KEY 安全性,方法如何更安全

信息安全 Python django
2021-09-02 03:35:25

我即将将我的 Django 应用程序部署到被称为“互联网”的敌对环境中,并且我正试图更好地理解 Django 的后果SECRET_KEY标准程序之一似乎是保护settings.py. 很公平。到目前为止,文档说不要将您的密钥提交给 SVN、CVS 等......因为这可以轻松访问您的密钥。但是,如果有人想将密钥提交到他们的仓库,这将表明密钥是静态的(参见问题 #4)?

无论如何,这是我的问题:

  1. 将密钥存储为环境变量如何比直接存储更安全settings.py例如,如果攻击者可以阅读settings.py,他很可能只需要输入$ echo $DJANGO_SECRET_KEY
  2. 将密钥存储在文件中如何比直接存储更安全settings.py如果他会读书settings.py,他可能会读书django_secret_key.txt
  3. 如果攻击者破坏了你的机器,他们不能简单地用settings.pyto加载 python 解释器> print settings.SECRET_KEY吗?
  4. 最后,每次重新启动网络服务器进程时随机生成密钥是否是一种不好的做法?这可能是完全随机的,也可能提示用户输入密钥。显然,如果攻击者自己可以重新启动 Web 服务并输入他选择的密钥,则后者会呈现出严重的弱点。
1个回答

一旦攻击者已经可以访问系统,就为时已晚。不泄露密钥的主要问题是因为它经常被用作散列和签名会话的种子。这个想法是您的生产SECRET_KEY需要与您的开发或登台完全不同SECRET_KEY您实际上可以在每次重新启动时随机生成它,尽管这可能会影响用户体验(请参阅下面的详细信息)。

只要您坚持更改密钥的原则,无论您是否提交(只要您确保从 dev 到 prod 时更改它)都没有太大的危险。如果你不这样做,那么拥有密钥的人可以预测散列算法的结果(用于会话)甚至签署会话。

如果攻击者已经获得了对您系统的访问权限,那么您已经走得太远了,因为它不再是您的系统了。您需要确保的一件事是,您的设置文件的文件权限只能由运行网络服务器的用户读取,其他任何人都不能读取。这可以防止非法访问受限帐户(与网络服务器帐户不同)的人泄露您的密钥。

Stack Overflow 上有一个很好的答案:Django SECRET_KEYsberder编写,详细说明了它的用途:

实际上,这里列出的许多项目都SECRET_KEY使用django.utils.crypt.get_random_string()它来为随机引擎播种。这不会受到 值变化的影响SECRET_KEY

价值变化直接影响的用户体验包括:

  • 会话,数据解码将中断,这对任何会话后端(cookie、数据库、基于文件或缓存)都有效。
  • 已经发送的密码重置令牌将不起作用,用户将不得不要求一个新的。
  • 评论表单(如果使用django.contrib.comments)将不会验证是否在值更改之前请求并在值更改之后提交。我认为这非常小,但可能会让用户感到困惑。
  • 消息(来自django.contrib.messages)不会在与评论表单相同的时间条件下验证服务器端。