2016-05-25 85 views
0

我们启动的一个新项目需要MultiTenancy。在存储层面,这可以通过多种方式完成。 (单独的数据库/不同的模式/共享模式)多租户数据架构 - 共享模式 - 安全

为了保持运营成本下降,我们认为,“共享模式 - 共享表”是继续的最佳途径。因此,所有租户将在同一个数据库/模式模式上共享相同的表。

但是一个约束是提供良好的租户隔离和安全性。为此,我们可以使用加密。如果我们能够为每个租户提供自己的密钥对,那么我们提供了良好的安全性和良好的隔离性。每个租户只能读取他自己的数据,而且我们也不必在每个表中添加鉴别器字段。

我们如何才能在技术上实现这一点?如果你查询你的表格,我们会得到很多我们无法解密的数据(来自其他租户的数据)。同样在连接等,它会有更高的负载,因为其他记录在数据库中。

我已经看过一些在MSDN上的文章和观看一些介绍,但他们保持相当高的水平和抽象的。对此有何想法? 就像上面描述的那样可能吗?我以为你可以在Amazon RDS上做些什么?有没有可能提供一些例子 - 例如在github上?

回答

0

根据您分享的内容以及两行之间的一些阅读内容,我对此方法非常谨慎。就共享模式本身而言,这是一个非常合理的多租户设计;我看到的问题是建议使用加密。

虽然PostgreSQL在不支持加密,它通过pgcrypto模块中的功能来完成。 RDS作为PostgreSQL的托管服务,也增加了轻松配置加密卷的能力,但对于数据库用户/开发人员来说,它看起来几乎相同。

文档建议使用pgcrypto,如果您只需要对不需要过滤或加入的小数据子集进行加密 - 但不清楚您要加密多少数据。如果只有少数几列,并且不需要过滤它们,这可能会起作用。否则,重新考虑 - 广泛使用pgcrypto函数将使几乎所有标准数据库操作都无法实现效率低下。 where子句需要解密列,然后需要扫描/解密整个表;将不会使用索引。你的表现会很快慢慢爬行。

你没有提供的一个主要考虑的是你如何提供访问 - 例如,一个Web应用程序,在这里你完全单一的,值得信赖的帐户调节访问?或允许客户直接连接到数据库?在前一种情况下,您的代码无论如何都会管理所有访问,并且始终需要访问所有密钥;为什么会产生开销?在后一种情况下,您可能会将数据库呈现给客户,因为所有标准查询工具都很难使用。

更广泛地说,在我的经验,一个模式,每个租户的方法可以提供隔离,效率和开发成本之间的良好平衡。通过明智地使用PostgreSQL中的角色,您可以对直接访问实施合理的访问控制(您可以对行执行相同的操作,尽管在我看来,需要更多开销才能正确管理)。

看看一些常用的应用框架,以了解更多的:Rails的提供公寓宝石(https://github.com/influitive/apartment); Django有django-tenant库(http://django-tenants.readthedocs.io/en/latest/); Hibernate有一个可插拔的租户框架(例如,https://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/ch16.html

希望这会有所帮助。