我是 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 中:
- 创建用户账户,不设置任何权限
- 打开服务器属性 > 权限 > 选择新帐户 > 选中“拒绝查看数据库”框
- 打开数据库属性>文件>将数据库所有者设置为用户帐户