NTLM 用戶驗證

本文提供有關 NTLM 用戶驗證的一些資訊。

適用:Windows Server 2012 R2
原始 KB 編號: 102716

摘要

本文討論 Windows 中 NTLM 用戶驗證的下列層面:

  • 帳戶資料庫中的密碼記憶體
  • 使用MSV1_0驗證套件進行用戶驗證
  • 傳遞驗證

其他相關資訊

帳戶資料庫中的密碼記憶體

使用者記錄會儲存在安全性帳戶管理員 (SAM) 資料庫或 Active Directory 資料庫中。 每個使用者帳戶皆會與兩組密碼相關聯,一組是相容於 LAN Manager,一組是 Windows 密碼。 每組密碼皆會經過加密,並儲存在 SAM 資料庫或 Active Directory 資料庫中。

與 LAN Manager 相容的密碼與 LAN Manager 所使用的密碼相容。 此密碼是以原始設備製造商 (OEM) 字元集為基礎。 此密碼不區分大小寫,且長度最多可達 14 個字元。 此密碼的 OWF 版本也稱為 LAN Manager OWF 或 ESTD 版本。 此密碼是使用 DES 加密來計算,以純文字密碼加密常數。 LAN Manager OWF 密碼長度為 16 個字節。 前 7 個字節的純文字密碼是用來計算 LAN Manager OWF 密碼的前 8 個字節。 第二個 7 位元組的純文字密碼會用來將 LAN Manager OWF 密碼的第二個 8 位元組電腦。

Windows 密碼是以 Unicode 字元集為基礎。 此密碼會區分大小寫,且長度最多可達 128 個字元。 此密碼的 OWF 版本也稱為 Windows OWF 密碼。 此密碼是使用 RSA MD4 哈希函式來計算。 此函式會計算可變長度純文字密碼位元組位元串的16位元組摘要。

任何用戶帳戶可能缺少 LAN 管理員密碼或 Windows 密碼。 不過,每次嘗試維護這兩個版本的密碼。

例如,如果用戶帳戶是使用 PortUas 從 LAN Manager UAS 資料庫移植,或是從 LAN Manager 用戶端或 Windows for Workgroups 用戶端變更密碼,則只有 LAN Manager 版本的密碼會存在。 如果在 Windows 用戶端上設定或變更密碼,而且密碼沒有 LAN 管理員表示法,則只有 Windows 版本的密碼會存在。 (密碼可能沒有 LAN 管理員表示法,因為密碼長度超過 14 個字元,或因為這些字元無法在 OEM 字元集中表示。)

Windows 中的使用者介面限制不允許 Windows 密碼超過 14 個字元。 本文稍後會討論這項限制的含意。

在 Windows 2000 Service Pack 2 和更新版本的 Windows 中,有一個設定可讓您防止 Windows 儲存密碼的 LAN Manager 哈希。 如需詳細資訊,請查看下列文章編號,以檢視 Microsoft 知識庫中的文章:

299656 如何防止 Windows 將密碼的 LAN 管理員哈希儲存在 Active Directory 和本機 SAM 資料庫中

注意事項

Microsoft 不支援手動或以程式設計方式改變 SAM 資料庫。

使用MSV1_0驗證套件進行用戶驗證

Windows 會使用 LsaLogonUser API 進行所有類型的用戶驗證。 LsaLogonUser API 會呼叫驗證套件來驗證使用者。 根據預設,LsaLogonUser 會呼叫MSV1_0 (MSV) 驗證套件。 此套件隨附於 Windows NT。 MSV 驗證套件會將用戶記錄儲存在 SAM 資料庫中。 此套件支援使用 Netlogon 服務,對其他網域中的用戶進行傳遞驗證。

就內部而言,MSV 驗證套件分成兩個部分。 MSV 驗證套件的第一個部分會在連線的電腦上執行。 第二個部分會在包含用戶帳戶的計算機上執行。 當這兩個元件在同一部計算機上執行時,MSV 驗證套件的第一個部分會呼叫第二個部分,而不涉及 Netlogon 服務。 MSV 驗證套件的第一個部分會辨識傳遞驗證是必要的,因為傳遞的功能變數名稱不是它自己的功能變數名稱。 需要傳遞驗證時,MSV 會將要求傳遞至 Netlogon 服務。 然後,Netlogon 服務會將要求路由傳送至目的地電腦上的 Netlogon 服務。 接著,Netlogon 服務會將要求傳遞給該電腦上 MSV 驗證套件的另一個部分。

LsaLogonUser 支援互動式登錄、服務登入和網路登入。 在 MSV 驗證套件中,所有形式的登入都會傳遞使用者帳戶的名稱、包含使用者帳戶的網域名稱,以及用戶密碼的某些功能。 當密碼傳遞給 LsaLogonUser 時,不同類型的登入代表密碼的方式不同。

