Стандартная политика паролей Active Directory позволяет включить только самые простые требования к длине, повторяемости и сложности паролей пользователей в домене. Однако, даже если вы включите опцию обязательной сложности пароля (минимум 3 типа символов из четырех: символы в верхнем регистре, нижнем регистре, цифры, спец. символы), это не запретит использовать такие простых пароли, как
123Qwert
,
Pa$$w0rd
,
Password2025
. В этой статье мы рассмотрим, как с помощью open-source инструментов создать и применить списки запрещенных (ненадежных или скомпрометированных) паролей для пользователей on-premises домена Active Directory для защиты учетных записей от брутфорс атак перебором по словарю.
PassFiltEx: фильтр паролей Active Directory
Сначала рассмотрим небольшую библиотеку PassFiltEx, которую можно использовать в качестве простейшего решения для запрещения использования простых (стандартных) паролей в AD.
При смене пароля пользователя, процесс LSA на контроллере домена выполняет проверку соответствия паролю в зарегистрированных фильтрах паролей. Библиотеку PassFiltEx можно прозрачно встроить в качестве еще одного фильтра при проверке нового пароля.
Для внедрения PassFiltEx, скачайте два файла со страницы проекта на GitHub (https://github.com/ryanries/PassFiltEx) и скопируйте в каталог %SystemRoot%\System32 на контроллере домена
-
PassFiltEx.dll
– файл библиотеки PassFiltEx -
PassFiltExBlacklist.txt
– плоский текстовый файл, в который добавьте пароли, которые нужно запретить
- Файл паролей перечитывается каждые 60 секунд
- Шаблоны запрещенных паролей в файле PassFiltExBlacklist.txt регистронезависимые (значения
PassworD
иpassword
будут определяться как одинаковое значение) - Unicode символы на данный момент не поддерживаются
Затем откройте редактор реестра, перейдите в ветку
HKLM\SYSTEM\CurrentControlSet\Control\Lsa
и добавьте значение
PassFiltEx
в конец мультистрокового параметра Notification Packages.
Перезагрузите контроллер домена, чтобы при смене пароля использовался новый фильтр. Проверьте, что библиотека PassFiltEx загружена процессом lsass:
tasklist /m PassFiltEx.dll
Теперь, если пользователь попытается сменить пароль на любой, совпадающий с одним их шаблонов в чёрном списке паролей, появится ошибка о том, что пароль не соответствует требования безопасности.
Если у вас развернуто несколько контроллеров домена, нужно добавить фильтр паролей на каждом из них.
С помощью параметров реестра в разделе
HKLM\SOFTWARE\PassFiltEx
(создается автоматически) можно настроить некоторые параметры фильтра паролей PassFiltEx:
- BlacklistFileName (REG_SZ) – путь к файлу с черным списком паролей (по умолчанию используется
%SystemRoot%\System32\PassFiltExBlacklist.txt
). Можно указать UNC путь и хранить файл, например на SYSVOL (для использования единого файла с черным списком паролей, который реплицируется между DC) - TokenPercentageOfPassword (REG_DWORD) – какой минимальный процент вхождения нового пароля в шаблоны черного списка будет запрещать использовать пароль (по умолчанию 60%). Например, если в черном списке добавлена строка с шаблоном Password, это запретить пользователям использовать пароль Password25
- Debug – если задать 1, это включит режим отладки (все действия будут записываться в текстовый лог файл)
- BlockSequentialChars – заблокировать использовать последовательности символов в пароле , такие как
abcd
или1234
- BlockRepeatingChars — заблокировать последовательности одинаковых символов, например
aaaa
,2222
Информацию об остальных параметрах реестра можно найти на странице проекта.
Запрещаем скомпрометированные пароли с Lithnet Password Protection for Active Directory
Lithnet Password Protection for Active Directory (LPP)– это полноценное enterprise решение для блокировки простых и скомпрометированных паролей в Active Directory. В базовом функционале оно также позволяет расширить требования к паролям AD, блокировать пароли по определенным шаблонами, блокировать пароли по хэшу (позволяет импортировать базу скомпрометированных паролей из словарей). Lithnet Password Protection поддерживает управление через групповые политики и с помощью PowerShell.
На каждый контроллер домена устанавливается агент Lithnet Password Protection for Active Directory (https://github.com/lithnet/ad-password-protection).
Теперь с помощью PowerShell можно добавить в хранилище паролей запрещенные пароли и ключевые слова. Импортируйте модуль в PowerShell сессию:
Import-Module LithnetPasswordProtection
Добавить слово, которое запрещено использовать в паролях:
Add-BannedWord -Value "admin"
Можно импортировать запрещенные к использованию ключевые слова из текстового файла:
Import-BannedWords -Filename "c:\temp\blacklistpwd.txt"
Проверить наличие запрещенного слова в базе LPP:
Test-IsBannedWord -value admin
С помощью командлета Get-PasswordFilterResult можно протестировать, соответствует ли введенный пароль политике паролей:
Get-PasswordFilterResult -Password "Admin123!" -Username spetrov -Fullname "Sergey Petrov"
Compromised
Get-PasswordFilterResult -Password "Adm13in!" -Username spetrov -Fullname "Sergey Petrov"
Approved
В первом случае в пароле есть точное вхождение ключевого слова Admin, и его использование будет запрещено политикой паролей.
Хранилище запрещенных паролей LPP представляет собой файловую базу данных, в которой хранятся хэши паролей и настройки (благодаря бинарному формату поиск по такой базе выполняется быстро). По умолчанию DB файлы базы хранятся в каталоге
C:\Program Files\Lithnet\Active Directory Password Protection\Store\v3\p
. Для репликации базы запрещенных паролей Lithnet Password Protection между контроллерами домена используется DFS-R.
Для параноиков, LPP позволяет импортировать в локальную базу данные скомпрометированных паролей из бесплатного онлайн сервиса HIBP pwnded (
Have I Been Pwned?)
. Это потребует около 8 Гб места на DC для хранения словаря хэшей:
Sync-HashesFromHibp
Либо можно импортировать хэши из текстового файла:
Import-CompromisedPasswordHashes -Filename "c:\temp\pwned-ntlm-hashs.txt"
Проверить, есть ли пароль или UPN пользоваться в базе скомпрометированных паролей:
Test-IsCompromisedPassword -value Adminl0vesY0u
Test-IsADUserPasswordCompromised -upn [email protected]
Для управления настройками LPP через GPO доступны ADMX файлы административных шаблонов. По умолчанию они доступны в каталоге
%WINDIR%\PolicyDefinitions\
на DC с агентом LPP (можно скопировать их в центральное хранилище GPO):
- lithnet.activedirectory.passwordfilter.admx
- lithnet.admx
- \en-us\lithnet.activedirectory.passwordfilter.adml
- \en-us\lithnet.adml
Чтобы агент LPP при смене пароля на DC проверял пароли по базе словарю запрещенных паролей, нужно создать для контроллеров домена отдельную GPO, со следующими минимальными настройками в разделе Computer Configuration -> Administrative Templates -> Lithnet ->Password Protection for Active Directory ->Default Policy.
- Reject passwords found in the compromised password store –
Включить
, отметить флажки Enable for password set и Enable for password change operations. - Reject normalized password found in the compromised password store (запрет нормализованных паролей, например
WinItPro
иwinitpro
)
Остальные параметры GPO можно включить/отключить в зависимости от ваших требований безопасности.
Чтобы применить настройки GPO, придется перезагружать контроллер домена. Это также добавит фильтр паролей lithnetpwdf в указанную выше ветку реестра.
Теперь при попытке изменить (сбросить) пароль пользователя AD, будет выполняться дополнительная проверка на наличие пароля в словаре запрещенных. В Windows 11, например появится такая ошибка:
The password on this account cannot be changed at this time
Это конечно неудобно, т.к. не понятно, что его пароль не прошел проверку парольной политики. Придется провести дополнительную разъяснительную работу с пользователями…
Итак, мы рассмотрели, как с помощью open-source решений внедрить в Active Directory дополнительный функционал, позволяющий запретить использование простых, утекших или стандартных паролей (по вашему собственному словарю), которые не блокируются обычными политиками паролей AD.