我假设这是一个关于为“软件即服务”风格的应用程序构建“多租户架构”的问题。
第一个问题是分离数据库可能是一个好主意,也可能不是一个好主意——但这不是第一个要问的问题。可以在重要级别访问您的数据库的人已经以极具破坏性的方式渗透到您的应用程序 - 他们几乎可以肯定地在您的数据库服务器上执行任意命令。这意味着您不仅要处理一个帐户的损坏,还要处理整个基础架构的损坏。这是一个“熄灯”的时刻,您必须在恢复时关闭整个系统。
如果他们没有在您的数据库服务器上建立外壳,则意味着存在应用程序层安全问题 - SQL 注入,或者在您的身份验证方案中升级权限的某种方式。同样,两者都是“熄灯”时刻。
所以,确保所有这些东西都被完全覆盖。在您的开发生命周期中包括安全测试;考虑使用自动化渗透测试工具作为持续集成系统的一部分。确保基础设施人员强化整个环境,并在接近发布候选时考虑进行第 3 方安全审计。考虑一个专注于安全问题的代码审查过程,并就特定的安全考虑因素达成一致的编码标准。告诉您的所有开发人员有关跨站点脚本、SQL 注入和其他应用程序级漏洞的信息。
一旦你完成了所有这些,你就锁上了门并栓上了窗户;您的数据库策略相当于您如何保证珠宝的安全。
单独的数据库提供了一些额外的安全性——但前提是您有相应的用户管理策略。在大多数网络应用程序中,只有两种类型的用户:“管理员”和“网络应用程序”。“管理员”可以创建/修改数据库(创建数据库、表、视图等),通常还可以修改数据。“Web 应用”应该只有数据修改权限,而没有修改数据库对象的权限。
为了使数据库拆分有意义,您必须确保:
- 可以访问您的 Web 应用程序文件系统的攻击者无法访问有效的用户名和密码,或者如果他们可以,只能访问一个客户端。
- 攻击者永远无法访问“管理员”凭据
但是,拆分数据库还有其他原因(除了安全性之外)。它降低了人为错误的风险,允许您在更细粒度的级别扩展系统,并允许您提供不同级别的托管(“黄金”用户拥有自己的服务器,“白银”用户拥有自己的数据库,“青铜” “抓住他们的机会)。
要实现这一点,您必须解决的大问题是部署——您将如何部署新版本的代码以及对数据库的更改?这反过来又可能使测试过程复杂化。