将MySQL凭据存储在MySQL数据库中

时间:2016-02-29 23:12:01

标签: mysql database security encryption

这与" Storing MS SQL Server credentials in a MySQL Database"

类似

所以,理论上,假设我有1个MySQL服务器。我有一个"主人"数据库,然后X个其他通用数据库。我正在寻找的是一种使用应用程序的方式(为了论证,让一个网络应用程序,在php上运行)首先访问主数据库。然后,该数据库需要告诉应用程序要连接到哪个数据库 - 在此过程中,为其提供所有凭据和用户名等。

最好的解决方法是什么?

到目前为止我有三个想法

  • 将凭据存储在master数据库中以存储所有其他数据库。这些凭证当然会以某种方式加密,AES可能。该应用程序将获得加密的凭据,解密,连接。
  • 将凭据存储在其他位置 - 可能是完全独立的服务器。访问master数据库时,它会返回某种令牌,可用于访问凭据存储。再次,通过AES加密。
  • 使用某种我不知道的系统来做这件事。
  • 根本不这样做,并提出了一种完全不同的方法。

举个小例子。 "主"将包含客户列表。每个客户端都会包含它自己的独立数据库,并拥有自己的权限等。

3 个答案:

答案 0 :(得分:2)

我自己没有理由做这种事情,但你的前两个想法对我来说听起来不错(只要你包括服务器地址)甚至不一定是单独的想法(可能在服务器上有一些客户端)与主人和其他一些人一起)客户逻辑不需要关心。我能看到的唯一问题是将数据保存在" master"架构与服务器的安全数据同步。此外,我不会在主模式中保留数据库权限,因为我认为所有客户端都具有相同的权限,只是特定于其模式。如果你有'#34;权限" (设置)限制特定客户可以做什么(可能受到合同/功能支付的限制),我认为将那些客户保留在那些客户端会更容易。模式,但他们的db用户无法更改数据。

编辑:在这种情况下拥有单独的数据库用户是一个不错的主意;它可以让你更少担心来自一个用户的客户端的查询无意中(或者可能是恶意地)修改另一个用户(客户端帐户应该只有权访问他们自己的架构。)这可能是个好主意。保留" master"的代码协调(和连接)有点与客户端代码库隔离,以防止意外泄漏对该数据库的访问到客户端代码中;即使加密了,您也可能不希望他们甚至拥有对您的客户端连接信息所必需的访问权限。

答案 1 :(得分:1)

我不久前做过这样的事情。听起来您正在尝试构建某种单租户数据库的多租户系统。

将加密的凭据存储在目录数据库中很好,因为实际上没有根本不同的方法。在某些时候,无论你做什么,都需要担心存储一些秘密(加密密钥)。

在我的用例中,我能够摆脱目录刚将租户映射到db-hosts的设置。每个租户的数据库名称和凭证都是从租户的标识符(字符串)派生的。所以,给定一个TenantID T

host =无论目录说什么。
dbname =" db _" + T
dbuser = T
dbpass = sha1("一些秘密字符串" + T

从安全角度来看,这并不比在目录数据库中存储AES加密凭据更好(实际上更糟糕),因为如果有人拥有您的应用服务器,他们可以通过任何方式学习所有内容。但它非常好,易于实施。

这也很好,因为您可以考虑稍微扩展一下这个想法并完全摆脱目录服务器并编写一些将您的租户ID映射到N个数据库主机之一的函数。在您添加或删除数据库服务器之前,这很有用,然后您需要处理混乱的事情。例如,了解memcache的工作原理。

答案 2 :(得分:0)

您可以使用Vault以非常系统的方式进行此操作。实际上,这是一个强大的用例。

Percona已经在上面写了一个很棒的blog