NTLM 使用者驗證

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

原始產品版本:   Windows Server 2012 R2
原始 KB 編號:   102716

摘要

本文將討論 Windows 中 NTLM 使用者驗證的下列各項:

  • 帳戶資料庫中的密碼儲存區
  • 使用 MSV1_0 驗證套件進行使用者驗證
  • 傳遞驗證

詳細資訊

帳戶資料庫中的密碼儲存區

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

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

Windows 密碼是以 Unicode 字元集為基礎。 此密碼區分大小寫,最多可長達128個字元。 此密碼的 OWF 版本又稱為 Windows OWF 密碼。 此密碼是使用 RSA MD-4 加密演算法來計算。 這個演算法會計算透明文字密碼位元組的可變長度字串的16位元組摘要。

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

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

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

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

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

注意

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 管理員 OWF 密碼加密16位元組的質詢,以計算24位元組的質詢回應。 然後,LAN Manager 用戶端會將此「LAN 管理員質詢回應」傳遞給伺服器。 如果用戶端為 Windows 用戶端,則會使用相同的演算法計算「Windows NT 質詢回應」。 不過,Windows 用戶端使用16位元組的 Windows OWF 資料,而不是 LAN 管理員的 OWF 資料。 然後,Windows 用戶端會同時將 LAN 管理員挑戰賽回應和 Windows NT 質詢回應傳遞給伺服器。 在任何情況下,伺服器會將下列所有專案傳送至 LsaLogonUser API,以驗證使用者:

  • 功能變數名稱
  • 使用者名稱
  • 原始挑戰
  • LAN 管理員質詢回應
  • 選用的 Windows NT 質詢回應

MSV 驗證套件的第一部分會將此資訊移至第二個部分。 首先,第二個部分會從 SAM 資料庫或從 Active Directory 資料庫查詢 OWF 密碼。 然後,第二個部分會使用資料庫中的 OWF 密碼和傳入的質詢,計算質詢回應。 然後,第二個部分會將計算的質詢回應與傳入的質詢回應進行比較。

注意

NTLMv2 也可讓用戶端同時傳送挑戰,以協助降低常見攻擊的風險。

如先前所述,SAM 資料庫或 Active Directory 資料庫中的密碼版本都可能遺失。 此外,在呼叫 LsaLogonUser 時,可能會遺失任何版本的密碼。 如果從 SAM 資料庫使用 Windows 版本的密碼,且有來自 LsaLogonUser 之密碼的 Windows 版本,就會使用這兩種密碼。 否則,會使用密碼的 LAN 管理員版本進行比較。 當 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 名稱解析來尋找必要的伺服器。