Sql-Server

如何停止在連結伺服器中使用 sql server 登錄憑據?

  • August 30, 2021

我有一個位於意大利的連結伺服器,server_italia它連接到位於美國俄勒岡州的伺服器ORDB1

我們在不同但受信任的域上。

server_italiato的連接ORDB1是通過使用具有登錄名和所需權限的 sql server 帳戶的連結伺服器進行的ORDB1

我是一個sysadmin甚至domain admin在我的域中,而我的server_italia但我只sysadminORDB1.

有一個類似的問題:

如何使用 Windows 身份驗證讓我的連結伺服器正常工作?

但它沒有提供the答案。

這是我的連結伺服器:

在此處輸入圖像描述

當我執行以下查詢時,server_italia我得到以下結果:

SELECT [the_server]=@@servername,
auth_scheme 
FROM sys.dm_exec_connections WHERE session_id = @@spid ;  


SELECT net_transport, auth_scheme   
FROM sys.dm_exec_connections   
WHERE session_id = @@SPID; 

在此處輸入圖像描述

在俄勒岡州,我得到了這個:

在此處輸入圖像描述

如果我的美國同事得到:

  1. 為您的服務帳戶執行的服務註冊的服務主體名稱
  2. 在他們的伺服器上設置 Kerberos 身份驗證
  3. 配置約束委派,因為這將允許傳遞憑據,否則您可能仍會遇到雙跳問題。– 添加在John Eisbrener的評論中

如果沒有 ,我可以使用我linked serversql server account login impersonation嗎?

我不知道你是否解決了這個問題,但是在最近我們自己(重新)發現了讓委託執行的要求之後,我想我至少可以提供一個答案,以防其他人遇到你的文章類似的問題。

為了幫助使我的文章清晰(尤其是對於遇到它但沒有閱讀您的問題的任何人),委託是中介服務代表客戶將客戶憑據移交給輔助服務的能力。直覺表示,如下:

在此處輸入圖像描述

在這種情況下,伺服器 A是將**客戶端憑據傳遞給輔助服務伺服器 B的中間服務。在您的情況下,server_italia將被視為中間伺服器,並且ORDB1將是輔助服務。

活動目錄 (AD) 功能級別

首先,您的域功能級別很大程度上決定了您可用的選項。如果您的功能級別處於 Windows 2012 之前的任何版本,則域之間的委派僅限於無約束委派。在 2012 年之前,受限委派僅限於單個域內,並且不具備跨域功能。

如果您執行的是 2012 功能級別或更高版本,您還有其他選項,因此這將取決於您對管理、訪問控制等的偏好。2012 功能級別確實開放了通過無約束委派跨域委派憑據的能力,傳統的約束委派,或基於資源的約束委派。我的其餘答案將假設您使用的是 2012+ 功能級別,但如果不是,則無約束委派配置說明是相同的,無論功能級別如何。

常見要求

無論您選擇哪種委託類型(所有選項將在下面列出),所有配置都需要為您將用於執行“中間”服務的帳戶進行以下基本設置(例如上圖中的伺服器 A ,但這可以適用於任何中間服務,例如數據庫、託管在 IIS 上的網站、SSIS、.NET 應用程序等)。在域上,執行將憑據委託給其他服務的服務的帳戶將需要設置以下 AD 屬性:

  • ServicePrincipalNames:這需要列出將委派憑據的伺服器 A 的任何 SPN。在您的範例中,這些看起來如下所示(假設您在森林EURO域中CONTOSO):MSSQLSvc/server_italia.euro.contoso.com、MSSQLSvc/server_italia.euro.contoso.com:1433
  • KerberosEncryptionType:應啟用 AES256(如果您選擇使用該加密類型,則為 AES128)。這在以後很重要,但此設置將確保可以委派 Kerberos 加密令牌。

**注意:**可以通過多種方法查看和設置上述屬性。Active Direcotory 使用者和電腦MMC管理單元是最常見的圖形使用者界面,您可以使用它來調整這些屬性,但是這個界面混淆了很多這些屬性,並且在管理組託管服務帳戶時完全是垃圾。因此,我建議您使用ActiveDirectory PowerShell模組,因為它允許您通過Set-ADUserorSet-ADServiceAccount命令顯式設置這些屬性。Get-ADUser此外,您可以通過orGet-ADServiceAccount命令查看使用者/服務帳戶的屬性。

此外,所有 SQL Server 都應該有一個註冊的 SPN。您可以手動創建這些,但如果您將執行 SQL Server 的服務帳戶嵌套到適當的 OU 中,則自註冊 SPN 將自動發生。可以在此處找到有關該過程的說明。

代表團類型

同樣,假設您使用的是 2012 或更高版本的 AD 功能級別,您有 3 個選項用於執行跨域委派。我將以最容易配置/最不安全到最令人沮喪的配置/最安全的方法列出它們。這些中的任何一個都將起作用,您希望處理多少管理/安全風險將完全取決於您。

