SQL Server Native Client 中用戶端連線的服務主體名稱 (SPN) 支援

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)

重要

SQL Server Native Client (通常縮寫為 SNAC) 已從 SQL Server 2022 (16.x) 和 SQL Server Management Studio 19 (SSMS) 中移除。 不建議使用 SQL Server Native Client (SQLNCLI 或 SQLNCLI11) 和舊版 Microsoft OLE DB Provider for SQL Server (SQLOLEDB) 開發新的應用程式。 往後請改用新的 Microsoft OLE DB Driver (MSOLEDBSQL) for SQL Server 或最新的 Microsoft ODBC Driver for SQL Server。 如需 SQL Server 資料庫引擎元件隨附的 SQLNCLI(版本 2012 到 2019),請參閱此 支援生命週期例外狀況

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

驗證通訊協定會使用 SPN 來決定 SQL Server 執行個體所執行的帳戶。 如果已知執行個體帳戶,可以透過用戶端和伺服器使用 Kerberos 驗證提供相互驗證。 如果實例帳戶未知,則會使用僅由伺服器提供用戶端驗證的 NTLM 驗證。 目前,SQL Server Native Client 會執行驗證查閱,從實例名稱和網路連線屬性衍生 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,而且不會知道所使用的驗證方法。
使用目前版本的 SQL Server Native Client 用戶端應用程式會將連接字串中的 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 金鑰值與您針對主體伺服器指定的值相同。
ODBC 應用程式會將 SPN 指定為主體伺服器或容錯移轉夥伴伺服器的連接屬性。 連接屬性 SQL_COPT_SS_SERVER_SPN 可用來指定與主體伺服器的連線 SPN。

連線屬性 SQL_COPT_SS_FAILOVER_PARTNER_SPN 可用來指定容錯移轉夥伴伺服器的 SPN。
OLE DB 應用程式會將 SPN 指定為主體伺服器或容錯移轉夥伴伺服器的資料來源初始化屬性。 SSPROP_INIT_SERVER_SPN 屬性集中的連接屬性 DBPROPSET_SQLSERVERDBINIT 可用於指定連接的 SPN。

SSPROP_INIT_FAILOVER_PARTNER_SPN 中的連接屬性 DBPROPSET_SQLSERVERDBINIT 可用於指定容錯移轉夥伴伺服器的 SPN。
使用者為 ODBC 資料來源名稱 (DSN) 中的伺服器或容錯移轉夥伴伺服器指定 SPN。 您可以透過 [DSN 設定] 對話方塊,在 ODBC DSN 中指定 SPN。
使用者會在 OLE DB 的 [資料連結][登入] 對話方塊中指定伺服器或容錯移轉夥伴伺服器的 SPN。 SPN 可以在 [資料連結][登入] 對話方塊中指定。 [ 登入 ] 對話方塊可以搭配 ODBC 或 OLE DB 使用。
ODBC 應用程式會決定用來建立連接的驗證方法。 成功開啟連線時,應用程式可以查詢連接屬性 SQL_COPT_SS_INTEGRATED_AUTHENTICATION_METHOD ,以判斷所使用的驗證方法。 這些值會包含 NTLM 和 Kerberos ,但不限於
OLE DB 應用程式會決定用於建立連接的驗證方法。 當連接成功開啟時,應用程式可以查詢 SSPROP_AUTHENTICATION_METHOD 屬性集中的連接屬性 DBPROPSET_SQLSERVERDATASOURCEINFO 來決定所使用的驗證方法。 這些值會包含 NTLM 和 Kerberos ,但不限於

容錯移轉

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 使用者帳戶名稱。

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

(如果您要連線的伺服器是在本機系統或網路服務帳戶下執行,以取得 Kerberos 驗證, ServerSPN 可以是 MachineName $@ 網域 格式。)
KDCKey/MachineName 使用者指定的 SPN。

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

支援 SPN 的 ODBC 和 OLE DB 語法

如需語法特定資訊,請參閱下列主題:

另請參閱

SQL Server Native Client 功能
註冊 Kerberos 連接的服務主體名稱