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

若要為 SQL Server 配置 SPN ,請使用 Microsoft Windows 資源工具包中的 SETSPN 實用工具。 若要下載 SETSPN 實用工具,請訪問 Microsoft 網(wǎng)站。
在運行 SETSPN 之前,請注意下列事項:
?
? 必須以有權(quán)注冊 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 故障轉(zhuǎn)移群集實例名稱以獲得 IP 地址,然后運行 ping -a 以確保 FQDN 的確是由 DNS 返回的。
,



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


? 如果返回了數(shù)據(jù),此頁將顯示身份驗證類型 Negotiate 和 sp_helpdb 存儲過程的結(jié)果 SQL Server 數(shù)據(jù),該
存儲過程應(yīng)返回通過 .ASP 頁連接到的服務(wù)器上的數(shù)據(jù)庫列表。
? 如果在 SQL Server 上啟用了審核,則在應(yīng)用程序日志中,將看到該連接是“可信”的。
用于檢索 SQL Server 數(shù)據(jù)的 ASP 測試腳本
下面是用于 SQL Server 數(shù)據(jù)的 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 服務(wù)器主體名稱信息
若要收集 Active Directory 服務(wù)器主體名稱 (SPN) 信息,請在某個域控制器上鍵入下面的命令,其中 betaland 是 NetBIOS 域名,NewoutputUsers.txt 是用于輸出結(jié)果的輸出文件名。 如果不使用完整路徑,則文件將被放到運行命令行時的當(dāng)前文件夾中。 此示例命令可查詢整個域:
ldifde -d "CN=Users,DC=betaland" -l servicePrincipalName -F NewoutputUsers.txt
此語法創(chuàng)建名為 NewoutputUsers.txt 的文件,其中包含的信息與本主題的“NewouputUsers.txt 的域級輸出”一節(jié)的輸出相似。
收集整個域的信息時,此輸出文件可能會過大。 因此,若要僅收集與特定用戶名相關(guān)的信息,請使用下面的語法,其中 User Name 是用戶名,betaland 是要查詢的域:
ldifde -d "CN=User Name,DC=betaland" -l servicePrincipalName -F NewoutputUsers.txt 收集特定用戶的信息可以大大減少搜索所涉及的數(shù)據(jù)。 如果收集整個域的信息,請搜索相關(guān)服務(wù)器的特定用戶名。 在輸出示例中,可以看到:
?
? 服務(wù)器項不再存在,但并未從 Active Directory 中完全刪除。 用戶“User Name”在大約十臺不同服務(wù)器上擁有有效的 SPN 信息。
另外,可以使用 Active Directory 服務(wù)接口 (ADSI) 工具更正無效的 Active Directory 項。
注意:如果使用 ADSI 編輯管理單元、LDP 實用工具或其他 LDAP 版本 3 客戶端,并且錯誤修改了 Active Directory 對象的屬性,可能會導(dǎo)致嚴重問題。 若要解決這些問題,可能需要重新安裝 Microsoft Windows 2000 Server 和/或 Microsoft Exchange 2000 Server。 Microsoft 不能保證解決由于錯誤修改 Active Directory 對象的屬性而出現(xiàn)的問題。 若要修改這些屬性,您必須自行承擔(dān)風(fēng)險。
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