我们有多个 SQL Server,每个 SQL Server 都有几十个数据库——每个客户一个(在这种情况下,一个客户意味着一个客户组织)。这些数据库通过一个应用程序访问,但该应用程序当前使用单个 Windows 登录名。因此,这会产生安全风险,即如果存在某些应用程序漏洞,理论上可以访问“其他”客户端的数据库。
处理这种情况的最佳方法是什么?
我们是否应该为每个客户端创建一个单独的登录并让应用程序使用单独的登录凭据进行连接?这将降低安全风险,但会产生大量管理开销(这可能是值得的)。
后续问题是:在这种情况下我们应该使用 Windows AD 安全还是 SQL Server 身份验证。
我感谢任何建议!
简短的回答:是的。
您已将每个客户的数据隔离到一个单独的数据库中,因此现在您还需要隔离对这些数据库的访问。
“重要的”?
您多久接待一次新客户?
如果答案是“很多”,那么您真的需要在这里考虑一些自动化来帮助您。
使用 SQL Server 身份验证的一个优点是(或者,至少过去)使用脚本创建 SQL Server 帐户要容易得多(尽管 PowerShell 在平衡特定的“竞争环境”方面做了很多工作)。您可以通过脚本创建数据库帐户(和密码)和使用该帐户的应用程序配置,而无需手动创建域帐户。
我认为没有提到的一个选项是包含用户(包含身份验证、部分包含数据库,随便你怎么称呼它)。
您没有登录信息。您有一个带密码的 SQL 用户,或者您创建了一个基于 Windows 帐户的用户。或者,在 Azure 中,如果您有“来自外部提供商”的 AAD。
现在您没有登录的依赖性,可以更轻松地移动数据库。而且,这是在 Azure SQL 数据库中执行此操作的“自然”方式。
https://learn.microsoft.com/en-us/sql/relational-databases/databases/contained-databases
我猜,这就是对该问题投反对票的原因。这是一个非常糟糕的组织决定。但是,如果您的“客户”实际上是一群人 - 例如部门,那么是的,这种方法可能有一些优点。如果您的案例中的“客户”是个人 - 请重新考虑!有大量以 Access 和 sqlite 开头的单用户数据库,SQL Server 不是适合个人数据库的 DBMS。
一旦解决了这个有争议的问题...
多数据库服务器的安全方法与单个数据库基本相同。根据需要在服务器上创建尽可能多的
login
s(每人一个)。但是分配每个login
默认数据库,如果需要,将其添加login
到user
其他数据库。最好(至少从用户的角度来看)使用 Windows AD 安全而不是 SQL Server 自己的。因为在这种情况下,
login
变成类似于“mycompany/personid”的东西,您只需login
根据需要将其添加到特定数据库即可。但实际用户将不再需要“登录”到数据库。对于 DBA 使用域安全性也更容易,因为如果一个人忘记了他/她的密码 - 域管理员将处理它,而不是数据库管理员......但是从所有其他 DBA 的角度来看 - 域或服务器安全性没有太大区别.
这也是非常糟糕的决定。应用程序根本不应使用任何登录名,而是要求用户提供凭据。它们可以通过使用域登录来隐藏,但它仍然是个人登录。
如果你真的需要一个应用程序(比如预定的机器人)在没有人在场的情况下进行登录——这通常是通过在域中创建一个特殊用户来完成的——这个应用程序是特定的,没有人应该能够使用它。
您可以对单个数据库使用单独登录,并确保为每个用户整理用户映射,以便为它分配数据库的 dbowner。
还要确保为每个用户使用不同的密码,并且系统用户密码只有少数人知道。如果你必须给客户自己密码。
PS:每当删除或迁移数据库时,请确保先删除用户映射,然后再进行迁移和分离。