在MySQL数据库中存储MySQL凭据

3

这是一个类似于 "在MySQL数据库中存储MS SQL Server凭据" 的问题。

理论上,假设我有一个MySQL服务器。我有一个“主”数据库,以及X个其他通用数据库。我的目的是想要使用一款应用程序(举例来说,一个基于PHP运行的Web应用程序)首先访问主数据库。该数据库随后需要告诉该应用程序连接到哪个数据库,并在此过程中提供所有凭据和用户名等信息。

有什么最佳方法可以解决这个问题呢?

目前我已经想到了三种方法:

  • 将凭据存储在主数据库中,供所有其他数据库使用。这些凭据当然会以某种方式进行加密,可能是AES。应用程序将获取加密的凭据,解密并连接。
  • 将凭据存储在其他地方 - 也许是完全独立的服务器。当访问主数据库时,它返回某种令牌,该令牌可用于访问凭据存储。同样,通过AES进行加密。
  • 使用我不知道的某种系统来完成这个任务。
  • 完全不这样做,并提出完全不同的方法。

举个例子,“master”将包含客户列表。每个客户都将包含其自己的单独数据库,具有自己的权限等。


这可能只是我的感觉,但我认为您需要澄清“凭据”一词的含义。您是在谈论将MySQL数据库用户帐户存储在主模式中,还是客户端“应用程序用户”帐户?(即您管理的用户或您的客户应该理想情况下管理的用户?) - Uueerdo
我主要感到困惑的是,如果你在谈论数据库用户帐户,我不明白为什么你需要在“master”数据库中指定任何权限;这些应该由数据库本身管理。你提到的原始问题似乎与此无关。 - Uueerdo
抱歉,也许我解释得太多了。我在谈论mysql连接细节。例如主机、用户名、密码和数据库名称。这些将存储在主数据库中。应用程序将始终连接到相同的主数据库 - 但然后根据从主数据库检索到的详细信息连接到不同的数据库。 - verenion
在这种假设的情况下,是的,但我想主数据库可以简单地存储主机,然后应用程序连接到不同的主机。虽然这不是我的意图。 - verenion
我可以只使用同一个用户来访问所有数据库,这样主服务器就不必存储用户名和密码。但这听起来像是一个糟糕的妥协。也许需要更多的思考。 - verenion
显示剩余2条评论
3个回答

2
我自己没有这样做的理由,但你的前两个想法听起来不错(只要包括服务器地址),甚至不一定是独立的想法(可以在服务器上有一些客户端和主控端,而其他一些客户端则在其他地方),客户端逻辑不需要关心。我唯一能想到的问题是保持“主控”模式下的数据与服务器安全数据同步。此外,我不会在主控模式下保留数据库权限,因为我认为所有客户端都具有相同的权限,只是特定于其模式。如果您有限制特定客户端操作的“权限”(设置)(例如受合同/功能支付限制),我认为将这些内容保留在该客户端的模式中会更容易,但是他们的数据库用户无法更改数据。
编辑:在这种情况下,拥有单独的数据库用户是一个不错的想法;它将让您少担心来自一个用户客户端的查询意外(或者可能是恶意的)修改另一个用户的查询账户(客户端帐户应仅具有访问其自己模式的权限)。最好将“主控”协调(和连接)的代码与客户端代码库分开以防止意外泄露对该数据库的访问权限进入客户端代码;即使加密,您也可能不希望它们比必要的更多地访问您的客户端连接信息。

1
我不久前也做过类似的事情。听起来你正在尝试构建某种每个租户一个数据库的多租户系统。
在目录数据库中存储加密凭据是可以的,因为实际上没有根本不同的方法来做到这一点。无论你做什么,都需要担心存储某些机密(你的加密密钥)。
在我的用例中,我能够使用一个目录将租户映射到数据库主机。每个租户的数据库名称和凭据都是从租户的标识符(一个字符串)派生出来的。所以给定一个TenantID T:
host = 不管目录说什么。 dbname = "db_" + T dbuser = T dbpass = sha1("some secret string" + T)
从安全角度来看,这比在目录数据库中存储AES加密凭据要差一些,因为如果有人拥有你的应用服务器,他们可以学到任何一种方式。但它非常好,并且易于实现。
这也很好,因为你可以考虑扩展这个想法,完全摆脱目录服务器,并编写一些函数,将你的租户ID映射到N个数据库主机之一。这样做非常好,直到你添加或删除DB服务器,然后你需要处理重新排列事物。例如,查看memcache的工作原理。

0

您可以使用Vault以更系统化的方式完成此操作。实际上,这是一个强有力的用例。

Percona已经在博客中对此进行了很好的阐述,


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接