如何在 SQL Server 故障轉移群集中啟用 Kerberos 身份驗證
如何在 SQL Server 故障轉移群集中啟用 Kerberos 身份驗證Kerberos 是一種網絡身份驗證協(xié)議,用于為客戶端/服務器應用程序提供嚴格的身份驗證。 Kerberos 為互操作性奠定
如何在 SQL Server 故障轉移群集中啟用 Kerberos 身份驗證
Kerberos 是一種網絡身份驗證協(xié)議,用于為客戶端/服務器應用程序提供嚴格的身份驗證。 Kerberos 為互操作性奠定了基礎,同時增強了企業(yè)范圍的網絡身份驗證的安全性。
可以將 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”。
下一節(jié)介紹了如何連接到運行 Microsoft Internet 信息服務 (IIS) 的服務器,以便與運行 SQL Server 的服務器建立 Kerberos 連接。
只有在運行 Windows 2000 SP3 時才能使用此功能。
在執(zhí)行設置過程之前,請先下載 Kerbtray 和 SetSPN 實用工具。
? 若要下載 Kerbtray 實用工具,請訪問 Microsoft 網站。 使用 Kerbtray.exe ,您可以在所使用的任意關聯計算機上輕松地驗證和/或刪除 Kerberos 票證。
? 若要下載 SetSPN 實用工具,請訪問 Microsoft 網站。
僅在客戶端使用 TCP/IP 協(xié)議連接到 SQL Server 時,SQL Server 才使用 Kerberos 。 例如,如果客戶端使用命名管道協(xié)議,則不使用 Kerberos 。 如果計算機上存在多個 SQL Server 實例,則必須為每個 SQL Server 實例配置服務器主體名稱,因為每個 SQL Server 實例都使用唯一的 TCP-IP 端口。
,
1. 步驟 1:配置域控制器
在域控制器的“Active Directory 用戶和計算機”中:
1. 右鍵單擊要設置委托的計算機(IIS 服務器),再單擊選中“此計算機可以信任,可用來委托”。 如果運行 SQL Server 的計算機似乎是所連接的最后一臺計算機,但該計算機有一臺鏈接服務器,則還必須向其授予委托權限。 如果它不是鏈中的最后一臺計算機,則必須信任中間的所有計算機,使它們可用于委托。
2. 向 SQL Server 服務帳戶的域用戶帳戶授予委托權限。 您必須有一個域用戶帳戶用于所安裝的 SQL Server 群集(對于使用本地系統(tǒng)帳戶運行 SQL Server 的計算機,不需要此步驟):
a. 在 Users 文件夾中,右鍵單擊用戶帳戶,再單擊“屬性”。
b. 在“用戶帳戶屬性”對話框中,單擊“帳戶”選項卡。
c. 在“帳戶選項”下,單擊以選中“帳戶可以信任,可用來委托”復選框。 確保為此帳戶取消選中“帳戶是敏感帳戶,不能被委托”復選框。
3. 使用 Kerbtray.exe 實用工具來驗證 Kerberos 票證是否是從域控制器和主機接收到的:
a. 右鍵單擊通知區(qū)域中的 Kerbtray 圖標,再單擊“清除票證”。
b. 等待綠色的 Kerbtray 圖標從綠色變?yōu)辄S色。 之后,立即打開命令提示符窗口,然后運行以下命令: net session* /d
這將刪除現有會話,然后強制建立新會話并接收 Kerberos 票證。
步驟 2:配置 IIS 服務器
1. 用 .asp 示例文件替換默認網站的 Wwwroot 文件。 若要創(chuàng)建 .asp 示例文件,請使用“用于檢索 SQL Server 數據的 ASP 測試腳本”一節(jié)中提供的代碼。
2. 將該文件添加到 Wwwroot 文件夾。 若要執(zhí)行此操作,請使用“用于檢索 SQL Server 數據的 ASP 測試腳本”一節(jié)中的代碼。 將該文件另存為 Default.asp 。
,3. 將 Web 服務器重新配置為僅使用集成 Windows 身份驗證:
a. 右鍵單擊默認的 Web 服務器,再單擊“安全性”文件夾。
b. 在“安全性”文件夾中,進行正確的更改,再單擊以清除“匿名訪問”。
c. 從命令提示符運行以下命令:
cscript C:Inetpub?minscripts?sutil.vbs get
w3svc/NTAuthenticationProviders
如果啟用了“協(xié)商”,將返回以下信息:
NTAuthenticationProviders : (STRING) Negotiate,NTLM
有關將 IIS 配置為支持 Kerberos 和 NTLM 身份驗證的其他信息,請參閱知識庫文章“How to Configure IIS to Support Both Kerberos and NTLM Authentication”。




4. 驗證注冊表中是否存在 HKLMSWMSMSSQLSERVERClientDSQUERY 值。 如果未顯示該值,請將該值作
為 DSQUERY:Reg_SZ:DBNETLIB 添加。
5. 使用 Kerbtray.exe 實用工具來驗證 Kerberos 票證是否是從域控制器和主機接收到的:
a. 右鍵單擊通知區(qū)域中的 Kerbtray 圖標,再單擊“清除票證”。
b. 等待綠色的 Kerbtray 圖標從綠色變?yōu)辄S色。 之后,立即打開命令提示符窗口,然后運行以下命令:
net session * /d
這將刪除現有會話,然后強制建立新會話并接收 Kerberos 票證。
步驟 3:為 SQL Server 創(chuàng)建 SPN
,

