客户端连接中的服务主体名称 (SPN) 支持
从 SQL Server 2008 开始,扩展了对服务主体名称 (SPN) 的支持,从而能够在所有协议中相互进行身份验证。在先前版本的 SQL Server 中,如果已使用 Active Directory 注册 SQL Server 实例的默认 SPN,则仅对使用 TCP 的 Kerberos 支持 SPN。
身份验证协议可使用 SPN 确定 SQL Server 实例运行时使用的帐户。如果实例帐户已知,则 Kerberos 身份验证可用于通过客户端和服务器提供相互身份验证。如果实例帐户未知,则使用仅通过服务器提供客户端的身份验证的 NTLM 身份验证。目前,SQL Server Native Client 执行身份验证查找,从而从实例名和网络连接属性派生 SPN。SQL Server 实例将尝试在启动时注册 SPN,或者可手动对其进行注册。但是,如果尝试注册 SPN 的帐户的访问权限不足,则注册将失败。
域和计算机帐户在 Active Directory 中自动注册。这些帐户可以用作 SPN,管理员也可以定义自己的 SPN。SQL Server 可通过允许客户端直接指定要使用的 SPN 使安全身份验证更易于管理且更可靠。
注意 |
---|
只有在使用 Windows NT 集成安全性进行连接时,才使用客户端应用程序指定的 SPN。 |
有关 Kerberos 的详细信息,请参阅下列文章:
用途
下表介绍了客户端应用程序可启用安全身份验证的最常见应用场景。
应用场景 |
说明 |
---|---|
早期应用程序不指定 SPN。 |
该兼容应用场景可确保不会对针对先前版本 SQL Server 开发的应用程序的行为进行任何更改。如果未指定 SPN,则应用程序使用已生成的 SPN,但不能识别使用哪个身份验证方法。 |
使用 SQL Server Native Client 当前版本的客户端应用程序将连接字符串中的 SPN 指定为域用户或计算机帐户、特定于实例的 SPN 或用户定义的字符串。 |
在访问接口、初始化或连接字符串中可使用 ServerSPN 关键字进行以下操作:
FailoverPartnerSPN 关键字可用于为故障转移伙伴服务器指定 SPN。帐户和 Active Directory 键值的范围与您可为主体服务器指定的值相同。 |
ODBC 应用程序将 SPN 指定为主体服务器或故障转移伙伴服务器的连接属性。 |
连接属性 SQL_COPT_SS_SERVER_SPN 可用于为与主体服务器的连接指定 SPN。 连接属性 SQL_COPT_SS_FAILOVER_PARTNER_SPN 可用于为故障转移伙伴服务器指定 SPN。 |
OLE DB 应用程序将 SPN 指定为主体服务器或故障转移伙伴服务器的数据源初始化属性。 |
DBPROPSET_SQLSERVERDBINIT 属性集中的连接属性 SSPROP_INIT_SERVER_SPN 可用于为连接指定 SPN。 DBPROPSET_SQLSERVERDBINIT 中的连接属性 SSPROP_INIT_FAILOVER_PARTNER_SPN 可用于为故障转移伙伴服务器指定 SPN。 |
用户在 ODBC 数据源名称 (DSN) 中为服务器或故障转移伙伴服务器指定 SPN。 |
可在 ODBC DSN 中通过 DSN 设置对话框指定 SPN。 |
用户在 OLE DB 的“数据链接”或“登录”对话框中为服务器或故障转移伙伴服务器指定 SPN。 |
可在“数据链接”或“登录”对话框中指定 SPN。“登录”对话框可用于 ODBC 或 OLE DB。 |
ODBC 应用程序确定用于建立连接的身份验证方法。 |
连接成功打开后,应用程序可查询连接属性 SQL_COPT_SS_INTEGRATED_AUTHENTICATION_METHOD,从而确定使用了哪个身份验证方法。值将包括但不限于 NTLM 和 Kerberos。 |
OLE DB 应用程序确定用于建立连接的身份验证方法。 |
连接成功打开后,应用程序可查询 DBPROPSET_SQLSERVERDATASOURCEINFO 属性集中的连接属性 SSPROP_AUTHENTICATION_METHOD,从而确定使用了哪个身份验证方法。值将包括但不限于 NTLM 和 Kerberos。 |
故障转移
SPN 未存储在故障转移缓存中,因此不能在连接之间传递 SPN。在连接字符串或连接属性中指定时,SPN 将用于对主体和伙伴的所有连接尝试。
连接池
应用程序应注意在部分而不是所有连接字符串中指定 SPN 可能会导致池碎片。
应用程序可用编程方式指定 SPN 作为连接属性,而不是指定连接字符串关键字。这有助于管理连接池碎片。
应用程序应注意可通过设置相应的连接属性覆盖连接字符串中的 SPN,但连接池使用的连接字符串将连接字符串值用于池。
下级服务器行为
新的连接行为由客户端实现,因此这种行为不特定于某个版本的 SQL Server。
链接服务器和委托
创建链接服务器时,sp_addlinkedserver 的 @provstr 参数可用于指定服务器和故障转移伙伴的 SPN。执行此操作的优点与在客户端连接字符串中指定 SPN 的优点相同:建立使用 Kerberos 身份验证的连接更简单且更可靠。
使用链接服务器的委托要求 Kerberos 身份验证。
有关要求的列表,请参阅为委托配置链接服务器。
应用程序指定的 SPN 的管理方面
选择在应用程序中通过连接字符串还是以编程方式通过连接属性指定 SPN(而不是依赖于默认访问接口生成的 SPN)时,请考虑以下因素:
安全性:指定的 SPN 是否会泄露受保护的信息?
可靠性:若要能够使用默认 SPN,SQL Server 实例运行时使用的服务帐户必须具有足够的特权才能对 KDC 更新 Active Directory。
方便性和位置透明性:如果应用程序的数据库移到其他 SQL Server 实例,则将如何影响该应用程序的 SPN?如果使用数据库镜像,则这种情况适用于主体服务器及其故障转移伙伴。如果服务器更改意味着必须更改 SPN,则这种情况将如何影响应用程序?是否将管理所有更改?
指定 SPN
您可以使用对话框和代码指定 SPN。本节论述了可以指定 SPN 的方式。
SPN 的最大长度是 260 个字符。
以下是 SPN 在连接字符串或连接属性中使用的语法:
语法 |
说明 |
---|---|
MSSQLSvc/fqdn |
使用除 TCP 之外的协议时访问接口生成的用于默认实例的默认 SPN。 fqdn 为完全限定的域名。 |
MSSQLSvc/fqdn:port |
使用 TCP 时访问接口生成的默认 SPN。 port 为 TCP 端口号。 |
MSSQLSvc/fqdn:InstanceName |
使用除 TCP 之外的协议时访问接口生成的用于命名实例的默认 SPN。 InstanceName 为 SQL Server 实例名。 |
HOST/fqdn HOST/MachineName |
映射到内置计算机帐户的 SPN,这些内置计算机帐户由 Windows 自动注册。 |
Username@Domain |
域帐户的直接规范。 Username 为 Windows 用户帐户名。 Domain 为 Windows 域名或完全限定的域名。 |
MachineName$@Domain |
计算机帐户的直接规范。 (如果要连接到的服务器正在 LOCAL SYSTEM 或 NETWORK SERVICE 帐户下运行,则若要获取 Kerberos 身份验证,ServerSPN 可以使用 MachineName$@Domain 格式)。 |
KDCKey/MachineName |
用户指定的 SPN。 KDCKey 为符合 KDC 密钥的规则的字母数字字符串。 |