本文可協助您解決當使用者屬於許多群組時,Kerberos 驗證失敗的問題。
原始 KB 編號: 327825
徵兆
屬於大量安全組的使用者在驗證時發生問題。 驗證時,使用者可能會看到 HTTP 400 - 不正確的要求(要求標頭太長)等訊息。 使用者存取資源也有問題,而且使用者的組策略設定可能無法正確更新。
如需錯誤內容的詳細資訊,請參閱 HTTP 400 不正確的要求(要求標頭太長)對 HTTP 要求的回應。
注意
在類似的情況下,Windows NTLM 驗證會如預期般運作。 除非您分析 Windows 行為,否則可能不會看到 Kerberos 驗證問題。 不過,在這種情況下,Windows 可能無法更新組策略設定。
此行為發生在任何目前支援的 Windows 版本中。 如需目前支援的 Windows 版本資訊,請參閱 Windows 生命週期事實表。
原因
使用者無法驗證,因為 Kerberos 建置來代表使用者的票證不夠大,無法包含所有使用者的群組成員資格。
在驗證服務 Exchange 中,Windows 會建置令牌來代表用戶進行授權。 此令牌(也稱為授權內容)包含使用者的安全性識別碼(SID),以及用戶所屬所有群組的 SID。 它也包含儲存在用戶帳戶 sIDHistory
屬性中的任何 SID。 Kerberos 會將此令牌儲存在 Kerberos 票證取得票證 (TGT) 中的 Privilege Attribute Certificate (PAC) 數據結構中。 從 Windows Server 2012 開始,Kerberos 也會將令牌儲存在 Kerberos 票證的 Active Directory 宣告資訊 (動態 存取控制) 數據結構中。 如果使用者是大量群組的成員,而且如果使用者或正在使用的裝置有許多宣告,則這些欄位可能會佔用票證中的許多空間。
令牌的大小固定上限 (MaxTokenSize
)。 傳輸通訊協定,例如遠端過程調用 (RPC) 和 HTTP 會在為驗證作業配置緩衝區時依賴 MaxTokenSize
此值。 MaxTokenSize
具有下列預設值,視建置令牌的 Windows 版本而定:
- Windows Server 2008 R2 和舊版,以及 Windows 7 和舊版:12,000 個字節
- Windows Server 2012 和更新版本,以及 Windows 8 和更新版本:48,000 個字節
一般而言,如果使用者屬於超過120個通用群組,則預設值 MaxTokenSize
不會建立足夠大的緩衝區來保存資訊。 使用者無法驗證,而且可能會收到 記憶體 不足訊息。 此外,Windows 可能無法為使用者套用組策略設定。
注意
其他因素也會影響群組數目上限。 例如,全域和網域本地組的 SID 有較小的空間需求。 Windows Server 2012 和更新版本會將宣告資訊新增至 Kerberos 票證,同時壓縮資源 SID。 這兩個功能都會變更空間需求。
解決方法
若要解決此問題,請更新參與 Kerberos 驗證程式之每部電腦上的登錄,包括客戶端電腦。 我們建議您更新所有以 Windows 為基礎的系統,特別是如果您的使用者必須跨多個網域或樹系登入時。
重要
如果您未正確修改登錄,可能會發生嚴重問題。 在您修改之前, 請先備份登錄以進行還原,以防發生問題。
在每部計算機上,將 MaxTokenSize
登錄專案設定為較大的值。 您可以在子機碼中找到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters
這個專案。 在您進行這項變更之後,計算機必須重新啟動。
如需判斷 的新值 MaxTokenSize
的詳細資訊,請參閱 本文的計算最大令牌大小 一節。
例如,請考慮使用依賴 SQL Server 用戶端之 Web 應用程式的使用者。 在驗證過程中,SQL Server 用戶端會將使用者的令牌傳遞至後端 SQL Server 資料庫。 在這裡情況下,您必須在下列每部計算機上設定 MaxTokenSize
登錄專案:
- 執行 Internet Explorer 的用戶端電腦
- 執行 IIS 的 Web 伺服器
- SQL Server 用戶端電腦
- SQL Server 資料庫計算機
在 Windows Server 2012(及更新版本)中,如果令牌大小通過特定閾值,Windows 可以記錄事件 (事件標識符 31)。 若要啟用此行為,您必須針對 大型 Kerberos 票證設定電腦設定\系統\KDC\Warning 設定計算機設定\系統管理範本\KDC\Warning。
計算令牌大小上限
使用下列公式來計算 Windows 針對特定用戶產生的令牌大小。 此計算可協助您判斷是否需要變更 MaxTokenSize
。
TokenSize = 1200 + 40d + 8s
針對 Windows Server 2012(及更新版本),此公式會定義其元件,如下所示:
- 1200。Kerberos 票證的估計額外負荷值。 此值可能會因 DNS 功能變數名稱長度和用戶端名稱長度等因素而有所不同。
- d. 下列值的總和:
- 在用戶帳戶網域外之通用群組中的成員資格數目。
- 儲存在帳戶屬性中的
sIDHistory
SID 數目。 此值會計算群組成員資格和使用者 SID。
- s. 下列值的總和:
- 用戶帳戶網域內通用群組的成員資格數目。
- 網域本地組的成員資格數目。
- 全域群組中的成員資格數目。
Windows Server 2008 R2 和舊版使用相同的公式。 不過,這些版本會將網域本地組成員資格的數目視為 d 值的一部分,而不是 s 值。
如果您有MaxTokenSize
0x0000FFFF (64K)的值,您可以緩衝大約 1600 個 d 類別的 SID 或大約 8000 個 s 類別的 SID。 不過,一些其他因素會影響您可以安全地用於 MaxTokenSize
的值,包括下列各項:
如果您使用 信任的委派 帳戶,則每個 SID 需要兩倍的空間。
如果您有多個信任,請將信任設定為篩選 SID。 此設定可減少 Kerberos 票證大小的影響。
如果您使用 Windows Server 2012 或更新版本,下列因素也會影響 SID 空間需求:
- 有一個新的配置可壓縮 PAC 中的 SID。 如需詳細資訊,請參閱 KDC 資源 SID 壓縮。 這項功能可減少票證中 SID 所需的大小。
- 動態 存取控制 將 Active Directory 宣告新增至票證,以增加大小需求。 不過,使用 Windows Server 2012 檔伺服器部署宣告之後,您預期會逐步淘汰大量控制檔案存取的群組。 此縮減可進而減少票證所需的大小。 如需詳細資訊,請參閱動態 存取控制:案例概觀。
如果您已將 Kerberos 設定為使用不受限制的委派,則必須將公式中的值加倍
TokenSize
,才能取得的有效估計值MaxTokenSize
。重要
在 2019 年,Microsoft 隨附更新給 Windows,以變更 Kerberos 停用未限制委派的預設設定。 如需詳細資訊,請參閱 跨 Windows Server 中傳入信任的 TGT 委派更新。
由於資源 SID 壓縮已廣泛使用,且未受限制的委派已被取代,
MaxTokenSize
因此 48000 或更大的資源應該適用於所有案例。
影響 MaxTokenSize的已知問題
MaxTokenSize
值 48,000 個字節應該足以用於大部分的實作。 這是 Windows Server 2012 和更新版本中的預設值。 不過,如果您決定使用較大的值,請檢閱本節中的已知問題。
LSA 存取令牌的大小限制為1,010個群組 SID
此問題與擁有太多群組成員資格的使用者無法驗證類似,但控管問題的計算和條件不同。 例如,使用者在使用 Kerberos 驗證或 Windows NTLM 驗證時可能會遇到此問題。 如需詳細資訊,請參閱 登入屬於超過1,010個群組之成員的用戶帳戶,可能會在以Windows Server為基礎的電腦上失敗。
使用大於 48,000 的 MaxTokenSize 值時的已知問題
為了減輕阻斷服務攻擊媒介,Internet Information Server (IIS) 會使用有限的 HTTP 要求緩衝區大小 64 KB。 屬於 HTTP 要求的 Kerberos 票證會編碼為 Base64 (6 位擴充為 8 位)。 因此,Kerberos 票證使用其原始大小的 133%。 因此,當 IIS 中的緩衝區大小上限為 64 KB 時,Kerberos 票證可以使用 48,000 個字節。
如果您將
MaxTokenSize
登錄專案設定為大於 48000 個字節的值,而且緩衝區空間用於 SID,可能會發生 IIS 錯誤。 不過,如果您將MaxTokenSize
登錄項目設定為 48,000 個字節,而且您使用 SID 和宣告的空間,就會發生 Kerberos 錯誤。如需 IIS 緩衝區大小的詳細資訊,請參閱 如何限制 IIS 在 Windows 2000 中從用戶端接受的 HTTP 傳輸標頭大小。
使用大於 65,535 的 MaxTokenSize 值時的已知問題
本文的舊版討論的 值為最多 100,000 個字節
MaxTokenSize
。 不過,我們發現SMS系統管理員的版本在100,000個字節或更大時MaxTokenSize
發生問題。我們也識別出 IPSEC IKE 通訊協定不允許安全性 BLOB 變成大於 66,536 個字節,而且當 設定為較大的值時
MaxTokenSize
,它也會失敗。