具有多个数据库的 SQL Server(每个客户端一个) - 就登录/用户/权限而言,最佳安全实践是什么?

SQL*_*Guy 6 authentication security sql-server multi-tenant

我们有多个 SQL Server,每个 SQL Server 拥有数十个数据库 - 每个客户端一个(在这种情况下,客户端意味着一个客户组织)。这些数据库是通过应用程序访问的,但该应用程序当前使用单个 Windows 登录。因此,这会产生安全风险,即如果存在某些应用程序漏洞,理论上可以访问“其他”客户端的数据库。

处理这种情况的最佳方法是什么?

我们是否应该为每个客户端创建单独的登录名并让应用程序使用单独的登录凭据进行连接?这将降低安全风险,但会产生大量的管理开销(这可能是值得的)。

后续问题是:在这种情况下我们应该使用 Windows AD 安全性还是 SQL Server 身份验证。

我很感激任何建议!

Phi*_* W. 11

我们是否应该为每个客户端创建单独的登录名并让应用程序使用单独的登录凭据进行连接?

简短回答:是的。

您已将每个客户端的数据隔离到一个单独的数据库中,因此现在您还需要隔离对这些数据库的访问。

这将降低安全风险,但会产生大量的管理开销(这可能是值得的)。

“重要的”?
您多久接待一次新客户?
如果答案是“很多”,那么您真的需要考虑一些自动化来帮助您,在这里。

后续问题是:在这种情况下我们应该使用 Windows AD 安全性还是 SQL Server 身份验证。我很感激任何建议!

使用 SQL Server 身份验证的一个优点是(或者至少过去)使用脚本创建 SQL Server 帐户要容易得多(尽管 PowerShell 做了很多工作来平衡特定的“竞争环境”)。您可以通过脚本创建数据库帐户(和密码)以及使用该帐户的应用程序配置,而无需手动创建域帐户。

  • 在我看来,每个客户端 1 db 是可行的方法,也非常适合 Azure sql db 弹性池。是的,您还需要隔离数据库访问 (2认同)
  • @SQL_Guy FWIW,如果您当前只有“*数十个数据库*”,我认为您高估了开销。当我曾经在一家每个客户端一个数据库的 SAAS 公司工作时,我们总共有大约 1,000 个客户端数据库,分布在两个不同的服务器上,遵循 Phil 的答案建议的类似安全配置。我们可能每周左右都会增加一个新客户。即使在那时,管理此实施的开销也是最小的。 (2认同)

Tib*_*szi 5

我认为没有提到的一个选项是包含用户(包含身份验证、部分包含数据库,无论你想怎么称呼它)。

您没有登录信息。您可以拥有一个带密码的 SQL 用户,也可以创建一个基于 Windows 帐户的用户。或者,在 Azure 中,如果您有“来自外部提供商”的 AAD。

现在您不再需要登录,可以更轻松地移动数据库。而且,这是在 Azure SQL 数据库中执行此操作的“自然”方式。

https://learn.microsoft.com/en-us/sql/relational-databases/databases/contained-databases