如何在 SQL Server 故障转移群集中启用 Kerberos 身份验证

更新日期: 2007 年 9 月 15 日

Kerberos 是一种网络身份验证协议,用于为客户端/服务器应用程序提供严格的身份验证。 Kerberos 为互操作性奠定了基础,同时增强了企业范围的网络身份验证的安全性。

可以将 Kerberos 身份验证用于运行在 Microsoft Windows 2000 Service Pack 3 (SP3) 上的 Microsoft SQL Server 2005 独立实例或故障转移群集实例。 SQL Server 2005 支持 Microsoft Windows 2000 Active Directory 域典型安装中包含的这个功能。

当 SQL Server 所依赖的网络名称资源在基于 Windows 2000 的群集中时,将计算机升级到 Windows 2000 SP3 后,就可以对该资源使用 Kerberos 身份验证。 有关对服务器群集启用 Kerberos 的其他信息,请参阅知识库文章“Kerberos Support on Windows 2000-based Server Clusters”。

下一节介绍了如何连接到运行 Microsoft Internet 信息服务 (IIS) 的服务器,以便与运行 SQL Server 的服务器建立 Kerberos 连接。

必备项

只有在运行 Windows 2000 SP3 时才能使用此功能。

在执行设置过程之前,请先下载 Kerbtray 和 SetSPN 实用工具。

  • 若要下载 Kerbtray 实用工具,请访问 Microsoft 网站。 使用 Kerbtray.exe,您可以在所使用的任意关联计算机上轻松地验证和/或删除 Kerberos 票证。
  • 若要下载 SetSPN 实用工具,请访问 Microsoft 网站

仅在客户端使用 TCP/IP 协议连接到 SQL Server 时,SQL Server 才使用 Kerberos。 例如,如果客户端使用命名管道协议,则不使用 Kerberos。 如果计算机上存在多个 SQL Server 实例,则必须为每个 SQL Server 实例配置服务器主体名称,因为每个 SQL Server 实例都使用唯一的 TCP-IP 端口。

对 SQL Server 2005 启用 Kerberos

连接到运行 Microsoft Internet 信息服务的服务器,并与 SQL Server 2005 建立 Kerberos 连接

  1. 步骤 1:配置域控制器

在域控制器的“Active Directory 用户和计算机”中:

  1. 右键单击要设置委托的计算机(IIS 服务器),再单击选中“此计算机可以信任,可用来委托”。 如果运行 SQL Server 的计算机似乎是所连接的最后一台计算机,但该计算机有一台链接服务器,则还必须向其授予委托权限。 如果它不是链中的最后一台计算机,则必须信任中间的所有计算机,使它们可用于委托。
  2. 向 SQL Server 服务帐户的域用户帐户授予委托权限。 您必须有一个域用户帐户用于所安装的 SQL Server 群集(对于使用本地系统帐户运行 SQL Server 的计算机,不需要此步骤):
    1. 在 Users 文件夹中,右键单击用户帐户,再单击**“属性”**。
    2. 在“用户帐户属性”对话框中,单击**“帐户”**选项卡。
    3. 在**“帐户选项”下,单击以选中“帐户可以信任,可用来委托”复选框。 确保为此帐户取消选中“帐户是敏感帐户,不能被委托”**复选框。
  3. 使用 Kerbtray.exe 实用工具来验证 Kerberos 票证是否是从域控制器和主机接收到的:
    1. 右键单击通知区域中的 Kerbtray 图标,再单击**“清除票证”**。
    2. 等待绿色的 Kerbtray 图标从绿色变为黄色。 之后,立即打开命令提示符窗口,然后运行以下命令:
      net session* /d
      这将删除现有会话,然后强制建立新会话并接收 Kerberos 票证。

