保持数据库信息安全

时间:2009-11-08 17:19:44

标签: mysql database security

这是一个我无法解决的有趣问题。如果你帮助我,我会很高兴的。
就是这样:
有许多客户端应用程序将数据记录发送到一个MySQL服务器 很少有数据记录不是很重要,但整个数据库都是。 (你可以想象它是facebook DB :))
有没有办法确保

  • 来自DB的数据不会被任何人使用,只有真正的所有者
  • DB将保留基本功能,例如排序等。

假设攻击者可以神秘地获得对服务器的完全访问权限? 您不能简单地加密客户端数据并将其加密存储,因为客户端应用程序广泛传播,攻击者可以从中获取密钥。
也许在应用程序和数据库之间添加一些层,或者在客户端和服务器端组合加密方法(使用mysql内置方法)会有帮助吗?

4 个答案:

答案 0 :(得分:3)

只要数据库需要启动并无人值守运行,您就无法从受损的root帐户隐藏密钥(='神秘的完全访问权限')。数据库可能存储主密钥的任何地方,根也将具有访问权限。任何数量的业务层或客户端 - 服务器加密的组合都不会绕过这个简单的事实。你可以将它混淆到第二天,但如果奖金值得,那么root可以得到它。

一种替代方案是需要手动辅助的启动过程,即。一个人在服务器启动(或硬件模块PIN)期间输入主密钥密码,但这在现实世界中极难维护,它需要一个高度信任的员工进行寻呼机呼叫登录并启动数据库,只要有停机时间。

TPM这样的解决方案提供了防止服务器物理丢失的保护,但不能防止受损的root用户。

您的root与数据库主密钥一样重要,因此您必须使用与密钥相同的保护来保护root。这意味着设置操作过程,筛选有权访问root用户,旋转root密码等等。有人获得“神秘完全访问”的那一刻,游戏几乎丢失了。

答案 1 :(得分:2)

我非常同意Remus Rusanu的回答。

保持良好的安全性很难,但您可以随时关注自己的工作。当您访问敏感信息时,请仔细验证您的查询,并确保不会欺骗或利用它来访问给定客户端无法访问的信息。

如果攻击者能够对该框进行物理访问,那么您可以采取一些措施来加强安全性。首先,我将ssh访问配置为仅允许来自特定IP或IP范围的连接(当然没有root访问权限)。您也可以在防火墙上执行此操作。这意味着最薄弱的环节是您的服务器(从客户端接收数据/请求的应用程序,可能是Web服务器以及您使用的任何脚本)。现在你“只是”必须确保没有人可以利用你的服务器。您可以采取更多措施来强化您的系统,但它认为在ServerFault上提问更合适。

如果您担心PC的物理访问权限,那么您可以做的事情并不多,Remus的答案中已经提到了大部分内容。

还有另一种选择。这是迄今为止从速度和易用性开发观点最无效的方法,但它可以部分保护您免受任何类型的服务器攻击(包括物理攻击) 。它实际上非常简单,但实现起来有点困难 - 只将加密数据存储在数据库中,并使用javascript或flash处理所有加密/解密客户端。只有客户端才能拥有密钥,数据将始终通过网络传输并以加密格式存储。最大的缺点是,一旦客户忘记了密钥,就无法回复,数据无法访问。

当然,这都是时间,金钱和努力的问题 - 这些事情中的任何一件都可以被打破。

答案 2 :(得分:0)

我不知道MySql中是否存在这样的东西,但Oracle中的行级版本控制使您能够在行级 IN 数据库中定义访问权限:这意味着,无论如何使用什么工具来访问数据时,用户只能看到由他/她的凭据确定的相同选择。

因此,如果我的用户名/角色只允许查看受某些WHERE子句限制的数据,那么它可以附加到数据库中出现的每个SELECT,无论它是来自Web应用程序,SQL查询工具,或者其他什么。

答案 3 :(得分:0)

我会在它们之间使用第二层和一个冷壁。 所以你有防火墙----网络服务器---防火墙 - 第二层服务器--- firewll --- db

在层之间使用不同的平台是明智的,这取决于数据的重要性。 无论如何 - Web服务器应该无权访问DB。

关于保留排序 - 如果你使用文件encrypotion mechisim - 它只会保护你免受硬盘驱动器的影响。 如果你自己加密数据,如果你聪明地做(将密钥存放在一个单独的地方),你将不会松散排序,因为你会寻找加密条目而不是真正的条目 - 但现在你有另一件事需要保护....