如何在 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 端口。
连接到运行 Microsoft Internet 信息服务的服务器,并与 SQL Server 2005 建立 Kerberos 连接
- 步骤 1:配置域控制器
在域控制器的“Active Directory 用户和计算机”中:
- 右键单击要设置委托的计算机(IIS 服务器),再单击选中“此计算机可以信任,可用来委托”。 如果运行 SQL Server 的计算机似乎是所连接的最后一台计算机,但该计算机有一台链接服务器,则还必须向其授予委托权限。 如果它不是链中的最后一台计算机,则必须信任中间的所有计算机,使它们可用于委托。
- 向 SQL Server 服务帐户的域用户帐户授予委托权限。 您必须有一个域用户帐户用于所安装的 SQL Server 群集(对于使用本地系统帐户运行 SQL Server 的计算机,不需要此步骤):
- 在 Users 文件夹中,右键单击用户帐户,再单击**“属性”**。
- 在“用户帐户属性”对话框中,单击**“帐户”**选项卡。
- 在**“帐户选项”下,单击以选中“帐户可以信任,可用来委托”复选框。 确保为此帐户取消选中“帐户是敏感帐户,不能被委托”**复选框。
- 使用 Kerbtray.exe 实用工具来验证 Kerberos 票证是否是从域控制器和主机接收到的:
- 右键单击通知区域中的 Kerbtray 图标,再单击**“清除票证”**。
- 等待绿色的 Kerbtray 图标从绿色变为黄色。 之后,立即打开命令提示符窗口,然后运行以下命令:
net session* /d
这将删除现有会话,然后强制建立新会话并接收 Kerberos 票证。
步骤 2:配置 IIS 服务器
- 用 .asp 示例文件替换默认网站的 Wwwroot 文件。 若要创建 .asp 示例文件,请使用“用于检索 SQL Server 数据的 ASP 测试脚本”一节中提供的代码。
- 将该文件添加到 Wwwroot 文件夹。 若要执行此操作,请使用“用于检索 SQL Server 数据的 ASP 测试脚本”一节中的代码。 将该文件另存为 Default.asp。
- 将 Web 服务器重新配置为仅使用集成 Windows 身份验证:
- 右键单击默认的 Web 服务器,再单击**“安全性”**文件夹。
- 在**“安全性”文件夹中,进行正确的更改,再单击以清除“匿名访问”**。
- 从命令提示符运行以下命令:
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”。
注意:
必须在 IIS 服务器上安装 Microsoft 数据访问组件 (MDAC) 2.8 SP1 或更高版本。 若要执行此操作(并使工具可用于测试),请在 Web 服务器上安装 Microsoft SQL Server 2000 客户端工具。 若要只安装 MDAC 2.8 SP1 或更高版本,而不安装客户端工具,请访问 Microsoft 网站。 - 验证注册表中是否存在 HKLM\SW\MS\MSSQLSERVER\Client\DSQUERY 值。 如果未显示该值,请将该值作为
DSQUERY:Reg_SZ:DBNETLIB
添加。 - 使用 Kerbtray.exe 实用工具来验证 Kerberos 票证是否是从域控制器和主机接收到的:
- 右键单击通知区域中的 Kerbtray 图标,再单击**“清除票证”**。
- 等待绿色的 Kerbtray 图标从绿色变为黄色。 之后,立即打开命令提示符窗口,然后运行以下命令:
net session * /d
这将删除现有会话,然后强制建立新会话并接收 Kerberos 票证。
步骤 3:为 SQL Server 创建 SPN
![]() |
---|
仅在客户端使用 TCP/IP 协议连接到 SQL Server 时,SQL Server 才使用 Kerberos。 例如,如果客户端使用命名管道协议,则不使用 Kerberos。 如果计算机上存在多个 SQL Server 实例,则必须为每个 SQL Server 实例配置服务器主体名称,因为每个 SQL Server 实例都使用唯一的 TCP-IP 端口。 |
![]() |
---|
如果 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 实用工具。 为此,请按下列步骤进行操作:
- 对运行 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
- 使用 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
- Ping 故障转移群集实例名称以获得 IP 地址,然后运行
ping -a
以确保 FQDN 的确是由 DNS 返回的。
![]() |
---|
如果您正在使用 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。
![]() |
---|
您必须是域管理员组的成员才能运行 SETSPN 命令。 |
- 如果使用了 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
- 对于运行 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
- 注册 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
![]() |
---|
如果使用了 SQL Server 故障转移群集,则必须注册一个不带端口号的 SPN 和一个带端口号的 SPN。 对于运行 SQL Server 的典型、非群集计算机,只需要注册带端口号的 SPN。 但是,即使有不带端口号的其他 SPN,也不会给非群集计算机带来任何问题。 |
![]() |
---|
您也可以在域控制器上使用 Ldifde.exe 实用工具来验证这两个 SPN 注册。 本主题中的“如何收集 Active Directory 服务器主体名称信息”一节对此进行了介绍。 |
步骤 4:配置客户机
- 对于每个将要连接的客户端,验证 Microsoft Internet Explorer 是否已配置为使用 Windows 身份验证:
- 在 Internet Explorer 中,在**“工具”菜单上,单击“Internet 选项”**。
- 单击**“高级”选项卡。
在“安全”下,单击以选中“启用集成 Windows 身份验证(需要重启动)”,然后单击“确定”**。
步骤 5:测试配置
对于涉及的每台计算机:
- 登录到该计算机,然后使用 Kerbtray.exe 来验证该计算机是否可以从域控制器获取有效的 Kerberos 票证。
- 使用 Kerbtray.exe 删除该计算机上的所有票证。
- 创建并连接到用于返回 SQL Server 数据的网页。
![]() |
---|
将 SQLSERVERNAME 替换为运行 SQL Server 的计算机的名称: |
- 如果返回了数据,此页将显示身份验证类型 Negotiate 和 sp_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