共用方式為


用戶端連接中的服務主要名稱 (SPN) 支援

適用於:SQL Server

下載 OLE DB 驅動程式

從 SQL Server 2008 (10.0.x) 開始,已經擴充服務主體名稱 (SPN) 的支援以便跨所有通訊協定進行相互驗證。 在舊版 SQL Server 中,只有 SQL Server 執行個體的預設 SPN 使用 Active Directory 註冊時,Kerberos 才能透過 TCP 支援 SPN。

驗證通訊協定會使用 SPN 來決定 SQL Server 執行個體所執行的帳戶。 如果已知執行個體帳戶,可以透過用戶端和伺服器使用 Kerberos 驗證提供相互驗證。 如果執行個體帳戶未知,則會使用僅透過伺服器提供用戶端驗證的 NTLM 驗證。 目前,OLE DB Driver for SQL Server 會執行驗證查詢,從執行個體名稱和網路連線屬性衍生 SPN。 SQL Server 執行個體會嘗試在啟動時註冊 SPN,也可以手動進行註冊。 不過,如果對於嘗試註冊 SPN 的帳戶沒有足夠的存取權限,註冊將會失敗。

網域和電腦帳戶會自動在 Active Directory 中註冊。 這些帳戶可以當作 SPN 使用,或者系統管理員可以定義自己的 SPN。 SQL Server 會允許用戶端直接指定要使用的 SPN,使安全驗證更容易管理而且更可靠。

注意

用戶端應用程式所指定的 SPN 僅能在建立與 Windows 整合式安全性的連接時使用。

提示

適用於 SQL Server 的 Microsoft Kerberos Configuration Manager 是一種診斷工具,有助於針對 SQL Server 上發生的 Kerberos 相關連線問題進行疑難排解。 如需詳細資訊,請參閱 Microsoft Kerberos Configuration Manager for SQL Server

如需有關 Kerberos 的詳細資訊,請參閱下列文件:

使用方式

下表描述用戶端應用程式可允許安全驗證的常見案例。

狀況 描述
舊版應用程式不會指定 SPN。 此相容性案例保證針對舊版 SQL Server 開發的應用程式沒有任何行為變更。 如果沒有指定 SPN,應用程式會依賴所產生的 SPN,而且不會知道所使用的驗證方法。
使用目前版本 OLE DB Driver for SQL Server 的用戶端應用程式會將連接字串中的 SPN 指定為網域使用者或電腦帳戶、執行個體專屬的 SPN,或使用者定義的字串。 ServerSPN 關鍵字可在提供者、初始化或連接字串中使用,以指定下列值:

-指定 SQL Server 執行個體用於連線的帳戶。 此設定會簡化 Kerberos 驗證的存取。 如果有 Kerberos 金鑰發行中心 (KDC),而且有指定正確的帳戶,則可能使用 Kerberos 驗證而非 NTLM。 KDC 通常位於與網域控制站相同的電腦上。

-指定 SPN 來查詢 SQL Server 執行個體的服務帳戶。 對於每個 SQL Server 執行個體,系統會產生可用於此目的的兩個預設 SPN。 不過,系統不保證這些金鑰存在於 Active Directory 中,因此在此情況下,不保證使用 Kerberos 驗證。

-指定將用於查詢 SQL Server 執行個體服務帳戶的 SPN。 此值可以是對應至服務帳戶的任何使用者定義字串。 在此情況下,必須在 KDC 中手動註冊金鑰,而且必須滿足使用者定義 SPN 的規則。

FailoverPartnerSPN 關鍵字可用於指定容錯移轉夥伴伺服器的 SPN。 帳戶的範圍與 Active Directory 金鑰值與您針對主體伺服器指定的值相同。
OLE DB 應用程式會將 SPN 指定為主體伺服器或容錯移轉夥伴伺服器的資料來源初始化屬性。 SSPROP_INIT_SERVER_SPN 屬性集中的連接屬性 DBPROPSET_SQLSERVERDBINIT 可用於指定連接的 SPN。