若要為 SQL Server 配置 SPN ,請使用 Microsoft Windows 資源工具包中的 SETSPN 實用工具。 若要下載 SETSPN 實用工具,請訪問 Microsoft 網站。
在運行 SETSPN 之前,請注意下列事項:
?
? 必須以有權注冊 SPN 的登錄帳戶運行 setspn.exe 。 請注意運行 SQL Server 實例的域用戶帳戶。 在下列示例中,此帳戶命名為
重要提示:如果在 LocalSystem 帳戶下運行 SQL Server 實例,則不必運行 SETSPN 實用工具。
? 必須擁有運行 SQL Server 的計算機的完全限定域名 (FQDN)。 若要確定運行 SQL Server 的計算機的
FQDN ,請使用 ping 實用工具。 為此,請按下列步驟進行操作:
1. 對運行 SQL Server 的計算機執(zhí)行 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 地址執(zhí)行反向查找,以確保域名系統(tǒng) (DNS) 協(xié)議正確返回了 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 返回的。
,



在確定運行 SQL Server 服務的域用戶帳戶、運行 SQL Server 的計算機的 FQDN 以及 SQL Server 實例所使用的 TCP/IP 端口之后,請按照下列步驟為 SQL Server 創(chuàng)建 SPN 。
1. 如果使用了 SQL Server 故障轉移群集,請運行以下 SETSPN 命令:
setspn -A MSSQLSvc/
例如,如果 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/
例如,如果 MySQLServer.MyDomain.com 在域用戶帳戶 SQLSVC 下、端口 1433 上運行,請使用以下
SETSPN 命令:
setspn -A MSSQLSvc/MySQLServer.MyDomain.com:1433 SQLSVC
3. 注冊 SPN 后,使用 SETSPN 實用工具的 LIST 功能(-L 開關)驗證是否已正確注冊 SPN 。 運行 SETSPN -L
setspn -L
例如,如果 MySQLServer.MyDomain.com 在域用戶帳戶 SQLSVC 下、端口 1433 上運行,請使用以下命
令:
,setspn -A SQLSVC
在步驟 1(如果 SQL Server 是群集服務器)和步驟 2(如果 SQL Server 不是群集服務器)中創(chuàng)建的 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



步驟 4:配置客戶機
1. 對于每個將要連接的客戶端,驗證 Microsoft Internet Explorer 是否已配置為使用 Windows 身份驗證:
2. 在 Internet Explorer 中,在“工具”菜單上,單擊“Internet 選項”。
3. 單擊“高級”選項卡。
在“安全”下,單擊以選中“啟用集成 Windows 身份驗證(需要重啟動) ”,然后單擊“確定”。
步驟 5:測試配置
對于涉及的每臺計算機:
1. 登錄到該計算機,然后使用 Kerbtray.exe 來驗證該計算機是否可以從域控制器獲取有效的 Kerberos 票證。
2. 使用 Kerbtray.exe 刪除該計算機上的所有票證。
,3. 創(chuàng)建并連接到用于返回 SQL Server 數據的網頁。


? 如果返回了數據,此頁將顯示身份驗證類型 Negotiate 和 sp_helpdb 存儲過程的結果 SQL Server 數據,該
存儲過程應返回通過 .ASP 頁連接到的服務器上的數據庫列表。
? 如果在 SQL Server 上啟用了審核,則在應用程序日志中,將看到該連接是“可信”的。
用于檢索 SQL Server 數據的 ASP 測試腳本
下面是用于 SQL Server 數據的 ASP 測試腳本。 如果使用此代碼示例,請確保將 SQLSERVERNAME 替換為運行 SQL Server 的計算機的名稱:
<@ Language=VBScript >
<="'auth_user' is" & request.servervariables("auth_user")>
<="'auth_type' is" & request.servervariables("auth_type")>
Connections string is " Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=pubs;Data Source=SQLSERVERNAME
<
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) "
"
while not rs.EOF
Response.Write cstr(rs(0)) "
"
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.
>
如何收集 Active Directory 服務器主體名稱信息
若要收集 Active Directory 服務器主體名稱 (SPN) 信息,請在某個域控制器上鍵入下面的命令,其中 betaland 是 NetBIOS 域名,NewoutputUsers.txt 是用于輸出結果的輸出文件名。 如果不使用完整路徑,則文件將被放到運行命令行時的當前文件夾中。 此示例命令可查詢整個域:
ldifde -d "CN=Users,DC=betaland" -l servicePrincipalName -F NewoutputUsers.txt
此語法創(chuàng)建名為 NewoutputUsers.txt 的文件,其中包含的信息與本主題的“NewouputUsers.txt 的域級輸出”一節(jié)的輸出相似。
收集整個域的信息時,此輸出文件可能會過大。 因此,若要僅收集與特定用戶名相關的信息,請使用下面的語法,其中 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