步骤 2:配置 IIS 服务器

  1. 用 .asp 示例文件替换默认网站的 Wwwroot 文件。 若要创建 .asp 示例文件,请使用“用于检索 SQL Server 数据的 ASP 测试脚本”一节中提供的代码。
  2. 将该文件添加到 Wwwroot 文件夹。 若要执行此操作,请使用“用于检索 SQL Server 数据的 ASP 测试脚本”一节中的代码。 将该文件另存为 Default.asp
  3. 将 Web 服务器重新配置为仅使用集成 Windows 身份验证:
    1. 右键单击默认的 Web 服务器,再单击**“安全性”**文件夹。
    2. 在**“安全性”文件夹中,进行正确的更改,再单击以清除“匿名访问”**。
    3. 从命令提示符运行以下命令:
      cscript C:\Inetpub\Adminscripts\adsutil.vbs get w3svc/NTAuthenticationProviders
      如果启用了**“协商”**,将返回以下信息:
      NTAuthenticationProviders : (STRING) Negotiate,NTLM
      有关将 IIS 配置为支持 Kerberos 和 NTLM 身份验证的其他信息,请参阅知识库文章“How to Configure IIS to Support Both Kerberos and NTLM Authentication”。
    ms189585.note(zh-cn,SQL.90).gif注意:
    必须在 IIS 服务器上安装 Microsoft 数据访问组件 (MDAC) 2.8 SP1 或更高版本。 若要执行此操作(并使工具可用于测试),请在 Web 服务器上安装 Microsoft SQL Server 2000 客户端工具。 若要只安装 MDAC 2.8 SP1 或更高版本,而不安装客户端工具,请访问 Microsoft 网站
  4. 验证注册表中是否存在 HKLM\SW\MS\MSSQLSERVER\Client\DSQUERY 值。 如果未显示该值,请将该值作为 DSQUERY:Reg_SZ:DBNETLIB 添加。
  5. 使用 Kerbtray.exe 实用工具来验证 Kerberos 票证是否是从域控制器和主机接收到的:
    1. 右键单击通知区域中的 Kerbtray 图标,再单击**“清除票证”**。
    2. 等待绿色的 Kerbtray 图标从绿色变为黄色。 之后,立即打开命令提示符窗口,然后运行以下命令:
      net session * /d
      这将删除现有会话,然后强制建立新会话并接收 Kerberos 票证。

步骤 3:为 SQL Server 创建 SPN

ms189585.Caution(zh-cn,SQL.90).gif注意:
仅在客户端使用 TCP/IP 协议连接到 SQL Server 时,SQL Server 才使用 Kerberos。 例如,如果客户端使用命名管道协议,则不使用 Kerberos。 如果计算机上存在多个 SQL Server 实例,则必须为每个 SQL Server 实例配置服务器主体名称,因为每个 SQL Server 实例都使用唯一的 TCP-IP 端口。
ms189585.note(zh-cn,SQL.90).gif重要提示:
如果 SQL Server 服务在 LocalSystem 帐户下运行,则不必为 SQL Server 手动配置 SPN。 启动 SQL Server 服务时会自动创建 SPN。 如果 SQL Server 服务在域用户帐户下运行,则必须手动配置 SPN。 为此,请按下列步骤进行操作。

若要为 SQL Server 配置 SPN,请使用 Microsoft Windows 资源工具包中的 SETSPN 实用工具。 若要下载 SETSPN 实用工具,请访问 Microsoft 网站

在运行 SETSPN 之前,请注意下列事项:

  • 必须以有权注册 SPN 的登录帐户运行 setspn.exe
  • 请注意运行 SQL Server 实例的域用户帐户。 在下列示例中,此帐户命名为 <SQL_Service_Account>。
    **重要提示:**如果在 LocalSystem 帐户下运行 SQL Server 实例,则不必运行 SETSPN 实用工具。
  • 必须拥有运行 SQL Server 的计算机的完全限定域名 (FQDN)。 若要确定运行 SQL Server 的计算机的 FQDN,请使用 ping 实用工具。 为此,请按下列步骤进行操作:
  1. 对运行 SQL Server 的计算机执行 ping 来确定其 IP 地址:
    C:\>ping MySQLServer
    Pinging MySQLServer.MyDomain.com [10.10.10.10] with 32 bytes of data:
    Reply from 10.10.10.10: bytes=32 time=1ms TTL=128
  2. 使用 ping -a 对 IP 地址执行反向查找,以确保域名系统 (DNS) 协议正确返回了 FQDN:
    C:\>ping -a 10.10.10.10
    Pinging MySQLServer.MyDomain.com [10.10.10.10] with 32 bytes of data:
    Reply from 10.10.10.10: bytes=32 time<1ms TTL=128
  3. Ping 故障转移群集实例名称以获得 IP 地址,然后运行 ping -a 以确保 FQDN 的确是由 DNS 返回的。
