若要搭配 SQL Server 使用 Kerberos 驗證,這兩個條件都必須成立:
用戶端和伺服器電腦必須屬於相同的 Windows 網域,或在受信任的網域中。
必須向 Active Directory 登錄「服務主要名稱」(SPN),而 Active Directory 的角色如同 Windows 網域中的「金鑰發佈中心」。 註冊SPN之後,會對應至啟動SQL Server實例服務的 Windows 帳戶。 如果SPN註冊尚未執行或失敗,Windows 安全性層就無法判斷與SPN相關聯的帳戶,而且不會使用 Kerberos 驗證。
備註
如果伺服器無法自動註冊 SPN,則必須手動註冊 SPN。 請參閱 手動 SPN 註冊。
您可以藉由查詢 sys.dm_exec_connections動態管理檢視來確認連線是否使用 Kerberos。 執行下列查詢並檢查auth_scheme數據行的值,如果已啟用 Kerberos,則會是 “KERBEROS”。
SELECT auth_scheme FROM sys.dm_exec_connections WHERE session_id = @@spid ;
小提示
適用於 SQL Server 的 Microsoft Kerberos Configuration Manager 是一種診斷工具,有助於針對 SQL Server 上發生的 Kerberos 相關連線問題進行疑難排解。 如需詳細資訊,請參閱 Microsoft Kerberos Configuration Manager for SQL Server。
驗證中 SPN 的角色
當應用程式開啟連線並使用 Windows 驗證時,SQL Server Native Client 會傳遞 SQL Server 電腦名稱、執行個體名稱,以及選擇性的 SPN。 如果連線通過SPN,則不會進行任何變更。
如果連線未傳遞 SPN,則會根據使用的通訊協定、伺服器名稱和實例名稱來建構預設 SPN。
在前述兩種狀況中,SPN 都會傳送到「金鑰散佈中心」,以取得安全性 Token 來驗證連接。 如果無法取得安全性令牌,驗證會使用NTLM。
服務主要名稱 (SPN) 是用戶端用以唯一識別服務執行個體的名稱。 Kerberos 驗證服務可以使用 SPN 來驗證服務。 當用戶端想要連接到服務時,它會尋找服務的執行個體、撰寫該執行個體的 SPN、連接到服務,然後呈現服務的 SPN 以進行驗證。
備註
本主題中提供的資訊也適用於使用叢集的 SQL Server 組態。
Windows 驗證是 SQL Server 驗證使用者的慣用方法。 使用 Windows 驗證的用戶端會使用 NTLM 或 Kerberos 進行驗證。 在 Active Directory 環境中,永遠會先嘗試 Kerberos 驗證。 使用命名管道的 SQL Server 2005 用戶端無法使用 Kerberos 驗證。
權限
當資料庫引擎服務啟動時,其會嘗試註冊服務主體名稱 (SPN)。 如果啟動 SQL Server 的帳戶沒有在 Active Directory 網域服務中註冊 SPN 的許可權,此呼叫將會失敗,而且會在應用程式事件記錄檔以及 SQL Server 錯誤記錄檔中記錄警告訊息。 若要註冊 SPN,Database Engine 必須在內建帳戶下執行,例如本機系統(不建議)或 NETWORK SERVICE,或是有權註冊 SPN 的帳戶,例如網域系統管理員帳戶。 當 SQL Server 在 Windows 7 或 Windows Server 2008 R2作系統上執行時,您可以使用虛擬帳戶或受管理的服務帳戶 (MSA) 來執行 SQL Server。 虛擬帳戶和 MSA 都可以註冊 SPN。 如果 SQL Server 未在下列其中一個帳戶下執行,則 SPN 不會在啟動時註冊,而且網域系統管理員必須手動註冊 SPN。
備註
當 Windows 網域設定為在小於 Windows Server 2008 R2 Windows Server 2008 R2 功能等級的情況下執行時,受控服務帳戶將沒有為 SQL Server Database Engine 服務註冊 SPN 所需的許可權。 如果需要 Kerberos 驗證,網域管理員應該在受控服務帳戶上手動註冊 SQL Server SPN。
知識庫文章 如何在 SQL Server 中使用 Kerberos 驗證,包含如何為非網域系統管理員的帳戶授與 SPN 讀取或寫入許可權的相關信息。
如需詳細資訊 ,請參閱如何使用 SQL Server 2008 實作 Kerberos 限制委派
SPN 格式
從 SQL Server 2008 開始,SPN 格式會變更,以支援 TCP/IP 上的 Kerberos 驗證、命名管道和共用記憶體。 具名和預設執行個體支援的 SPN 格式如下所示。
具名實例
MSSQLSvc/FQDN:[port|instancename],其中:
MSSQLSvc 是正在註冊的服務。
FQDN 是伺服器的完全合格域名。
port 是 TCP 通訊埠號碼。
instancename 是 SQL Server 實例的名稱。
默認實例
MSSQLSvc/FQDN:port|MSSQLSvc/FQDN,其中:
MSSQLSvc 是正在註冊的服務。
FQDN 是伺服器的完整網域名稱。
port 是 TCP 通訊埠號碼。
新的SPN格式不需要埠號碼。 這表示多埠伺服器或不使用埠號碼的通訊協定可以使用 Kerberos 驗證。
備註
在 TCP/IP 連線的情況下,其中 TCP 連接埠包含在 SPN 中,SQL Server 必須啟用 TCP 通訊協定,使用者才能使用 Kerberos 驗證進行連線。
| MSSQLSvc/fqdn:port | 使用 TCP 時,此為提供者產生的預設 SPN。 port 是 TCP 通訊埠編號。 |
| MSSQLSvc/fqdn | 使用 TCP 以外的通訊協定時,此為提供者針對預設執行個體所產生的預設 SPN。 fqdn 是完整功能變數名稱。 |
| MSSQLSvc/fqdn:InstanceName | 使用 TCP 以外的通訊協定時,此為提供者針對具名執行個體所產生的預設 SPN。 InstanceName 是 SQL Server 實例的名稱。 |
自動SPN註冊
當 SQL Server 資料庫引擎的執行個體啟動時,SQL Server 會嘗試註冊 SQL Server 服務的 SPN。 當此執行個體停止時,SQL Server 會嘗試取消註冊 SPN。 針對 TCP/IP 連線,SPN 會以 MSSQLSvc/<FQDN>:<tcpport> 格式註冊。具名實例和預設實例都會註冊為 MSSQLSvc,依賴 <tcpport> 值來區分實例。
對於支援 Kerberos 的其他連線,SPN 會以命名實例 MSSQLSvc/<FQDN>:<instancename> 格式來註冊。 註冊預設實例的格式為 MSSQLSvc/<FQDN>。
如果服務帳戶缺少這些動作所需的權限,可能需要手動介入才能註冊或取消註冊 SPN。
手動 SPN 註冊
若要手動註冊 SPN,系統管理員必須使用 Microsoft Windows Server 2003 支援工具所提供的 Setspn.exe 工具。 如需詳細資訊,請參閱 Windows Server 2003 Service Pack 1 支援工具 知識庫文章。
Setspn.exe 是命令行工具,可讓您讀取、修改及刪除服務主體名稱 (SPN) 目錄屬性。 此工具也可讓您檢視目前的 SPN、重設此帳戶的預設 SPN,或是加入或刪除補充 SPN。
下列範例說明用來為 TCP/IP 連線手動註冊 SPN 的語法。
setspn -A MSSQLSvc/myhost.redmond.microsoft.com:1433 accountname
注意 如果SPN已經存在,必須先刪除SPN,才能重新註冊。 您可以使用setspn命令搭配-D切換來執行此動作。 下列範例說明如何手動註冊以新執行個體為基礎的 SPN。 針對預設實例,請使用:
setspn -A MSSQLSvc/myhost.redmond.microsoft.com accountname
若為具名執行個體,請使用:
setspn -A MSSQLSvc/myhost.redmond.microsoft.com:instancename accountname
用戶端連線
用戶端驅動程式內可支援使用者指定的 SPN。 不過,如果未提供SPN,它就會根據用戶端連線的類型自動產生。 針對 TCP 連線, MSSQLSvc/FQDN:[port] 格式的 SPN 會同時用於具名實例和預設實例。
針對命名管道和共用記憶體連線, MSSQLSvc/FQDN:instancename 格式的 SPN 會用於具名實例, 而 MSSQLSvc/FQDN 則用於預設實例。
使用服務帳戶作為SPN
服務帳戶可以當做 SPN 使用, 它們是透過 Kerberos 驗證的連接屬性來指定,並採用下列格式:
username@domain 或 domain\username 用於網域用戶帳戶
針對本機系統或網路服務等計算機域帳戶,可以使用machine$@domain 或host\FQDN。
若要判斷連接的驗證方法,請執行下列查詢。
SELECT net_transport, auth_scheme
FROM sys.dm_exec_connections
WHERE session_id = @@SPID;
身份驗證預設值
下表描述根據SPN註冊案例使用的驗證預設值。
| 情境 | 驗證方法 |
|---|---|
| SPN 會對應到正確的網域帳戶、虛擬帳戶、MSA 或內建帳戶。 例如,本機系統或網路服務。 注意:SQL Server 服務所執行的帳戶必須是已註冊 SPN 所對應的帳戶,這樣才算是正確。 |
本機連接會使用 NTLM,遠端連接則使用 Kerberos。 |
| SPN 是正確的網域帳戶、虛擬帳戶、MSA 或內建帳戶。 注意:正確的意思是,已註冊的 SPN 所對應的帳戶,就是執行 SQL Server 服務的帳戶。 |
本機連接會使用 NTLM,遠端連接則使用 Kerberos。 |
| SPN 對應到不正確的網域帳戶、虛擬帳戶、MSA 或內建帳戶。 | 驗證失敗。 |
| SPN 查閱失敗或未對應至正確的網域帳戶、虛擬帳戶、MSA 或內建帳戶,或不是正確的網域帳戶、虛擬帳戶、MSA 或內建帳戶。 | 本機和遠端連接都會使用 NTLM。 |
評論
專用系統管理員連線 (DAC) 會使用以實例名稱為基礎的SPN。 如果該 SPN 註冊成功的話,Kerberos 驗證便可搭配 DAC 使用。 另外,使用者也可將此帳戶名稱指定為 SPN。
如果 SPN 註冊在啟動期間失敗,此失敗會記錄在 SQL Server 錯誤記錄檔中,而啟動會繼續進行。
如果在關機期間 SPN 取消註冊失敗,此失敗會記錄在 SQL Server 錯誤記錄檔中,並繼續關機。
另請參閱
用戶端連線中的服務主體名稱 (SPN) 支援
用戶端連接中的服務主要名稱 (SPN) (OLE DB)
用戶端連接 (ODBC) 中的服務主要名稱 (SPN)
SQL Server Native Client 功能
管理 Reporting Services 環境中的 Kerberos 驗證問題