如何配置 MS SQL Server 以防止向任何经过身份验证的用户公开所有数据库名称和登录信息?

如何配置 MS SQL Server 以防止向任何经过身份验证的用户公开所有数据库名称和登录信息?

我是 MS SQL 的新手,作为一名具有有限系统管理经验的 Web 开发人员,我希望他的服务提供商使用最佳实践,因此我提出这个问题。

我们的数据库位于托管公司提供的远程 MS SQL 服务器上。我们托管公司的其他客户也使​​用同一台服务器作为他们的数据库。当我使用 Microsoft SQL Server Management Studio Express 登录服务器时,我可以看到大量信息,包括服务器上所有数据库的名称和所有登录名。

虽然我无法访问其他客户的数据库,也无法看到密码,但我居然能看到这些信息,这对我来说似乎很奇怪。我当然不希望其他客户知道我的数据库名称或我的登录名。当我向我的服务提供商提出这个问题时,他是这样回复的:

我向我的 SQL 专家咨询,他说不幸的是这是 MSSQL Server 的一个限制。虽然数据库名称是可见的,但如果没有该数据库的密码,您就无法访问任何数据库。

这是我登录后看到的:

  • mssql.server.com
    • 数据库
      • 系统数据库
      • 一大堆客户数据库...
    • 安全
      • 登录
      • 一大堆客户端登录...
    • 服务器对象
    • 复制
    • 管理

这是设置 SQL Server 的正确方法吗?请确认或否认我的怀疑,答案是否定的,我需要找其他人来托管我们的数据库。

答案1

从开发角度来说,我可以说管理员应该能够将每个人都锁定在他们自己的数据库中(可能还有主数据库,用于元数据)。从 MSDN 来看,SQL Server 安全对象包括数据库和权限甚至包括能够查看数据库。 这里是 MSDN 数据库安全注意事项的链接。

答案2

Management Studio 从 sys.databases 获取数据库列表。系统数据库每次登录都只能看到自己的数据库:

如果 sys.databases 的调用者不是数据库的所有者,并且数据库不是 master 或 tempdb,则查看相应行所需的最低权限是 ALTER ANY DATABASE 或 VIEW ANY DATABASE 服务器级别权限,或 master 数据库中的 CREATE DATABASE 权限。调用者连接到的数据库始终可以在 sys.databases 中查看。

如果您的登录名可以看到其自身以外的数据库,则意味着所述登录名具有不必要的权限,例如 CREATE DATABASE。

答案3

要对所有登录用户隐藏数据库,请从公共服务器角色中删除/撤销“查看任何数据库”权限

http://sqlism.blogspot.com/2014/10/preventing-logins-and-users-to-see.html

答案4

这会隐藏其他数据库和用户,但只对单个用户隐藏(这可能是您想要的)。我已经在 MS SQL 2008 R2 上测试过了。

在 Server Management Studio 中:

  • 创建用户账户,不设置任何权限
  • 打开服务器属性 > 权限 > 选择新帐户 > 选中“拒绝查看数据库”框
  • 打开数据库属性>文件>将数据库所有者设置为用户帐户

相关内容