ms189585.note(zh-cn,SQL.90).gif注意:
如果您正在使用 SQL Server 故障转移群集,请使用故障转移群集实例名称的 FQDN。 请注意 SQL Server 实例所使用的正确 TCP/IP 端口。 若要确定此信息,请在运行 SQL Server 的计算机上打开 SQL Server 配置管理器,单击 SQL Server 实例,然后查看 TCP/IP 协议(默认端口)的属性。

在确定运行 SQL Server 服务的域用户帐户、运行 SQL Server 的计算机的 FQDN 以及 SQL Server 实例所使用的 TCP/IP 端口之后,请按照下列步骤为 SQL Server 创建 SPN。

ms189585.note(zh-cn,SQL.90).gif注意:
您必须是域管理员组的成员才能运行 SETSPN 命令。
  1. 如果使用了 SQL Server 故障转移群集,请运行以下 SETSPN 命令:
    setspn -A MSSQLSvc/<FQDN> <SQL_Service_Account>
    例如,如果 MySQLServer.MyDomain.com 在域用户帐户 SQLSVC 下运行,其中 MySQLServer.MyDomain.com 是 SQL Server 2005 群集实例的名称,请运行以下命令:
    setspn -A MSSQLSvc/MySQLServer.MyDomain.com SQLSVC
  2. 对于运行 SQL Server 的群集和非群集计算机,请运行以下 SETSPN 命令,为运行 SQL Server 的计算机所使用的端口注册 SPN:
    setspn -A MSSQLSvc/<FQDN>:<Port> <SQL_Service_Account>
    例如,如果 MySQLServer.MyDomain.com 在域用户帐户 SQLSVC 下、端口 1433 上运行,请使用以下 SETSPN 命令:
    setspn -A MSSQLSvc/MySQLServer.MyDomain.com:1433 SQLSVC
  3. 注册 SPN 后,使用 SETSPN 实用工具的 LIST 功能(-L 开关)验证是否已正确注册 SPN。 运行 SETSPN -L <SQL_Service_Account> 以列出在运行 SQL Server 实例的域用户帐户中注册的所有 SPN:
    setspn -L <SQL_Service_Account>
    例如,如果 MySQLServer.MyDomain.com 在域用户帐户 SQLSVC 下、端口 1433 上运行,请使用以下命令:
    setspn -A SQLSVC
    在步骤 1(如果 SQL Server 是群集服务器)和步骤 2(如果 SQL Server 不是群集服务器)中创建的 SPN 将显示在以下输出中:
    C:\>setspn -l SQLSVC
    Registered ServicePrincipalNames for CN=SQLSVC,CN=Users,DC=MyDomain,DC=com:
        MSSQLSvc/MySQLServer.MyDomain.com
        MSSQLSvc/MySQLServer.MyDomain.com:1433
ms189585.note(zh-cn,SQL.90).gif注意:
如果使用了 SQL Server 故障转移群集,则必须注册一个不带端口号的 SPN 和一个带端口号的 SPN。 对于运行 SQL Server 的典型、非群集计算机,只需要注册带端口号的 SPN。 但是,即使有不带端口号的其他 SPN,也不会给非群集计算机带来任何问题。
ms189585.note(zh-cn,SQL.90).gif注意:
您也可以在域控制器上使用 Ldifde.exe 实用工具来验证这两个 SPN 注册。 本主题中的“如何收集 Active Directory 服务器主体名称信息”一节对此进行了介绍。

步骤 4:配置客户机

  1. 对于每个将要连接的客户端,验证 Microsoft Internet Explorer 是否已配置为使用 Windows 身份验证:
  2. 在 Internet Explorer 中,在**“工具”菜单上,单击“Internet 选项”**。
  3. 单击**“高级”选项卡。
    “安全”下,单击以选中“启用集成 Windows 身份验证(需要重启动)”,然后单击“确定”**。

步骤 5:测试配置

对于涉及的每台计算机:

  1. 登录到该计算机,然后使用 Kerbtray.exe 来验证该计算机是否可以从域控制器获取有效的 Kerberos 票证。
  2. 使用 Kerbtray.exe 删除该计算机上的所有票证。
  3. 创建并连接到用于返回 SQL Server 数据的网页。
ms189585.note(zh-cn,SQL.90).gif注意:
将 SQLSERVERNAME 替换为运行 SQL Server 的计算机的名称:
  • 如果返回了数据,此页将显示身份验证类型 Negotiatesp_helpdb 存储过程的结果 SQL Server 数据,该存储过程应返回通过 .ASP 页连接到的服务器上的数据库列表。
  • 如果在 SQL Server 上启用了审核,则在应用程序日志中,将看到该连接是“可信”的。

