今天我们发现我们的两个 SQL Server(都是 2017 CU21)正在接受来自任何随机域帐户的连接,即使是那些绝对没有直接登录或通过 AD 组成员身份访问的那些。
在每台服务器上都有一个用户数据库,允许这些随机域帐户进行连接。
根据我们看到的配置,我们预计任何随机域帐户(即任何在实例上没有登录名的帐户)都会出现登录失败,除此之外,还会阻止连接到用户数据库。
对于这些数据库,来宾帐户被禁用,但我们已经执行了良好的措施:
REVOKE CONNECT FROM guest
这没什么区别。
所以两个问题:
- 我们如何关闭/阻止这些公共连接成功?
- 什么 TSQL 语句可以向我们展示有问题的配置?
到目前为止我们已经看过的东西:
- “公共”服务器角色似乎具有默认配置,与我们所有其他不存在问题的服务器相同
- 来宾用户在所有数据库和服务器上肯定显示为禁用
- “公共”数据库角色只有我们期望看到的默认权限
- 每台服务器上只有 1 个用户数据库(加上 master 和 msdb 和 tempdb)可供这些随机帐户访问——所有其他数据库的行为都正常,即帐户无法连接到它们。
- 数据库包含类型设置为“无”是所有情况。
- 两台服务器上都没有覆盖所有域用户的登录名
一些上下文:这两个服务器是相关的——它们是同一应用程序的 DEV 和 PROD 服务器。这种配置很可能是出于某种历史原因而故意进行的——但现在在这里工作的人都不知道为什么,所以我们想禁用这种公共访问。
根据您的描述,在我看来,CONNECT SQL(或者可能是 CONNECT)权限已分配给公共服务器角色。
CONNECT SQL
由于直接授予它或授予它role
/windows group
在服务器级别,任何登录都连接到服务器。您应该检查这些角色/组,并通过运行以下代码来模拟您的可疑登录:代码的第一部分向您显示 login 所属的所有角色/组,第二部分向您显示哪个角色/组具有
CONNECT SQL
. 因此,在您的登录名是最后一个组/角色的成员之前,他将连接到您的服务器。此处的另一篇文章中有一个 T-SQL 脚本,它将撤回您的所有 database_role 权限。
还值得注意的是,
CONNECT SQL
默认VIEW DATABASE
情况下授予公共服务器角色。Windows 帐户通过 Windows 组成员身份继承权限。即使用户帐户不存在登录名,但如果组成员允许,该帐户仍然可以连接。
执行xp_logininfo,指定问题 Windows 帐户以及“all”以列出所有提供访问权限的权限路径(即帐户和/或组)。