如何阻止 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 密码策略通常不会阻止的弱密码、泄露密码或常见密码。
