為 Kerberos 連接注冊服務主體名稱
若要將 Kerberos 身份驗證用於 SQL Server,則以下兩個條件都必須得到滿足:
-
客戶端計算機和服務器計算機必須屬於同一 Windows 域或在可信域中。
-
服務主體名稱 (SPN) 必須在 Active Directory 中進行注冊,后者在 Windows 域中起到密鑰分發中心的作用。 SPN 在注冊后會映射到啟動 SQL Server 實例服務的 Windows 帳戶。 如果未進行 SPN 注冊或注冊失敗,則 Windows 安全層無法確定與 SPN 關聯的帳戶,因而無法使用 Kerberos 身份驗證。
注意
如果服務器無法自動注冊 SPN,則必須手動注冊 SPN。
可以通過查詢 sys.dm_exec_connections 動態管理視圖來驗證連接使用的是否為 Kerberos。 請運行下面的查詢並檢查 auth_scheme 列的值,如果 Kerberos 已啟用,該值應為“KERBEROS”。
SELECT auth_scheme FROM sys.dm_exec_connections WHERE session_id = @@spid ;
服務主體名稱 (SPN) 是客戶端用來唯一標識服務實例的名稱。 Kerberos 身份驗證服務可以使用 SPN 對服務進行身份驗證。 當客戶端想要連接到某個服務時,它將查找該服務的實例,並為該實例編寫 SPN,然后連接到該服務並顯示該服務的 SPN 以進行身份驗證。
![]() |
---|
本主題中提供的信息還適用於使用聚類分析的 SQL Server 配置。 |
Windows 身份驗證是向 SQL Server 驗證用戶身份的首選方法。 使用 Windows 身份驗證的客戶端通過 NTLM 或 Kerberos 進行身份驗證。 在 Active Directory 環境中,始終首先嘗試 Kerberos 身份驗證。 Kerberos 身份驗證不可用於使用命名管道的 SQL Server 2005 客戶端。
當啟動數據庫引擎服務時,它將嘗試注冊服務主體名稱 (SPN)。 如果啟動 SQL Server 的帳戶沒有在 Active Directory 域服務中注冊 SPN 的權限,則此調用將失敗,並將在應用程序事件日志以及 SQL Server 錯誤日志中記錄一條警告消息。 若要注冊 SPN,必須在內置帳戶(如 Local System(建議不要使用)或 NETWORK SERVICE)或有權注冊 SPN 的帳戶(如域管理員帳戶)下運行數據庫引擎。 在 Windows 7 或 Windows Server 2008 R2 操作系統上運行 SQL Server 時,可以使用虛擬帳戶或托管服務帳戶 (MSA) 運行 SQL Server。 虛擬帳戶和 MSA 都可以注冊 SPN。 如果 SQL Server 不在上述任一帳戶下運行,則啟動時不會注冊 SPN,此時,域管理員必須手動注冊 SPN。
![]() |
---|
將 Windows 域配置為在低於 Windows Server 2008 R2 Windows Server 2008 R2 功能級別的級別上運行時,托管服務帳戶將不具有注冊 SQL Server 數據庫引擎服務的 SPN 所需的權限。 如果需要進行 Kerberos 身份驗證,域管理員應手動在托管服務帳戶上注冊 SQL Server SPN。 |
知識庫文章 How to use Kerberos authentication in SQL Server(如何在 SQL Server 中使用 Kerberos 身份驗證)包含有關如何向非域管理員帳戶授予 SPN 讀或寫權限的信息。
有關其他信息,請參閱 How to Implement Kerberos Constrained Delegation with SQL Server 2008(如何使用 SQL Server 2008 實現 Kerberos 約束的委托)
自 SQL Server 2008 開始,SPN 格式已發生更改,目的是為了支持對 TCP/IP、Named Pipes 和 Shared Memory 進行 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 連接,由於 SPN 中包括 TCP 端口,因此 SQL Server 必須啟用 TCP 協議,以便用戶使用 Kerberos 身份驗證進行連接。 |
MSSQLSvc/fqdn:port |
使用 TCP 時訪問接口生成的默認 SPN。 port 是 TCP 端口號。 |
MSSQLSvc/fqdn |
使用除 TCP 之外的協議時訪問接口生成的用於默認實例的默認 SPN。fqdn 為完全限定的域名。 |
MSSQLSvc/fqdn:InstanceName |
使用除 TCP 之外的協議時訪問接口生成的用於命名實例的默認 SPN。InstanceName 是 SQL Server 的實例名稱。 |
當 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,管理員必須使用隨 Microsoft Windows Server 2003 支持工具提供的 Setspn.exe 工具。有關詳細信息,請參閱 Windows Server 2003 Service Pack 1 Support Tools(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 之前將其刪除。 可以使用帶有 -D 開關的 setspn 命令實現此操作。 以下示例說明如何手動注冊基於新實例的 SPN。 對於默認實例,請使用:
setspn -A MSSQLSvc/myhost.redmond.microsoft.com accountname
對於命名實例,請使用:
setspn -A MSSQLSvc/myhost.redmond.microsoft.com:instancename accountname
客戶端驅動程序支持用戶指定的 SPN。 但是,如果未提供 SPN,則將根據客戶端連接類型自動生成 SPN。對於 TCP 連接,對命名實例和默認實例使用 MSSQLSvc/FQDN:[port] 格式的 SPN。
對於 Named Pipes 和 Shared Memory 連接,對命名實例使用 MSSQLSvc/FQDN:instancename 格式的 SPN,對默認實例使用 MSSQLSvc/FQDN 格式。
將服務帳戶用作 SPN
可將服務帳戶用作 SPN。 可以通過 Kerberos 身份驗證的連接屬性指定服務帳戶,並采用以下格式:
-
username@domain 或 domain\username(適用於域用戶帳戶)
-
machine$@domain 或 host\FQDN(適用於計算機域帳戶,例如 Local System 或 NETWORK SERVICES)。
若要確定連接的身份驗證方法,請執行下面的查詢。
SELECT net_transport, auth_scheme FROM sys.dm_exec_connections WHERE session_id = @@SPID;
下表說明根據 SPN 注冊情況所使用的身份驗證默認值。
應用場景 |
身份驗證方法 |
||
---|---|---|---|
SPN 映射到正確的域帳戶、虛擬帳戶、MSA 或內置帳戶。 例如 Local System 或 NETWORK SERVICE。
|
本地連接使用 NTLM,遠程連接使用 Kerberos。 |
||
SPN 是正確的域帳戶、虛擬帳戶、MSA 或內置帳戶。
|
本地連接使用 NTLM,遠程連接使用 Kerberos。 |
||
SPN 映射到不正確的域帳戶、虛擬帳戶、MSA 或內置帳戶。 |
身份驗證失敗。 |
||
SPN 查找失敗或未映射到正確的域帳戶、虛擬帳戶、MSA 或內置帳戶,或者不是正確的域帳戶、虛擬帳戶、MSA 或內置帳戶。 |
本地和遠程連接使用 NTLM。 |