在使用共享数据库的多租户应用程序中保护和分离敏感数据的最便宜且与PaaS无关的方法是什么?
一些背景信息和更具体的问题:
我们是一家小型创业公司。我们已成功为客户启动了Intranet Web应用程序项目,现在我们已准备好为类似客户提供云解决方案。
由于我们使用的是Microsoft BizSpark计划,因此我们正在调查Azure App Services。我们稍后可能会迁移到云服务,但目前似乎App Services已经足够了。尽管如此,我们还是不想过多地将自己绑定到Azure,以防我们以后想要转移到其他SaaS提供商。
我们的应用程序将存储一些应受到保护的敏感信息。为每个租户单独加密(Azure提供透明加密)数据库将提供最大的安全性,但我们没有这种解决方案的预算,并且很难自动管理。
目前我们的计划是,我们将为客户提供在我们的通配符域下注册子域,然后在内部将子域映射到将在每个表中使用的租户ID。
对于初创公司来说,这似乎是最具成本效益的解决方案,因为每个额外的租户都没有额外的管理,注册可以完全自动化。我知道我们必须非常小心地在每个SQL请求中强制使用租户ID(使用SQL视图和带有内置租户ID查询的存储过程将有所帮助),但这显然是不够的。我们需要一些机制来用一些加密密钥来保护每个租户的敏感数据。
然后出现了一些问题:
我们是否应该为所有租户的所有敏感数据使用单个加密密钥?或者我们是否应为每个租户分别设置一个密钥?
如果我们选择单独的密钥(在注册时随机生成,因此即使对我们来说也不会知道密钥),那么谁和如何存储和保护租户加密密钥?我们是否应该向租户提供密钥,然后要求其员工在每次通过网络浏览器登录时提供每个员工登录名和密码的密钥?
考虑到我们以后可能需要进行分片或“弹性”数据库扩展,因为有些PaaS提供商会调用它,并且我们可能会从Azure和Microsoft SQL Server迁移到其他地方,那么哪种方法最有效?
如果有人有多租户的经验,那么数据库保护,我真的很感激一些建议,一些做,不做和可能的警告。我已经阅读了一些关于该主题的文章,但它们通常对PaaS平台过于具体,或者没有解释可能的后果和困难,但这些知识仅来自日常经验,试验和错误。
答案 0 :(得分:1)
为了完整性而添加一些答案(2年后):
我们是否应该为所有租户的所有敏感数据使用单个加密密钥?或者我们应该为每个租户分别设置一个密钥吗?
每个租户都应该有一个单独的密钥。不确定Azure是如何做到的,但AWS对此用例<{p}}有KMS
如果我们选择单独的密钥(在注册时随机生成,因此即使对我们来说也不会知道密钥),那么谁应该如何存储和保护租户加密密钥?我们是否应该向租户提供密钥,然后要求其员工在每次通过网络浏览器登录时提供每个员工登录名和密码的密钥?
使用KMS(或其他类似的东西,像Square's keywhiz这样的自行开发的解决方案)。您无需将钥匙交给租户。你关心的是 - 如果用户使用他们的密码(或SSO)进行了身份验证,根据他们的权限,他们可以访问一些资源。
考虑到我们以后可能需要进行分片或“弹性”数据库扩展,而某些PaaS提供商会调用它,并且我们可能会从Azure和Microsoft SQL Server转移到其他方式,那么哪种方法最有效?
您需要一个tenantId
来帮助进行数据隔离。现在,链接到tenantId的实际数据可以根据存储在KMS中的密钥进行加密。