這裡的另一個花絮是,沒有什麼可以阻止您將帳戶配置為使用下面列出的多種或所有類型的委派。這些配置並不相互排斥。不過,您應該盡最大努力避免在多個委託方案下進行任何帳戶設置,因為它可能首先使用最不安全的配置(關於如何設置帳戶的部分如下)。

無限制委託

無約束委派是最容易設置的配置,但限制最少。此配置允許執行伺服器 A 的服務帳戶將任何憑據委託給任何輔助服務。這在上圖中直覺地表示,藍色箭頭表示對入站客戶端連接或憑據可以委託給的輔助服務沒有限制。要在中間賬戶上配置這種類型的委託,您只需要設置以下 AD 屬性(除了上面列出的那些):

  • TrustedForDelegation – 將此設置為True

這曾經是它的全部功能,但使用2019 年 7 月的 Windows 安全更新檔,您還需要重新啟用跨信任委託,如該連結中所述。該安全更新檔確實旨在解決此設置的嚴重缺點,在這篇文章中對此進行了更好的解釋:在 Active Directory 中尋找:不受約束的委派和森林信任。同樣,除非您使用 2012 年之前的 AD 功能級別,否則不建議您使用這種類型的委派。

傳統的受限委託

傳統的約束委派限制了伺服器 A 可以將權限委派給的服務,這樣執行伺服器 A 的服務帳戶只能將憑據委派給明確列出的服務。例如,它仍然可以委託任何人的憑據,但它只能將所述憑據傳遞給明確列出的服務。所以從視覺上講,我們限制了我們可以委託的“目的地”,如黃色箭頭所示:

在此處輸入圖像描述

您必須在中間帳戶上配置的 AD 屬性(除了上面常見要求部分中列出的屬性)如下:

  • msDS-AllowedToDelegateTo - 這需要是允許此帳戶向其委派憑據的所有適用 SPN 的列表。在此範例中,它們如下所示:MSSQLSvc/ORDB1.usa.contoso.com、MSSQLSvc/ORDB1.usa.contoso.com:1433(假設ORDB1伺服器位於林USA域中CONTOSO)。

使用此配置,您只能將委派限制為 ADKERBEROS令牌。 如果您希望委託非KERBEROS 憑據,例如通過等,您可以通過設置以下屬性NTLM將此帳戶配置為委託協議:ANY

  • TrustedToAuthForDelegation – 將此設置為True

但是,使用ANY協議配置本質上是有風險的。 這篇部落格文章進一步深入研究了這些屬性及其後果,除非需要將其設置為 true,否則建議您不要這樣做。

從個人的角度來看,我們經常使用傳統的約束委派,因為它易於設置且相對安全(除非您決定將委派用於ANY協議,否則在我看來,您是在為自己設置問題)。

基於資源的受限委託

基於資源的約束委派限制了輔助服務允許來自 的委派憑證的中間服務。這與其他配置略有不同,因為我們將通過列出它將信任委託憑證的服務來配置伺服器 B,而不是像之前的配置中那樣配置伺服器 A。無需對執行伺服器 A 的中間帳戶進行任何額外更改即可完成此操作。因此,在這種情況下,當伺服器 A 嘗試傳遞 Bob 的憑據時,伺服器 B 將辨識伺服器 A 是可以委派權限的“受信任”服務並且身份驗證將毫無問題地進行。從視覺上看,它看起來如下:

在此處輸入圖像描述

在這裡要絕對清楚,中間帳戶(例如伺服器 A)仍然需要配置上面“通用要求”部分中的屬性。此外,目標服務(即Server A)需要設置額外的 AD 屬性:

  • PrincipalsAllowedToDelegateToAccount - 這需要列出所有適用的 SPN,這些 SPN 包含受信任的委託憑證服務。在此範例中,它們如下所示:MSSQLSvc/server_italia.euro.contoso.com、MSSQLSvc/server_italia.euro.contoso.com:1433

就是這樣……從概念上講。對此進行測試以確定,但從我發現的概述這種方法的文章中,這確實是所需要的。事實上,這篇MS 文章貫穿了整個過程,並列出了設置此過程所需的適用 PowerShell 命令,因此可以執行範例 PowerShell 程序來確認雙跳,並且基於資源的約束委派將為您工作。此外,此委派配置應該跨域工作而沒有問題(或信任要求,從我讀過的內容)。這裡的缺點是我們必須配置所有“端點”,從長遠來看,這可能需要更多的管理工作,具體取決於您的設置方式。

我如何知道我配置了哪些委託設置?

在我看來,確定一個帳戶在何種委託配置下執行就像泥一樣清楚。值得慶幸 的是,Willem Kasdorp 發布了一篇文章以及一個PowerShell 腳本,向您展示了您的帳戶目前配置的內容。如果您從安裝了ActiveDirectory PowerShell模組的電腦上執行它,那麼您應該很高興。希望我上面提到的委託配置類型和此腳本生成的矩陣的組合將使您清楚地了解您目前的配置。

最後,如果您在 AD PowerShell 命令方面需要一些幫助,這篇文章在設置我談到的 SPN 列表等的一些屬性時,展示了正確的語法,這已經做得很好了。

如果您有任何問題,請發表評論,我會盡我所能及時回答。

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