針對互動式登錄、批次登入和服務登入,登入客戶端位於執行 MSV 驗證套件第一個部分的電腦上。 在此情況下,純文本密碼會傳遞至 LsaLogonUser 和 MSV 驗證套件的第一個部分。 針對服務登入和批次登入,服務控制管理員和工作排程器提供更安全的方式來儲存帳戶的認證。

MSV 驗證套件的第一個部分會將純文本密碼轉換為 LAN 管理員 OWF 密碼,以及轉換成 Windows NT OWF 密碼。 然後,封裝的第一個部分會將純文本密碼傳遞至 NetLogon 服務或套件的第二個部分。 第二個部分接著會查詢 SAM 資料庫中的 OWF 密碼,並確定它們完全相同。

針對網路登入,連線到計算機的用戶端先前會收到16位元組的挑戰或 「nonce」。。如果用戶端是 LAN Manager 用戶端,用戶端會使用 16 位元組 LAN Manager OWF 密碼加密 16 位元組挑戰,以計算 24 位元組的挑戰回應。 然後,LAN Manager 用戶端會將此「LAN 管理員挑戰回應」傳遞至伺服器。 如果用戶端是 Windows 用戶端,則會使用相同的演算法來計算「Windows NT 挑戰回應」。 不過,Windows 用戶端會使用 16 位元組的 Windows OWF 數據,而不是 LAN Manager OWF 數據。 Windows 用戶端接著會將 LAN Manager 挑戰回應和 Windows NT 挑戰回應傳遞至伺服器。 不論是哪一種情況,伺服器都會將下列所有項目傳遞給 LsaLogonUser API 來驗證使用者:

  • 功能變數名稱
  • 用戶名稱
  • 原始挑戰
  • LAN 管理員挑戰回應
  • 選擇性的 Windows NT 挑戰回應

MSV 驗證套件的第一個部分會將這項資訊未變更傳遞給第二個部分。 首先,第二個部分會從 SAM 資料庫或 Active Directory 資料庫查詢 OWF 密碼。 然後,第二個部分會使用來自資料庫的 OWF 密碼和傳入的挑戰來計算挑戰回應。 第二個部分接著會比較計算的挑戰回應與傳入的挑戰回應。

注意事項

NTLMv2 也可讓用戶端使用會話密鑰來傳送挑戰,以協助降低常見攻擊的風險。

如先前所述,SAM 資料庫或 Active Directory 資料庫可能會遺失任一版本的密碼。 此外,呼叫 LsaLogonUser 時可能會遺失任一版本的密碼。 如果可使用來自 SAM 資料庫的 Windows 版本密碼,以及來自 LsaLogonUser 的 Windows 版本密碼,則會使用兩者。 否則,會使用 LAN Manager 版本的密碼進行比較。 此規則有助於在從 Windows 到 Windows 進行網路登入時強制執行區分大小寫。 此規則也允許回溯相容性。

傳遞驗證

NetLogon 服務會實作傳遞驗證。 它會執行下列函式:

  • 選取要傳遞驗證要求的網域。
  • 選取網域內的伺服器。
  • 將驗證要求傳遞至選取的伺服器。

選取網域很簡單。 功能變數名稱會傳遞給 LsaLogonUser。 功能變數名稱的處理方式如下:

  • 如果功能變數名稱符合 SAM 資料庫的名稱,則會在該電腦上處理驗證。 在屬於網域成員的 Windows 工作站上,SAM 資料庫的名稱會被視為電腦的名稱。 在 Active Directory 域控制器上,帳戶資料庫的名稱是網域的名稱。 在不是網域成員的計算機上,所有登入都會在本機處理要求。
  • 如果這個網域信任指定的功能變數名稱,驗證要求會傳遞至受信任的網域。 在 Active Directory 域控制器上,可以輕鬆取得受信任網域的清單。 在 Windows 網域的成員上,要求一律會傳遞至工作站的主域,讓主域判斷指定的網域是否受信任。
  • 如果指定的功能變數名稱不受網域信任,則會在所連接的計算機上處理驗證要求,就像指定的功能變數名稱是該功能變數名稱一樣。 NetLogon 不會區分不存在的網域、不受信任的網域,以及類型不正確的功能變數名稱。

NetLogon 會依稱為探索的進程,選取網域中的伺服器。 Windows 工作站會探索其主域中其中一個 Windows Active Directory 域控制器的名稱。 Active Directory 域控制器會探索每個受信任網域中的 Active Directory 域控制器名稱。 進行探索的元件是在 Netlogon 服務中執行的 DC 定位器。 DC 定位器會使用 NETBIOS 或 DNS 名稱解析來尋找必要的伺服器,視所設定的網域和信任類型而定。