SSPROP_INIT_FAILOVER_PARTNER_SPN 中的連接屬性 DBPROPSET_SQLSERVERDBINIT 可用於指定容錯移轉夥伴伺服器的 SPN。
使用者會在 OLE DB 的 [資料連結][登入] 對話方塊中指定伺服器或容錯移轉夥伴伺服器的 SPN。 SPN 可以在 [資料連結][登入] 對話方塊中指定。
OLE DB 應用程式會決定用於建立連接的驗證方法。 當連接成功開啟時,應用程式可以查詢 SSPROP_AUTHENTICATION_METHOD 屬性集中的連接屬性 DBPROPSET_SQLSERVERDATASOURCEINFO 來決定所使用的驗證方法。 這些值將包含 (但不限於) NTLMKerberos

容錯移轉

SPN 不會儲存在容錯移轉快取中,因此無法在連線之間傳遞。 在連接字串或連接屬性中指定時,SPN 將會用於主體和夥伴的所有連接嘗試。

連接共用

應用程式應該注意,在部分並非所有連接字串中指定 SPN 可能會造成集區片段。

應用程式可以用程式設計方式將 SPN 指定為連接屬性,而非指定連接字串關鍵字。 此方法可協助管理連線集區分散程度。

應用程式應該注意,設定對應的連接屬性可以覆寫連接字串中的 SPN,但是連接共用所使用的連接字串將會因為共用用途而使用連接字串值。

下層伺服器行為

新的連線行為會由用戶端實作;因此,不會視 SQL Server 版本而定。

連結的伺服器與委派

建立連結的伺服器時,可以使用 sp_addlinkedserver@provstr 參數來指定伺服器和容錯移轉夥伴 SPN。 此方法的優點與在用戶端連接字串中指定 SPN 相同:建立使用 Kerberos 驗證的連線更簡單,而且更可靠。

利用連結的伺服器委派需要 Kerberos 驗證。

應用程式指定之 SPN 的管理層面

選擇要在應用程式中 (透過連接字串) 或以程式設計方式 (透過連線屬性) 指定 SPN 時 (而非依賴預設提供者產生的 SPN),請考慮下列因素:

  • 安全性:指定的 SPN 會顯示受到保護的資訊嗎?

  • 可靠性:若要使用預設的 SPN,藉以執行 SQL Server 執行個體的服務帳戶必須擁有足夠的權限,才能更新 KDC 上的 Active Directory。

  • 便利性與位置透明度:如果應用程式的資料庫移至不同的 SQL Server 執行個體,其 SPN 將會如何受到影響? 如果您使用資料庫鏡像,此概念同時適用於主體伺服器及其容錯移轉夥伴。 如果伺服器變更意指必須變更 SPN,這會如何影響應用程式? 將會管理任何變更嗎?

指定 SPN

您可以在對話方塊和程式碼中指定 SPN。 本節討論如何指定 SPN。

SPN 的最大長度為 260 個字元。

SPN 在連接字串或連接屬性中所使用的語法如下所示:

語法 描述
MSSQLSvc/fqdn 使用 TCP 以外的通訊協定時,此為提供者針對預設執行個體所產生的預設 SPN。

fqdn 是完整的網域名稱。
MSSQLSvc/fqdn:port 使用 TCP 時,此為提供者產生的預設 SPN。

port 是 TCP 通訊埠編號。
MSSQLSvc/fqdn:InstanceName 使用 TCP 以外的通訊協定時,此為提供者針對具名執行個體所產生的預設 SPN。

InstanceName 是 SQL Server 執行個體名稱。
HOST/fqdn

HOST/MachineName
對應到 Windows 自動註冊之內建電腦帳戶的 SPN。
Username@Domain 網域帳戶的直接規格。

Username 是 Windows 使用者帳戶名稱。

Domain 是 Windows 網域名稱或完整網域名稱。
MachineName$@Domain 電腦帳戶的直接規格。

(如果您所連線的伺服器是以 LOCAL SYSTEM 或 NETWORK SERVICE 帳戶執行,若要取得 Kerberos 驗證,ServerSPN 可以是 MachineName$@Domain 格式。)
KDCKey/MachineName 使用者指定的 SPN。

KDCKey 是符合 KDC 金鑰規則的英數字串。

支援 SPN 的 OLE DB 語法

如需語法特定資訊,請參閱下列文章:

另請參閱

OLE DB Driver for SQL Server 功能
註冊 Kerberos 連接的服務主體名稱