如何:在 SQL Server 容錯移轉叢集上啟用 Kerberos 驗證
更新: 2007 年 9 月 15 日
Kerberos 是一種網路驗證通訊協定,可為用戶端/伺服器應用程式提供強大的驗證功能。Kerberos 可作為交互操作的基礎,同時可提升整個企業的網路驗證安全性。
您可以對 Microsoft SQL Server 2005 獨立執行個體,或對在 Microsoft Windows 2000 Service Pack 3 (SP3) 上執行的容錯移轉叢集執行個體,使用 Kerberos 驗證。SQL Server 2005 支援這項功能,會在進行一般的 Microsoft Windows 2000 Active Directory 網域安裝時加以安裝。
若 SQL Server 相依的「網路名稱」資源位於 Windows 2000 系列的叢集中,您就可以在電腦升級至 Windows 2000 SP3 之後,對該資源使用 Kerberos 驗證。如需有關在伺服器叢集上啟用 Kerberos 的詳細資訊,請參閱知識庫文件<Windows 2000 網域環境中的 MSCS 虛擬伺服器限制>。
下列章節將描述如何連接執行 Microsoft Internet Information Services (IIS) 的伺服器,以建立連接到 SQL Server 伺服器的 Kerberos 連接。
必要條件
必須執行 Windows 2000 SP3,才能使用這項功能。
在您執行安裝程式的程序前,請下載 Kerbtray 與 SetSPN 公用程式。
- 若要下載 Kerbtray 公用程式,請瀏覽此 Microsoft 網站。有了 Kerbtray.exe,您就可以輕鬆地從任何相關聯的使用中電腦驗證及 (或) 移除 Kerberos 票證。
- 若要下載 SetSPN 公用程式,請瀏覽此 Microsoft 網站。
SQL Server 只會在用戶端使用 TCP/IP 通訊協定連接到 SQL Server 時使用 Kerberos。例如,用戶端若是使用「具名管道」通訊協定,則不會使用 Kerberos。如果您的電腦上有多個 SQL Server 執行個體,則必須為每個 SQL Server 執行個體設定一個伺服器主體名稱 (SPN),因為每個 SQL Server 執行個體均使用一個唯一的 TCP-IP 通訊埠。
連接執行 Microsoft Internet Information Services 的伺服器與建立 SQL Server 2005 的 Kerberos 連接
- 步驟 1:設定網域控制站
在網域控制站的 [Active Directory 使用者及電腦] 中:
- 以滑鼠右鍵按一下要設定進行委派的電腦 (IIS 服務伺服器),然後按一下 [信任這部電腦以進行委派]。若執行 SQL Server 的電腦應該是聯繫中的最後一部電腦,但該電腦有一部連結的伺服器,則此伺服器也必須被授與委派權限。若這不是鏈結中的最後一部電腦,則所有中介的電腦都必須進行信任委派。
- 將委派權限授予 SQL Server 服務帳戶的網域使用者帳戶。您必須具備叢集 SQL Server 安裝的網域使用者帳戶 (使用本機系統帳戶的 SQL Server 電腦不需執行此步驟):
- 在 [使用者] 資料夾中,以滑鼠右鍵按一下使用者帳戶,然後按一下 [屬性]。
- 在使用者帳戶屬性對話方塊中,按一下 [帳戶] 索引標籤。
- 在 [帳戶選項] 中,點選 [帳戶受信任可以委派] 核取方塊。請確定已為此帳戶清除 [這是機密帳戶,無法委派] 核取方塊。
- 使用 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 認證的詳細資訊,請參閱知識庫文件<如何:設定 IIS 以支援 Kerberos 和 NTLM 驗證>。
附註: 您必須在 IIS 服務伺服器上安裝 Microsoft Data Access (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
注意: |
---|
SQL Server 只會在用戶端使用 TCP/IP 通訊協定連接到 SQL Server 時使用 Kerberos。例如,用戶端若是使用「具名管道」通訊協定,則不會使用 Kerberos。如果您的電腦上有多個 SQL Server 執行個體,則必須為每個 SQL Server 執行個體設定一個伺服器主體名稱 (SPN),因為每個 SQL Server 執行個體均使用一個唯一的 TCP-IP 通訊埠。 |
重要事項: |
---|
若 SQL Server 服務以 LocalSystem 帳戶執行,則不需手動設定 SQL Server 的 SPN。SPN 會在 SQL Server 服務啟動時自動建立。若 SQL Server 服務以網域使用者帳戶執行,您就必須手動設定 SPN。若要執行此作業,請遵循下列步驟。 |
若要設定 SQL Server 的 SPN,請使用 Microsoft Windows Resource Kit 中的 SETSPN 公用程式。若要下載 SETSPN 公用程式,請瀏覽此 Microsoft 網站。
在執行 SETSPN 前,請考量下列資訊:
- 您必須使用具有註冊 SPN 權限的登入帳戶執行 setspn.exe。
- 請記下 SQL Server 執行個體執行時所使用的網域使用者帳戶。在下列範例中,此帳戶的名稱為 <SQL_Service_Account>。
重要 若 SQL Server 執行個體以 LocalSystem 帳戶執行,即不需執行 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
確定 DNS 所傳回的 FQDN 是否正確。
附註: |
---|
若您要使用 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
參數) 來確認登錄的正確性。執行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,一個含通訊埠編號,另一個則不含。對於一般執行 SQL Server 的非叢集電腦,您只需登錄含有通訊埠編號的 SPN。然而,若您有其他不含通訊埠編號的 SPN,也不會對非叢集電腦造成任何問題。 |
附註: |
---|
您也可以在網域控制站上使用 Ldifde.exe 公用程式來確認這兩個 SPN 登錄。這些資訊詳述於本主題的「如何收集 Active Directory 伺服器主體名稱資訊清單」一節。 |
步驟 4:設定用戶端電腦
- 確認每個即將連接的用戶端都已將 Microsoft Internet Explorer 設為使用「Windows 驗證」:
- 在 Internet Explorer 的 [工具] 功能表上,按一下 [網際網路選項]。
- 按一下 [進階] 索引標籤。
在 [安全性] 中,點選 [啟用整合的 Windows 驗證 (需要重新啟動)],然後按一下 [確定]。
步驟 5:測試組態
針對每部相關的電腦:
- 登入電腦,然後使用 Kerbtray.exe 來確認該電腦可從網域控制站取得有效的 Kerberos 票證。
- 使用 Kerbtray.exe 移除電腦上所有的票證。
- 建立並連接到可傳回 SQL Server 資料的網頁。
附註: |
---|
以 SQL Server 電腦的名稱取代 SQLSERVERNAME。 |
- 若傳回資料,此頁面會顯示驗證類型 Negotiate,以及 sp_helpdb 預存程序所傳回的 SQL Server 資料 (此預存程序應該會傳回透過 .ASP 頁面連接之伺服器上的資料庫清單)。
- 若開啟 SQL Server 上的稽核功能,您會在應用程式記錄檔中看到該連線為「信任」。
SQL Server 資料擷取的 ASP 測試指令碼
以下是 SQL Server 資料的 ASP 測試指令碼。若要使用此程式碼範例,請確定以 SQL Server 電腦的名稱取代 SQLSERVERNAME:
<%@ 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 Service Interfaces (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