1

我是一名长期程序员,但很少进行数据库设计。所以我正在寻求一些关于我正在开发的解决方案的反馈。

描述

我将有几个(10 到 20 个)客户在我的远程服务器上存储敏感数据。客户是拥有用户的组织。访问是通过运行在访问 MySQL 服务器的服务器上的 java 软件来完成的。一个单独的客户端 java 程序访问服务器并进行交换。

数据隐私非常重要,因此我计划为每个客户建立一个单独的数据库(模式)。在每个数据库中都有三个用户级别:输入、查询和管理员。用户适合其中一个级别并获得数据库的各种权限。我打算用存储过程做所有事情,所以他们真的可以访问特定数据库上的一组存储过程。

最大的挑战是客户的管理员用户必须能够添加(或删除)只能访问客户数据库的其他用户。用户对于数据库应该是唯一的,而不是 MySQL 实例。例如,每个客户都应该有一个名为“bob”的用户。

问题

所以我目前有两种方法可以解决这个问题。我目前更喜欢的是让每个用户都是一个真正的 MySQL 用户,可以拥有特权。这确保他们只能在 MySQL 级别执行他们的角色指定的内容。问题是名称冲突,因为 MySQL 用户名对所有数据库都是全局的。我通过有一个“根”表来解决这个问题,该表将用户的 customerID(每个客户唯一,而不是每个用户唯一)映射到数据库,然后该数据库中的表将用户名映射到用户 ID,然后是实际的 MySQL 用户. Java 服务器软件将使用映射的用户 ID 和用户密码连接到数据库,并开展业务。这样做需要付出很大的努力和跳跃,但从安全的角度来看,我喜欢它。

另一种方法是在 DB 中有几个基本用户供 Java 软件连接,然后通过在每个客户的 DB 中存储用户名和密码来编写我们自己的身份验证。由软件来确保只修改正确的数据库,只调用正确的函数等,因为 MySQL 中没有任何东西可以阻止它。基本用户必须拥有所有用户类型的所有权限,因此 Java 软件中的软件故障或妥协可能会对数据库造成不利影响。使数据库更容易,但软件更复杂一些。

反馈

那么有没有数据库老手对此有一些反馈?有没有人以更好的方式解决了这样的问题?在我们承诺某事之前尝试获得一些想法。

谢谢,马特

4

1 回答 1

1

另一种方法是在 DB 中有几个基本用户供 Java 软件连接,然后......

使用 LDAP 存储用户、模式关联、权限、角色、授权等。

始终由软件决定——通过授权规则——确保只修改正确的数据库,只调用正确的函数等

基本用户必须拥有特定用户类型的适当权限,

因此,Java 软件中的软件故障或妥协可能会对数据库造成不利影响。

这总是正确的。所以使用测试来防止这个神秘的“故障”。

数据库并非神奇地“更安全”或神奇地“更少受软件故障的影响”。数据库安全性与应用程序安全性一样值得信赖。两者都与行政程序和人为因素一样值得信赖。

使用应用程序级授权。使用 LDAP。

不要将神奇的力量归咎于 RDBMS 授权方案。他们不是“更好”或“更值得信赖”。

应用程序授权检查——在大多数语言和框架中——是单行代码装饰器(或 if 语句),明确定义了哪些用户组可以访问该功能。这并不难。它不受“故障”的影响。

于 2011-09-22T22:12:44.390 回答