Sql-Server

對於每個 SQL 實例,我的 SPN 條目應該是什麼樣的?

  • May 12, 2019

我發現關於如何準確格式化 SPN(服務主體名稱)以獲得正確的 Kerberos 連接以及每個 SQL 實例需要多少個相互矛盾的資訊。

此 2017 MS 文件包含以下內容:

從 SQL Server 2008 開始,為了支持 TCP/IP、命名管道和共享記憶體上的 Kerberos 身份驗證,更改了 SPN 格式。命名實例和預設實例支持的 SPN 格式如下。

  • 命名實例:MSSQLSvc/FQDN:[port|instancename]
  • 預設實例:MSSQLSvc/FQDN:port|MSSQLSvc/FQDN

新的 SPN 格式不需要埠號。這意味著多埠伺服器或不使用埠號的協議可以使用 Kerberos 身份驗證。

我認為最後一段的意思是我只需要一個條目,以下之一:

  • 命名實例:MSSQLSvc/sqlbox1.mydomain.org/instance2
  • 預設實例:MSSQLSvc/sqlbox1.mydomain.org

這似乎與這個較舊的 (2011) MS 文件相矛盾,不僅與埠號有關,還與使用什麼名稱有關:

要創建 SPN,您可以使用 SQL Server 的 NetBIOS 名稱或完全限定域名 (FQDN)。但是,您必須為 NetBIOS 名稱和 FQDN 創建一個 SPN

當我查看環境中已經存在的 SPN 時,我看到了各種各樣的組合,有些伺服器最多有 4 個條目:

  • MSSQLSvc/sqlbox1
  • MSSQLSvc/sqlbox1:1433
  • MSSQLSvc/sqlbox1.mydomain.org
  • MSSQLSvc/sqlbox1.mydomain.org:1433

甚至MS 自己的 Kerberos 配置管理器似乎也想生成最後兩個版本(帶有適當的混淆):

在此處輸入圖像描述

同樣,對於現有的命名實例,我看到了一個奇怪的組合,其中一些幾乎可以肯定是無效的:

  • MSSQLSvc/sqlbox1:1522
  • MSSQLSvc/sqlbox1:instance2
  • MSSQLSvc/sqlbox1.mydomain.org:1522
  • MSSQLSvc/sqlbox1.mydomain.org:instance2
  • MSSQLSvc/sqlbox1.mydomain.org/instance2
  • MSSQLSvc/sqlbox1.mydomain.org:1522:instance2

那麼,如果我只在我的環境中使用 TCP,那麼對於預設實例和命名實例,我的 DSN 應該是什麼樣子呢?

我應該包括埠,還是不包括?還是包括一個帶埠和一個不帶?

僅使用 FQDN,還是只需要帶有 Netbios 名稱的條目?或者只有當我們使用命名管道(我們不是)時才會這樣?

(對於上下文,我們執行 SQL 2005 到 2014,一些集群,另一些獨立。連接僅通過 TCP,在配置管理器中禁用命名管道。我們將手動修復/創建這些,而不是允許 SQL 服務帳戶創建它們伺服器啟動。)

如果您只使用 TCP/IP 連接到您的實例,則只需要指定的埠。通過命名管道協議連接到 SQL 實例時使用實例名稱。遺憾的是,MS 文章沒有直接說明哪種協議需要哪種格式,但它源自(我的環境中的許多測試)和以下MS 文章語句

對於命名管道和共享記憶體連接,MSSQLSvc/FQDN:instancename格式的 SPN用於命名實例,MSSQLSvc/FQDN用於預設實例。

關於 FQDN 與 NETBIOS 名稱,我會推薦 FQDN,因為如果您遇到隨機 DNS 伺服器問題,它們不會那麼容易出現問題。

從我關於此事的部落格文章中提取,格式應如下所示:

在此處輸入圖像描述

可以在此處找到 MS 的源參考。

現在讓您的網路管理員日(例如,允許自註冊 SPN 的 OU 配置)

您的網路管理員可以在包含所有 SQL Server 服務帳戶的域上創建一個 OU,這些服務帳戶可以配置為服務帳戶可以為自己和自己單獨創建 SPN。該方法主要遵循Ryan Reis 的部落格,但有一些細微的調整,因此不會執行過度授權。

此過程描述了在域中創建 OU,以允許其中的帳戶自行註冊自己的 SPN:

  1. 作為在域上具有提升權限的帳戶,打開ADSI Edit(命令提示符下的 adsiedit)
  2. 右鍵點擊 ADSI 編輯 ->連接到…
  3. 連接到預設命名上下文
  4. 導航到/創建包含您希望授予 SPN 權限的服務帳戶的 OU 容器
  5. 右鍵點擊OU ->屬性
  6. 點擊安全選項卡
  7. 點擊高級按鈕
  8. 突出顯示SELF並點擊*Edit…或者如果SELF特殊使用者未顯示在組或使用者名列表中,請點擊Add…*並輸入SELF作為對象名稱
  9. 點擊屬性選項卡
  10. 從應用到旁邊的下拉列表中選擇後代使用者對象: 注意:這是對 Ryan 部落格文章中概述的步驟的輕微調整,原因可以在此ServerFault/StackExchange文章中更好地概述。
  11. 選中以下旁邊

允許框:

  • 讀取 servicePrincipalName
  • 寫 servicePrincipalName
  1. 點擊確定(在權限輸入視窗上)
  2. 點擊確定(在高級安全設置視窗中)
  3. 點擊確定(在 OU 屬性視窗上)
  4. 將執行 SQL Server 服務的服務帳戶添加到 OU
  5. (可選)重新啟動在所述帳戶下執行的SQL Server 服務
  6. 享受美食

完成上述步驟後,相關的 OU 容器現在已配置,以便添加到其中的任何帳戶都能夠為自己和自己單獨註冊和刪除 SPN。這正是正確數量的權限,因為這些帳戶將無法踐踏其他帳戶註冊的 SPN。

在步驟 16 中重新啟動 SQL Server 的目的是確保按預期註冊 SPN。SQL 將嘗試在關閉時刪除任何已註冊的 SPN,並在啟動時添加它們,因此只有在目前不存在用於所述 SQL Server 服務的 SPN 時才真正需要重新啟動。

關於此方法的最後一點說明是,如果您在傳統的故障轉移群集實例 (FCI) 配置中執行 SQL Server,則不建議將此實例的服務帳戶添加到此 OU,根據KB 2443457

我真的需要發布我的 Kerberos 系列的第 2 部分……

引用自:https://dba.stackexchange.com/questions/180064