注册服务主体名称

服务主体名称 (SPN) 是客户端唯一用来标识服务实例的名称。Kerberos 身份验证服务可以使用 SPN 对服务进行身份验证。当客户端想要连接到某个服务时,它将查找该服务的实例,并为该实例编写 SPN,然后连接到该服务并显示该服务的 SPN 以进行身份验证。

注意注意

本主题中提供的信息还适用于使用聚类分析的 SQL Server 配置。

Windows 身份验证是用户对 SQL Server 进行身份验证的首选方法。使用 Windows 身份验证的客户端通过使用 NTLM 或 Kerberos 来验证身份。在 Active Directory 环境中,始终首先尝试 Kerberos 身份验证。Kerberos 身份验证不可用于使用命名管道的 SQL Server 2000 和 SQL Server 2005 客户端。

权限

在数据库引擎服务启动时,它将尝试注册服务主体名称 (SPN)。如果启动 SQL Server 的帐户无权在 Active Directory 域服务中注册 SPN,则此调用将失败,并且一个警告消息将记录到应用程序事件日志和 SQL Server 错误日志中。若要注册 SPN,必须在 Local System(但不建议使用)或 NETWORK SERVICE 之类的内置帐户或有权注册 SPN 的帐户(如域管理员帐户)下运行数据库引擎。如果 SQL Server 不在上述任一帐户下运行,则启动时不会注册 SPN,此时,域管理员必须手动注册 SPN。

知识库文章 How to use Kerberos authentication in SQL Server(如何在 SQL Server 中使用 Kerberos 身份验证)包含有关如何向非域管理员帐户授予 SPN 读或写权限的信息。

How to Implement Kerberos Constrained Delegation with SQL Server 2008(如何使用 SQL Server 2008 实现 Kerberos 约束的委托)中提供更多的信息。

SPN 格式

自 SQL Server 2008 开始,SPN 格式已发生更改,目的是为了支持对 TCP/IP、Named Pipes 和 Shared Memory 进行 Kerberos 身份验证。所支持的命名实例和默认实例的 SPN 格式如下所示。

命名实例

  • MSSQLSvc/FQDN:[port**|**instancename],其中:

    • MSSQLSvc 是要注册的服务。

    • FQDN 是服务器的完全限定域名。

    • port 是 TCP 端口号。

    • instancename 是 SQL Server 实例的名称。

默认实例

  • MSSQLSvc/FQDN:port**|**MSSQLSvc/FQDN,其中:

    • MSSQLSvc 是要注册的服务。

    • FQDN 是服务器的完全限定域名。

    • port 是 TCP 端口号。

新 SPN 格式不需要端口号。这意味着,多端口服务器或不使用端口号的协议都可以使用 Kerberos。

注意注意

对于 TCP/IP 连接,由于 SPN 中包括 TCP 端口,因此 SQL Server 必须启用 TCP 协议,以便用户使用 Kerberos 身份验证进行连接。

自动注册 SPN

SQL Server 数据库引擎的实例启动时,SQL Server 将尝试为 SQL Server 服务注册 SPN。实例停止时,SQL Server 将尝试取消此 SPN 的注册。对于 TCP/IP 连接,注册 SPN 时使用的格式为 MSSQLSvc/<FQDN>:<tcpport>。命名实例和默认实例均将注册为 MSSQLSvc,可根据 <tcpport> 值来区分这些实例。

对于支持 Kerberos 的其他连接,为命名实例注册 SPN 时使用的格式为 MSSQLSvc/<FQDN>:<instancename>。注册默认实例的格式为 MSSQLSvc/<FQDN>

如果服务帐户缺少执行这些操作所需的权限,在注册或取消注册 SPN 时可能需要进行手动干预。

手动注册 SPN

若要手动注册 SPN,管理员必须使用随 Microsoft Windows Server 2003 支持工具提供的 Setspn.exe 工具。这些工具包含在 Windows Server 2003 Service Pack 1 (SP1) 中。有关详细信息,请参阅 Windows Server 2003 Service Pack 1 Support Tools(Windows Server 2003 Service Pack 1 支持工具)知识库文章。

Setspn.exe 是一个命令行工具,您可通过该工具读取、修改和删除服务主体名称 (SPN) 目录属性。您还可借助此工具查看当前 SPN、重置帐户的默认 SPN 以及添加或删除补充 SPN。

以下示例说明了用于为 TCP/IP 连接手动注册 SPN 的语法:

setspn -A MSSQLSvc/myhost.redmond.microsoft.com:1433 accountname

注意   如果 SPN 已存在,则必须在重新注册该 SPN 之前将其删除。可以使用带有 -D 开关的 setspn 命令实现此操作。以下示例说明如何手动注册基于新实例的 SPN。对于默认实例,请使用:

setspn –A MSSQLSvc/myhost.redmond.microsoft.com accountname

对于命名实例,请使用:

setspn –A MSSQLSvc/myhost.redmond.microsoft.com:instancename accountname

客户端连接

客户端驱动程序支持用户指定的 SPN。但是,如果未提供 SPN,则将根据客户端连接类型自动生成 SPN。对于 TCP 连接,对命名实例和默认实例使用 MSSQLSvc/FQDN:[port] 格式的 SPN。

对于 Named Pipes 和 Shared Memory 连接,对命名实例使用 MSSQLSvc/FQDN:instancename 格式的 SPN,对默认实例使用 MSSQLSvc/FQDN 格式。

将服务帐户用作 SPN

可将服务帐户用作 SPN。可以通过 Kerberos 身份验证的连接属性指定服务帐户,并采用以下格式:

  • username@domaindomain\username(适用于域用户帐户)

  • machine$@domainhost\FQDN(适用于计算机域帐户,例如 Local System 或 NETWORK SERVICES)。

若要确定某一连接的身份验证方法,请执行以下查询。

SELECT net_transport, auth_scheme 
FROM sys.dm_exec_connections 
WHERE session_id = @@SPID;

身份验证默认值

下表说明根据 SPN 注册情况所使用的身份验证默认值。

情形

身份验证方法

SPN 映射到的域或内置帐户正确。例如 Local System 或 NETWORK SERVICE。

注意注意
“正确”表示注册的 SPN 映射到的帐户是当前运行 SQL Server 服务的帐户。

本地连接使用 NTLM,远程连接使用 Kerberos。

SPN 是正确的域或内置帐户。

注意注意
“正确”表示注册的 SPN 映射到的帐户是当前运行 SQL Server 服务的帐户。

本地和远程连接使用 Kerberos。

SPN 映射到的域或内置帐户不正确

身份验证失败。

SPN 查找失败或未映射到正确的域或内置帐户,或者不是正确的域或内置帐户。

本地和远程连接使用 NTLM。

注释

SQL Server 2008 中的专用管理员连接 (DAC) 使用基于实例名称的 SPN。如果该 SPN 注册成功,则 DAC 可以使用 Kerberos 身份验证。用户也可以选择将帐户名指定为 SPN。

如果在启动过程中 SPN 注册失败,将在 SQL Server 错误日志中记录此失败,而启动过程将继续进行。

如果在关闭时 SPN 取消注册失败,将在 SQL Server 错误日志中记录此失败,而关闭过程将继续进行。