註冊服務主要名稱
服務主要名稱 (SPN) 是用戶端用以唯一識別服務執行個體的名稱。Kerberos 驗證服務可以使用 SPN 來驗證服務。當用戶端想要連接到服務時,它會尋找服務的執行個體、撰寫該執行個體的 SPN、連接到服務,然後呈現服務的 SPN 以進行驗證。
[!附註]
本主題提供的資訊也適用於使用群集的 SQL Server 組態。
Windows 驗證是使用者用來向 SQL Server 驗證的慣用方法。使用 Windows 驗證的用戶端是透過 NTLM 或 Kerberos 進行驗證。在 Active Directory 環境中,系統一律會先嘗試進行 Kerberos 驗證。Kerberos 驗證不適用於使用具名管道的 SQL Server 2000 和 SQL Server 2005 用戶端。
權限
當 Database Engine 服務啟動時,它會嘗試註冊服務主要名稱 (SPN)。如果啟動 SQL Server 的帳戶沒有在 Active Directory 網域服務中註冊 SPN 的權限,這個呼叫就會失敗,而且系統會在應用程式事件記錄檔和 SQL Server 錯誤記錄檔中記錄一則警告訊息。若要註冊 SPN,Database Engine 必須在內建帳戶下執行,例如本機系統 (不建議) 或 NETWORK SERVICE,或是在有權註冊 SPN 的帳戶下執行 (例如網域管理員帳戶)。如果 SQL Server 並未在這些帳戶的其中一個之下執行,SPN 就不會在啟動時註冊,而且網域管理員必須手動註冊 SPN。
KB 文件<如何在 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 驗證進行連接。
自動 SPN 註冊
當 SQL Server Database Engine 執行個體啟動時,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 (SP1) 中。如需詳細資訊,請參閱<Windows Server 2003 Service Pack 1 支援工具>KB 文件。
Setspn.exe 是一個命令列工具,可讓您讀取、修改及刪除服務主要名稱 (SPN) 目錄屬性。此工具也可讓您檢視目前的 SPN、重設此帳戶的預設 SPN,或是加入或刪除補充 SPN。
下列範例說明用來手動註冊 TCP/IP 連接之 SPN 的語法。
setspn -A MSSQLSvc/myhost.redmond.microsoft.com:1433 accountname
注意 如果 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。
如果是具名管道和共用記憶體的連接,將會針對具名執行個體使用 MSSQLSvc/FQDN:instancename 格式的 SPN,並針對預設執行個體使用 MSSQLSvc/FQDN 格式的 SPN。
將服務帳戶當做 SPN 使用
服務帳戶可以當做 SPN 使用,它們是透過 Kerberos 驗證的連接屬性所指定,而且會使用以下的格式:
適用於網域使用者帳戶的 username@domain 或 domain\username
適用於電腦網域帳戶 (如本機系統或 NETWORK SERVICES) 的 machine$@domain 或 host\FQDN。
若要判斷連接的驗證方法,請執行下列查詢。
SELECT net_transport, auth_scheme
FROM sys.dm_exec_connections
WHERE session_id = @@SPID;
驗證預設值
下表說明根據 SPN 註冊狀況所使用的驗證預設值。
狀況 |
驗證方法 |
---|---|
SPN 會對應到正確的網域或內建帳戶。例如,本機系統或 NETWORK SERVICE。 ![]()
正確表示已註冊之 SPN 對應的帳戶就是執行 SQL Server 服務所使用的帳戶。
|
本機連接會使用 NTLM,遠端連接則使用 Kerberos。 |
SPN 為正確的網域或內建帳戶。 ![]()
正確表示已註冊之 SPN 對應的帳戶就是執行 SQL Server 服務所使用的帳戶。
|
本機和遠端連接都會使用 Kerberos。 |
SPN 對應到不正確的網域或內建帳戶。 |
驗證失敗。 |
SPN 查閱失敗,或是未對應到正確的網域或內建帳戶,或者它不是正確的網域或內建帳戶。 |
本機和遠端連接都會使用 NTLM。 |
註解
專用管理員連接 (DAC) 會在 SQL Server 2008 中使用以 SPN 為根據的執行個體名稱。如果該 SPN 註冊成功的話,Kerberos 驗證便可搭配 DAC 使用。另外,使用者也可將此帳戶名稱指定為 SPN。
如果 SPN 註冊在啟動期間失敗,則此失敗會記錄在 SQL Server 錯誤記錄檔中,而啟動會繼續進行。
如果 SPN 取消註冊在關閉期間失敗,則此失敗會記錄在 SQL Server 錯誤記錄檔中,而關閉作業會繼續進行。
請參閱