2010-08-22 95 views
22

默认情况下,Django数据库主机/用户/密码以明文形式存储在项目settings.py文件中。数据库凭证以纯文本格式存储可以吗?

我似乎目前似乎没有想到更好的方法,但这似乎违背了密码存储的最佳实践。诚然,如果攻击者有权访问设置文件,那么所有文件可能已经丢失。即使该文件被加密,攻击者也可能有办法解密它。

这样好吗?

回答

22

你是对的。但您可以通过以下方式提高安全性:

  • 正确设置权限(这取决于您的设置)。理想情况下,只有python应该能够读取文件。

  • 将文件存储在wwwhtdocs根之外。如果此时攻击者仍然可以访问它们,则无论如何都会被拧紧。

  • 为了增加安全性,您可以使用对称加密(例如:AES)加密连接设置。将密钥存储在其他地方。所以即使有人设法访问连接设置,他们仍然需要找到密钥。主要缺点是现在你必须重写连接方法。

+4

有没有扩展/重写连接方法来处理加密的例子?而且,在unix环境中,如果盒子本身已经被破坏,是否有安全的地方可以保存这个密钥? – 2013-01-02 18:41:33

2

是的,它是任何数据库通信程序的标准程序。真的没有一个“更好的方法”来做到这一点。

有几种方法可以帮助防止无效主机连接(IP表,私有IP地址),但实际的连接细节几乎总是纯文本。

将文件存储在Web根目录之外将有所帮助,但如果攻击者访问文件系统,则无关紧要。

12

Twelve-Factor App通过的Heroku recommends

严格从代码配置的分离编纂。

这对于凭证的管理尤为重要,凭证的管理理想情况下不应该提交给源代码管理。

django-environ库提供了一个很好的方法来将settings.py文件中的大多数特定于环境的配置拉出来,但您可以通过使用标准os库引用最敏感的位来实现很长的路。 'PASSWORD': os.environ['DBPASS']

当然,你可能仍然会存储一些密码以纯文本地方,但如果该文件未嵌入代码库,这是不太可能被泄露。

相关问题