2

在 Django 项目中,我想让用户上传的文件在服务器上保持安全。这应该在操作系统级别(我们使用的是 ubuntu)还是在应用程序级别完成?

应用程序级别的加密将更易于维护。但是,除了可能对性能产生负面影响等一些缺点之外,我什至不确定这是否有任何意义。如果黑客攻破了服务器,他也可以访问加密密钥以及加密/解密的方式。

非常感谢任何建议。谢谢。

4

2 回答 2

3

您如何保护您的数据取决于您要防范的攻击类型。当然,您可能不知道攻击者最有可能破坏您的系统的方式,除非您特别试图防范某些威胁模型,例如流氓系统管理员。

攻击者可能会获得对运行 Web 服务器的操作系统的访问权限。在这种情况下,文件系统级加密可能对您没有好处。事实上,文件系统级加密可能只是防止有人离开物理服务器(这是一个完全有效的威胁模型)的有用保护。但是,如果使用存储在数据库中的密钥对文件进行加密,则可以阻止有权访问网络服务器操作系统但不能访问数据库的攻击者。

相反,攻击者可能会通过应用程序中的漏洞访问数据库而不是操作系统。我希望这种可能性不大,因为现代操作系统存在巨大且经过充分研究的攻击面。

要保护您的用户数据免受对您的服务器具有完全访问权限的攻击者的攻击是非常困难的。您需要使用服务器没有的密钥加密数据。这可能类似于存储在用户 cookie 中的密码或密钥。所有这些方案的问题在于,不能信任用户保留这样的关键数据——如果他们忘记了,他们总是想要一种方法来重置密码。在大多数情况下,保护数据免受对您的操作系统和数据库具有完全访问权限的攻击者的攻击是不现实的。

所以我会选择你想要保护的东西。就个人而言,我希望操作系统渗透最有可能,因此使用隐藏在以某种方式受到额外保护的数据库的一部分的密钥加密文件。这里的挑战是操作系统必须存储数据库登录凭据(在 中settings.py)才能使 Web 应用程序运行。因此,请尝试在操作系统中尽可能限制这些文件,即chmod 600在尽可能少做其他事情的用户帐户上。

于 2011-08-11T06:36:36.310 回答
1

你是对的,如果用于加密文件的密钥存储在服务器上,你不会通过加密文件获得很多额外的安全性。

但是,如果您使用用户提供的密钥,那么您确实获得了一些安全性。例如,如果您将加密密钥存储在 cookie 中,那么它将仅在每个请求期间可用。我不相信这会产生任何的安全问题(如果攻击者可以窃取 cookie,他们也可以窃取用户的会话),并且这将使攻击者更难访问属于非用户的文件目前在线。

如果你真的很偏执,你可以像 1Password 一样,将加密数据发送回浏览器,浏览器可以使用 JavaScript 加密例程对其进行解密……</p>

于 2011-08-11T06:06:22.590 回答