我正在尝试在域环境中使用“使用登录名的当前安全上下文制作”将链接服务器连接到在另一台服务器上创建的 ServerA,即 ServerB。我读到我需要为在每台服务器上运行 SQL Server 的服务帐户创建 SPN 才能启用 Kerberos。我已经这样做了,现在两者都显示身份验证方案是 Kerberos,但是,我仍然面临错误:
"Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'".
Run Code Online (Sandbox Code Playgroud)
在 Active Directory 中,我可以看到 ServerB 的服务帐户被信任用于委派 MSSQLSvc,但我注意到 ServerA 的服务帐户尚未启用“信任此用户进行委派”。目标服务器是否也需要启用该选项?要能够使用当前的 Windows 登录名来使用链接服务器,还需要什么吗?
sql-server-2008 authentication sql-server linked-server kerberos
我发现有关如何准确格式化 SPN(服务原则名称)以获得正确的 Kerberos 连接以及每个 SQL 实例需要多少个的矛盾信息。
此 2017 年 MS 文档包含以下内容:
从 SQL Server 2008 开始,SPN 格式已更改,以支持 TCP/IP、命名管道和共享内存上的 Kerberos 身份验证。命名实例和默认实例支持的 SPN 格式如下。
- 命名实例:
MSSQLSvc/FQDN:[port|instancename]- 默认实例:
MSSQLSvc/FQDN:port|MSSQLSvc/FQDN新的 SPN 格式不需要端口号。这意味着多端口服务器或不使用端口号的协议可以使用 Kerberos 身份验证。
我认为最后一段的意思是我只需要一个条目,以下之一:
MSSQLSvc/sqlbox1.mydomain.org/instance2MSSQLSvc/sqlbox1.mydomain.org这似乎与这个较旧的 (2011) MS 文档相矛盾,不仅是关于端口号,还关于使用什么名称:
要创建 SPN,您可以使用 SQL Server 的 NetBIOS 名称或完全限定域名 (FQDN)。但是,您必须为 NetBIOS 名称和 FQDN 创建一个 SPN。
当我查看环境中已经存在的 SPN 时,我看到了各种各样的组合,有些服务器最多有 4 个条目:
MSSQLSvc/sqlbox1MSSQLSvc/sqlbox1:1433MSSQLSvc/sqlbox1.mydomain.orgMSSQLSvc/sqlbox1.mydomain.org:1433甚至MS 自己的 Kerberos 配置管理器似乎也想生成最后两个版本(使用适当的混淆处理):
同样,对于现有的命名实例,我看到了一个奇怪的组合,其中一些几乎肯定是无效的:
MSSQLSvc/sqlbox1:1522MSSQLSvc/sqlbox1:instance2MSSQLSvc/sqlbox1.mydomain.org:1522MSSQLSvc/sqlbox1.mydomain.org:instance2MSSQLSvc/sqlbox1.mydomain.org/instance2 …我在同一个域中有两个 SQL Server 2016 标准版服务器。ServerA有两个链接服务器连接设置到ServerB。
第一个链接服务器连接使用专用的远程SQL 登录安全上下文。那个一直是并且仍然工作正常。
第二个连接使用“登录的当前安全上下文”,它是ServerA 上的Windows 身份验证 (AD) 登录。直到今天,这也运行良好。
今天突然间,连接到 ServerA 然后尝试运行使用第二个链接服务器连接的查询的每个人最终都会遇到以下错误:
链接服务器“LinkedServerName”的 OLE DB 访问接口“SQLNCLI11”返回消息“无法生成 SSPI 上下文”。消息 -2146893044,级别 16,状态 1,第 0 行 SQL Server 网络接口:登录尝试失败
此外,用户目前可以直接连接到 ServerA 和 ServerB,甚至可以直接对 ServerB 上的对象执行查询,但是当他们尝试通过 ServerA 上的链接服务器运行引用 ServerB 上相同对象的查询时,这是唯一一次他们得到上述错误,目前。
这是我们目前看到的SPN和日志(抱歉所有混淆):
ServerB 成功的 SPN 注册 SQL 日志:
ServerB 成功的 SPN 注册 SQL 日志:
ServerA 注册的 SPN: