多租户数据架构 - 共享架构 - 安全

时间:2016-05-25 13:53:24

标签: database postgresql encryption multi-tenant amazon-rds

我们正在启动的新项目需要MultiTenancy。在存储级别,这可以通过多种方式完成。 (单独的数据库/单独的模式/共享模式)

为了降低运营成本,我们认为“共享架构 - 共享表”是继续运行的最佳方式。因此,所有租户将在相同的数据库/架构架构上共享同一个表。

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

我们如何在技术上实现这一点?如果您查询表格,我们将获得大量无法解密的数据(来自其他租户的数据)。同样在Joins等中,由于其他记录在数据库中,它将具有更高的负载。

我已经在MSDN上阅读了几篇文章并观看了一些演示文稿,但是它们保持了很高的水平和抽象性。有什么想法吗? 上面描述的东西可能吗?我以为你可以在Amazon RDS上做点什么?是否有可能提供一些例子 - 例如在github上?

1 个答案:

答案 0 :(得分:0)

根据你所分享的内容,以及各行之间的一些解读,我对这种方法持谨慎态度。共享模式本身就是一种非常合理的多租户设计;我发现问题的地方在于建议使用加密。

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

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

您未提供的一个主要考虑因素是您如何提供访问权限 - 例如,您可以使用单个受信任帐户完全调解访问权限的Web应用程序?或者允许客户直接连接到数据库?在前一种情况下,您的代码无论如何都将管理所有访问,并且总是需要访问所有密钥;为什么招致开销?在后一种情况下,您可能会将数据库渲染为客户无法使用,因为所有标准查询工具都难以使用。

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

了解一些常用的应用程序框架以了解更多信息:Rails提供了Apartment gem(https://github.com/influitive/apartment); Django有django-tenants图书馆(http://django-tenants.readthedocs.io/en/latest/); Hibernate有一个可插入的租户框架(例如,https://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/ch16.html

希望这有帮助。