把秘密钥匙放在外面

新手上路,请多包涵

local_settings.py 反模式的原因之一是将 SECRET_KEY、AWS 密钥等值放入设置文件中有问题:

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

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

原文由 user2015666 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 369
1 个回答

最初的问题是关于如何在环境变量中保密。这在《 Two Scoops of Django 》一书中进行了广泛讨论。以下是他们所说内容的摘要,然后是关于使用此技术的警告。

从 1.11 版本的第 48 页(第 5.3 节)开始:

Django(和 Python)支持的每个操作系统都提供了创建环境变量的简单功能。

以下是使用环境变量作为密钥的好处:

  • 将设置保密允许您毫不犹豫地将每个设置文件存储在版本控制中。您所有的 Python 代码都应该存储在版本控制中,包括您的设置。
  • 每个开发人员都不必维护自己复制粘贴的 local_settings.py.example 版本进行开发,而是共享相同的版本控制 settings/local.py 。
  • 系统管理员可以快速部署项目,而无需修改包含 Python 代码的文件。
  • 大多数平台即服务建议使用环境变量进行配置,并具有用于设置和管理它们的内置功能。

在下一页,本书继续:

在开始设置环境变量之前,您应该具备以下条件:

  • 一种管理您要存储的秘密信息的方法。
  • 很好地了解 bash 设置如何在服务器上工作,或者愿意让您的项目由平台即服务托管。

他们描述了如何在本地和生产环境中设置环境变量(以 Heroku 为例——您需要检查您是否使用不同的主机,这只是一种可能性):

如何在本地设置环境变量

导出 SOME_SECRET_KEY=1c3-cr3am-15-yummy

如何在生产中设置环境变量

heroku 配置:设置 SOME_SECRET_KEY=1c3-cr3am-15-yummy

最后,在第 52 页,他们给出了如何访问密钥的说明。例如,您可以将下面的前两行放在您的设置文件中,以替换默认情况下放置在那里的原始密钥字符串:

 >>> import os
>>> os.environ['SOME_SECRET_KEY']
'1c3-cr3am-15-yummy'

此代码段只是从操作系统获取 SOME_SECRET_KEY 环境变量的值,并将其保存到名为 SOME_SECRET_KEY 的 Python 变量中。

遵循这种模式意味着所有代码都可以保留在版本控制中,并且所有秘密都保持安全。

请注意,这在某些情况下不起作用,例如,如果您使用的是 Apache 服务器。要处理这种模式不起作用的情况,您应该查看他们的书的第 5.4 节(“当您不能使用环境变量时”)。在这种情况下,他们建议使用秘密文件。

截至 2017 年底,这种在环境变量中存储秘密的技术是 Two Scoops 和 Twelve Factor App 设计模式中推荐的最佳实践。 Django 文档也推荐使用它。但是,存在一些安全风险:如果某些开发人员或某些代码可以访问您的系统,他们将可以访问您的环境变量,并可能无意中(或有意地)将它们公开。这一点是由 Michael Reinsch 在这里提出的:

http://movingfast.io/articles/environment-variables-considered-harmful/

原文由 Russia Must Remove Putin 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题