如何阻止 Active Directory 中的常見(弱)密碼
默認 Active Directory 密碼策略中只能為域用戶啟用最基本的密碼長度、頻率和復雜性要求。啟用強制密碼複雜性選項(要求密碼包含大寫字母、小寫字母、數字和特殊字符的組合)並不能阻止用戶使用容易猜到的密碼,例如Qwerty123456,P@ssw0rd,March2025等。這些密碼滿足複雜性標準,但由於其可預測性,仍然容易受到攻擊。
本指南介紹如何在本地 Active Directory 域中創建和實施禁止密碼列表,防止用戶設置弱密碼或洩露密碼,並保護帳戶免受字典和暴力攻擊。
內容:
帶有 AD 密碼過濾器的禁止密碼列表 (PassFiltEx)
首先我們來看看密碼過濾器,一個輕量級開源庫,提供了阻止 Active Directory 中常見弱密碼的簡單解決方案
當AD用戶修改密碼時,域控制器上的LSA進程會檢查該密碼是否與註冊的密碼相符。密碼過濾器。在檢查新密碼時,PassFiltEx 庫可以透明地用作附加過濾器。
要實現 PassFiltEx,請從項目的 GitHub 頁面下載兩個文件 (https://github.com/ryanries/PassFiltEx)並將它們複製到%SystemRoot%System32域控制器上的目錄。
- PassFiltEx.dll – PassFiltEx 庫文件
- PassFiltExBlacklist.txt – 一個純文本文件,其中包含您要在 AD 中拒絕的密碼
一些要點:
- PassFiltEx 每 60 秒重新加載阻止列表文件
- PassFiltExBlacklist.txt 文件中拒絕的密碼模式不區分大小寫。 (
MyPasswordD和mypassword值將被定義為相等) - 目前不支持 Unicode 字符

然後,打開註冊表編輯器,轉到HKLMSYSTEMCurrentControlSetControlLsa鍵,然後添加密碼過濾器值到末尾通知包多字符串參數。


重新啟動域控制器以應用新的密碼過濾器。驗證 lsass 進程是否加載 PassFiltEx 庫。
tasklist /m PassFiltEx.dll


現在,如果用戶嘗試將密碼更改為與密碼黑名單中的模式之一匹配的任何密碼,則會出現一條錯誤,指出該密碼不符合密碼策略要求。


如果部署了多個域控制器,請在每個域控制器上配置相同的密碼篩選器。
使用註冊表中的選項HKLMSOFTWAREPassFiltExreg 密鑰(自動創建),您可以配置其他 PassFiltEx 密碼過濾器設置:
- 黑名單文件名(REG_SZ) – 包含禁止密碼的文件的路徑。 (默認為
%SystemRoot%System32PassFiltExBlacklist.txt)。這裡可以使用UNC路徑,它允許文件存儲在SYSVOL中(使用在DC之間自動複製的單個密碼黑名單文件) - 密碼的令牌百分比(REG_DWORD) – 是與黑名單模板匹配的新密碼將導緻密碼被拒絕的最小百分比(默認為 60%)。例如,如果將具有 MyPasswd 模式的行添加到黑名單中,用戶將無法使用密碼 MyPasswd2025。
- 偵錯– 如果設置為1,它啟用調試模式(所有操作都記錄到文本文件中)。
- 塊順序字符– 阻止在密碼中使用字符序列,例如 abcd 或 1234。
- 塊重複字符— 相同字符的塊序列,如 AAAA、2222。
有關其他註冊表選項的信息可以在該項目的 GitHub 頁面上找到。
使用 Lithnet 密碼保護阻止弱密碼和洩露密碼
針對 Active Directory (LPP) 的 Lithnet 密碼保護是一種企業解決方案,用於阻止 Active Directory 中的弱密碼和洩露密碼。其基本功能允許擴展 AD 密碼策略要求,使用模板或密碼哈希阻止密碼(允許從外部字典導入受損密碼的數據庫)。 Lithnet 密碼保護支持通過組策略和 PowerShell 進行管理。
應在每個域控制器上安裝 Lithnet Password Protection for Active Directory 代理(https://github.com/lithnet/ad-password-protection)。


然後,使用 PowerShell 將禁止的密碼和關鍵字添加到 Lithnet 密碼庫中。將模塊導入到您的 PowerShell 會話中:
Import-Module LithnetPasswordProtection
添加您想要阻止在 AD 用戶密碼中使用的單詞。
Add-BannedWord -Value "admin"
您可以從文本文件導入禁止關鍵字列表:
Import-BannedWords -Filename "c:tempblacklistpwd.txt"
檢查 LPP 數據庫中是否有禁用詞:
Test-IsBannedWord -value admin


使用 Get-PasswordFilterResult cmdlet 測試您鍵入的密碼是否符合密碼策略:
Get-PasswordFilterResult -Password "Admin321" -Username jsmith -Fullname "John Smith"
Compromised


Get-PasswordFilterResult -Password "Adm123n!" -Username jsmith -Fullname "John Smith"
Approved


第一種情況,密碼包含與關鍵字Admin完全匹配,並且密碼策略禁止其使用。
LPP的密碼庫是一個基於文件的密碼哈希數據庫(由於二進制格式,搜索這樣的數據庫很快)。默認情況下,DB文件存儲在C:Program FilesLithnetActive Directory Password ProtectionStorev3p目錄。DFS-R用於在域控制器之間複製禁止密碼的 Lithnet 密碼保護數據庫。
Lithnet 密碼保護 (LPP) 允許管理員從“Have I Been Pwned”導入洩露的密碼(HIBP pwned)服務存儲到本地數據庫中,通過防止用戶選擇在數據洩露中暴露的密碼來提高安全性。這將需要大約8GBDC 上用於存儲哈希字典的磁盤空間。
Sync-HashesFromHibp


要自動將本地數據庫與 HIBP 同步,請使用任務計劃程序定期運行 Sync-HashesFromHibp PowerShell 命令。
或者從文本文件導入哈希值:
Import-CompromisedPasswordHashes -Filename "c:pspwned-ntlm-hashs.txt"
檢查特定密碼或用戶的 UPN 是否位於洩露密碼的數據庫中。
Test-IsCompromisedPassword -value MyAdminl0veSme
Test-IsADUserPasswordCompromised -upn [email protected]
管理模板文件 (ADMX) 可用於通過 GPO 管理 LPP 設置。默認情況下,ADMX 模板可以在%WINDIR%PolicyDefinitions具有 LPP 代理的 DC 上的目錄(您可以將它們複製到中央 GPO 存儲):
- lithnet.activedirectory.passwordfilter.admx
- lithnet.admx
- en-uslithnet.activedirectory.passwordfilter.adml
- enuslithnet.adml
要讓 LPP 代理在用戶更改密碼時根據黑名單密碼字典檢查用戶的密碼,請在計算機配置 -> 管理模板 -> Lithnet -> Active Directory 密碼保護 -> 默認策略部分下使用以下最低設置為域控制器創建 GPO。
- 拒絕在洩露的密碼存儲中找到的密碼–
Enable,取消勾選選項啟用密碼設置和啟用密碼更改操作。 - 拒絕在受損密碼存儲中找到的標準化密碼(拒絕規範化密碼,例如 WOSHub 和 woshub)


可以根據您的安全需求啟用/禁用其他 GPO 選項。
重新啟動域控制器以更新 GPO 設置。這還將添加thnetpwdf將密碼過濾到上面指定的註冊表項。


現在,當嘗試更改(重置)AD 用戶的密碼時,會執行額外的檢查以查看該密碼是否在禁止密碼的字典中。例如,Windows 11 顯示以下錯誤:
The password on this account cannot be changed at this time
顯然,這很不方便,因為用戶不清楚他們的密碼是否未能通過密碼策略檢查。


如果您有一個Entra ID P1 或 P2 訂閱並與本地 Active Directory 同步,您可以在 Microsoft 雲中創建禁止密碼列表。 Microsoft Entra 密碼保護代理服務和 Microsoft Entra 密碼保護 DC 代理可以將這些安全設置應用到本地 AD 帳戶。請參閱 Entra ID(前 Azure AD)中的密碼策略。
我們探討瞭如何通過實施開源解決方案來提高 Active Directory 安全性,這些解決方案可防止使用默認 AD 密碼策略通常不會阻止的弱密碼、洩露密碼或常見密碼。
