Стандартная политика паролей 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.
Забыли про LSA Security прописать. Lsass работаеи в защищённом режиме и не может подгрузить passfiltex dll если у нее нет цифровой подписи ms.
И если lsa security включился то его хрен отключить обратно т.к. он прошивается в uefi
Где забыли? Куда прописать? Что прописать?
Дельное замечание, дополню подробностями.
Из-за отсутствия в dll фильтров цифровой подписи от Microsoft, «LSA Protection» не позволит их подключить на этапе загрузки ОС. Следовательно, «LSA Protection» необходимо отключить, хотя это снизит защиту от инструментов типа mimikatz. Сделать это можно через реестр «HKLM\SYSTEM\CurrentControlSet\Control\Lsa\RunAsPPL:DWORD=0».
Но, если не ошибаюсь, LSA Protection до сих пор выключен по умолчанию.