用于检索 SQL Server 数据的 ASP 测试脚本

下面是用于 SQL Server 数据的 ASP 测试脚本。 如果使用此代码示例,请确保将 SQLSERVERNAME 替换为运行 SQL Server 的计算机的名称:

<%@ Language=VBScript %>

<HTML>

<HEAD>

<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">

</HEAD>

<BODY>

<%="'auth_user' is" & request.servervariables("auth_user")%>

<P>

<%="'auth_type' is" & request.servervariables("auth_type")%>

<P>

Connections string is <B>" Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=pubs;Data Source=SQLSERVERNAME </B>

<P>

<%

set rs = Server.CreateObject("ADODB.Recordset")

set cn = Server.CreateObject("ADODB.Connection")

cn.Open "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=pubs;Data Source=SQLSERVERNAME"

rs.open "MASTER..sp_helpdb",cn

Response.Write cstr(rs.Fields.Count) +"<BR>"

while not rs.EOF

Response.Write cstr(rs(0))+"<BR>"

rs.MoveNext

wend

rs.Close

cn.Close

set rs = nothing ' Frees memory reserved by the recordset.

set cn = nothing ' Frees memory reserved by the connection.

%>

</BODY>

</HTML>

如何收集 Active Directory 服务器主体名称信息

若要收集 Active Directory 服务器主体名称 (SPN) 信息,请在某个域控制器上键入下面的命令,其中 betaland 是 NetBIOS 域名,NewoutputUsers.txt 是用于输出结果的输出文件名。 如果不使用完整路径,则文件将被放到运行命令行时的当前文件夹中。 此示例命令可查询整个域:

ldifde -d "CN=Users,DC=betaland" -l servicePrincipalName -F NewoutputUsers.txt

此语法创建名为 NewoutputUsers.txt 的文件,其中包含的信息与本主题的“NewouputUsers.txt 的域级输出”一节的输出相似。

收集整个域的信息时,此输出文件可能会过大。 因此,若要仅收集与特定用户名相关的信息,请使用下面的语法,其中 User Name 是用户名,betaland 是要查询的域:

ldifde -d "CN=User Name,DC=betaland" -l servicePrincipalName -F NewoutputUsers.txt

收集特定用户的信息可以大大减少搜索所涉及的数据。 如果收集整个域的信息,请搜索相关服务器的特定用户名。 在输出示例中,可以看到:

  • 服务器项不再存在,但并未从 Active Directory 中完全删除。
  • 用户“User Name”在大约十台不同服务器上拥有有效的 SPN 信息。

另外,可以使用 Active Directory 服务接口 (ADSI) 工具更正无效的 Active Directory 项。

**注意:**如果使用 ADSI 编辑管理单元、LDP 实用工具或其他 LDAP 版本 3 客户端,并且错误修改了 Active Directory 对象的属性,可能会导致严重问题。 若要解决这些问题,可能需要重新安装 Microsoft Windows 2000 Server 和/或 Microsoft Exchange 2000 Server。 Microsoft 不能保证解决由于错误修改 Active Directory 对象的属性而出现的问题。 若要修改这些属性,您必须自行承担风险。

NewouputUsers.txt 的域级输出

dn: CN=User Name,CN=Users,DC=betaland

changetype: add

servicePrincipalName: MSSQLSvc/CLUSTERDEFAULT.betaland:1257

servicePrincipalName: MSSQLSvc/INST3.betaland:3616

servicePrincipalName: MSSQLSvc/INST2.betaland:3490

servicePrincipalName: MSSQLSvc/SQLMAN.betaland:1433

servicePrincipalName: MSSQLSvc/VSS1.betaland:1433

servicePrincipalName: MSSQLSvc/INST1.betaland:2536

servicePrincipalName: MSSQLSvc/INST4.betaland:3967

servicePrincipalName: MSSQLSvc/SQLVIRTUAL1.betaland:1434

servicePrincipalName: MSSQLSvc/SQLVIRTUAL.betaland:1433

servicePrincipalName: MSSQLSvc/SQLBUSTER.betaland:1315

请参阅

其他资源

配置可用性帮助主题
安装 SQL Server 2005
升级到 SQL Server 2005

帮助和信息

获取 SQL Server 2005 帮助