NTLM 用戶驗證
本文提供NTLM用戶驗證的一些資訊。
原始 KB 編號: 102716
摘要
本文討論 Windows 中 NTLM 用戶驗證的下列層面:
- 帳戶資料庫中的密碼儲存體
- 使用 MSV1_0 驗證封裝進行使用者驗證
- 傳遞驗證
其他相關資訊
帳戶資料庫中的密碼儲存體
用戶記錄會儲存在安全性帳戶管理員 (SAM) 資料庫或 Active Directory 資料庫中。 每個用戶帳戶都與兩個密碼相關聯:LAN Manager 相容的密碼和 Windows 密碼。 每個密碼都會加密並儲存在 SAM 資料庫或 Active Directory 資料庫中。
LAN Manager 相容的密碼與 LAN 管理員所使用的密碼相容。 此密碼是以原始設備製造商 (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 Manager 密碼或 Windows 密碼。 不過,每次嘗試都維護這兩個版本的密碼。
例如,如果使用 PortUas 從 LAN Manager UAS 資料庫移植用戶帳戶,或從 LAN Manager 用戶端或 Windows for Workgroups 用戶端變更密碼,則只有 LAN Manager 版本的密碼才會存在。 如果在 Windows 用戶端上設定或變更密碼,且密碼沒有 LAN Manager 表示法,則只有 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 Manager 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 名稱解析來找出必要的伺服器,視所設定的網域類型和信任類型而定。