
Сканирует экспортированные дампы доменов Azure на предмет паролей в открытом виде, строк подключения, ключей хранилища и других секретов; генерирует отчёты CSV/HTML с маскированными секретами для рабочих процессов аудита с доступом только для чтения.
PowerShell-сканер, который прочёсывает выходные данные MicroBurst Get-AzDomainInfo в поисках паролей в открытом виде, ключей, строк подключения и других секретов, которые никогда не должны храниться в среде Azure без шифрования.
Создан для аудита в режиме «только чтение»: вы собираете дамп домена с помощью MicroBurst (для Get-AzDomainInfo достаточно доступа Reader), а затем указываете этому инструменту папку с результатами. Он не обращается к самому Azure — только читает уже экспортированные вами файлы. Значения секретов маскируются во всех отчётах, поэтому выходные данные безопасно прикладывать к находкам.
# Clone / copy this folder, then from a PowerShell prompt:
.\Scan-MicroBurst.ps1 -Path .\MicroBurst-2026 -Verbose
Или импортируйте модуль и используйте командлет напрямую:
Import-Module .\MicroBurstSecretsHunter.psd1 -Force
Invoke-MBSecretScan -Path .\MicroBurst-2026
Отчёты записываются в папку с меткой времени (MBSecretScan-<timestamp>) в текущем каталоге, если только вы не передадите -OutputDirectory.
По умолчанию все значения маскируются, поэтому отчётами можно безопасно делиться. Отображаемые символы ограничены четвертью длины значения (не более 4 в начале + 2 в конце), а любое значение длиной 8 символов или короче заменяется маской фиксированной ширины — так типичный пароль отображается как ********, а ключ хранилища на 88 символов остаётся узнаваемым как AAAA**********AA. Контекстные строки маскируются до усечения, а каждый секрет, найденный в строке, удаляется из контекста каждой находки в этой строке, так что в отчёте не сохраняется ни одного открытого значения. При разборе ложных срабатываний часто быстрее увидеть полное значение — передайте -ShowSecrets, чтобы выводить немаскированные значения во всех форматах (консоль, CSV, HTML). Консоль и HTML при этом получают явный предупреждающий баннер, а сами отчёты должны рассматриваться как действующий учётный материал:
Invoke-MBSecretScan -Path .\dump -ShowSecrets # raw values, for local triage
Работает на Windows PowerShell 5.1 и PowerShell 7+ (Windows, Linux, macOS).
Каждый запуск формирует три результата:
| Output | Description |
|---|---|
| Console summary | Сводка с цветовой кодировкой по уровням критичности/категориям плюс главные находки уровня Critical/High. |
findings.csv | По одной строке на находку (уровень критичности, правило, файл, строка, маскированное значение, контекст) для разбора в Excel. Поля, содержащие просканированное содержимое, экранируются от инъекций формул электронных таблиц. |
report.html | Автономный HTML-отчёт (без внешних ресурсов) с карточками критичности, живым фильтром текста и переключателями критичности — им можно поделиться с клиентом. |
Командлет также передаёт объекты находок в конвейер, чтобы вы могли обработать их дальше:
$f = Invoke-MBSecretScan -Path .\dump -Quiet
$f | Where-Object Severity -eq 'Critical' | Format-Table File,Line,RuleName
| Rule | Severity | Example source in a dump |
|---|---|---|
| Строка подключения SQL/БД со встроенным паролем | Critical | Параметры App Service, экспорт web.config |
| Строка подключения учётной записи Azure Storage / ключ на 88 символов | Critical | Параметры приложения, экспорт Storage |
SharedAccessKey Service Bus / Event Hub | Critical | Конфигурации ресурсов обмена сообщениями |
| Ключ учётной записи Cosmos DB | Critical | Параметры приложения |
| Блок закрытого ключа PEM | Critical | Экспорт Key Vault / сертификатов |
| Пароль Azure Redis Cache | High | Строки подключения кеша |
Секрет клиента Azure AD (формат …Q~… после 2021 г.) | High | Шаблоны ARM, параметры приложения |
SAS-токен / параметр sig= | High | SAS-URL-адреса Storage |
| JWT / bearer-токен | High | Кешированные токены, конфигурации |
Наличие файла сертификата / ключа (.pfx, .pem, .key, …) | High | В любом месте дампа |
Общее присваивание password / pwd | High | Переменные автоматизации, параметры приложения, параметры ARM |
Общее присваивание secret / client_secret | High | Параметры приложения, шаблоны |
| Ключ доступа AWS / токены GitHub / Slack | High/Med | Сторонние учётные данные, хранящиеся в приложениях Azure |
Общие api_key / access_key / connectionstring | Medium | Параметры приложения |
| Строка с высокой энтропией (эвристика) | Low | Подстраховка для неизвестных форматов ключей — включается параметром -IncludeEntropy |
Полный редактируемый набор правил находится в Private/Get-MBSignature.ps1. Каждое правило — это [PSCustomObject] со следующими полями:
| Field | Required | Purpose |
|---|---|---|
Id, Name, Category, Severity | да | Идентичность и то, как находка сообщается и сортируется. |
Pattern | да | Регулярное выражение. Компилируется один раз за сканирование. |
ValueGroup | да | Какая группа захвата содержит секрет (0 = всё совпадение). Управляет маскированием. |
MultiLine | нет | Проверка по тексту всего файла, а не построчно (блоки PEM). Сообщается каждое совпадение, а не только первое. |
CaseSensitive | нет | Отказ от компиляции с IgnoreCase по умолчанию. Указывайте для форматов, определённых с учётом регистра (AKIA, ghp_, eyJ, Q~) — без этого будут совпадать похожие строки с произвольным регистром. |
Redact | нет | Установите $false, когда захваченное значение — это метка, а не секрет (строка заголовка PEM, имя файла сертификата), чтобы оно отображалось как есть, а не маскировалось до нечитаемости. По умолчанию — маскирование. |
Get-AzDomainInfo экспортирует переменные учётных записей автоматизации и параметры приложений в виде строк Name,Value[,Encrypted]. Секрет находится в столбце Value, а ключевое слово, которое его идентифицирует (например, ServiceAccountPwd, dbConnectionString), — в столбце Name. Поэтому обычное регулярное выражение никогда не видит их в одной «строке», а ключевое слово спрятано внутри составного токена без границы слова.
Для файлов .csv / .tsv сканер дополнительно выполняет структурированное сопоставление столбцов (Private/Get-MBCsvFinding.ps1):
Encrypted=True пропускаются (значение не является открытым текстом).Password или StorageKey), сообщается каждая ячейка, не являющаяся заполнителем.Значения, которые уже покрываются правилом с высокой степенью уверенности (строки подключения, ключи хранилища, SAS), откладываются на проход по исходным строкам для более точного маскирования, а находки дедуплицируются по категориям, чтобы один и тот же секрет никогда не сообщался дважды. Если файл не удаётся разобрать как CSV, сканер автоматически переключается на обычное сканирование по строкам.
-ScanValues)Сопоставление выше опирается на имя параметра. Чтобы дополнительно ловить секреты, хранящиеся под бессмысленным именем (например, Config1 = P@ssw0rd2026!), передайте -ScanValues. Он проверяет содержимое ячеек значений с помощью двух консервативных эвристик уровня Low: