
Analyse les dumps de domaines Azure exportés à la recherche de mots de passe en clair, de chaînes de connexion, de clés de stockage et d'autres secrets ; génère des rapports CSV/HTML expurgés pour les flux de travail d'audit en lecture seule.
Un scanner PowerShell qui fouille la sortie de MicroBurst
Get-AzDomainInfo à la recherche de mots de passe en clair, de clés, de chaînes de connexion et
d'autres secrets qui ne devraient jamais rester non chiffrés dans un environnement Azure.
Conçu pour des workflows d'audit en lecture seule : vous collectez un dump de domaine avec MicroBurst
(l'accès Lecteur suffit pour Get-AzDomainInfo), puis vous pointez cet outil vers le
dossier de sortie. Il ne touche pas Azure lui-même — il lit uniquement les fichiers que vous
avez déjà exportés. Les valeurs secrètes sont masquées dans chaque rapport, de sorte que la sortie
peut être jointe en toute sécurité aux constatations.
# Clone / copy this folder, then from a PowerShell prompt:
.\Scan-MicroBurst.ps1 -Path .\MicroBurst-2026 -Verbose
Ou importez le module et utilisez le cmdlet directement :
Import-Module .\MicroBurstSecretsHunter.psd1 -Force
Invoke-MBSecretScan -Path .\MicroBurst-2026
Les rapports sont écrits dans un dossier horodaté (MBSecretScan-<timestamp>) dans le
répertoire courant, sauf si vous passez -OutputDirectory.
Par défaut, chaque valeur est masquée afin que les rapports puissent être partagés en toute sécurité. La
quantité de caractères révélés est limitée à un quart de la longueur de la valeur (plafonné à 4
en tête + 2 en fin), et tout élément de 8 caractères ou moins est remplacé par un
masque de largeur fixe — ainsi un mot de passe typique s'affiche comme ********, tandis qu'une clé de 88
caractères reste identifiable comme AAAA**********AA. Les chaînes de contexte sont
masquées avant d'être tronquées, et chaque secret trouvé sur une ligne est
masqué dans le contexte de chaque constatation de cette ligne, de sorte qu'aucun texte en clair ne survit
dans un rapport. Lors du tri des faux positifs, il est souvent plus rapide de voir la valeur complète —
passez -ShowSecrets pour émettre des valeurs non masquées partout (console, CSV,
HTML). La console et le HTML portent alors une bannière d'avertissement claire, et les rapports
doivent être traités comme des informations d'identification réelles :
Invoke-MBSecretScan -Path .\dump -ShowSecrets # raw values, for local triage
Fonctionne sur Windows PowerShell 5.1 et PowerShell 7+ (Windows, Linux, macOS).
Chaque exécution produit trois éléments :
| Sortie | Description |
|---|---|
| Résumé console | Décomptes colorés par sévérité/catégorie plus les principales constatations critiques/élevées. |
Le cmdlet émet également des objets de constatation dans le pipeline, afin que vous puissiez post-traiter :
$f = Invoke-MBSecretScan -Path .\dump -Quiet
$f | Where-Object Severity -eq 'Critical' | Format-Table File,Line,RuleName
L'ensemble de règles complet et modifiable se trouve dans Private/Get-MBSignature.ps1. Chaque règle est un [PSCustomObject] avec les champs suivants :
Get-AzDomainInfo exporte les variables de compte d'automatisation et les paramètres d'application sous
forme de lignes Name,Value[,Encrypted]. Le secret se trouve dans la colonne Value tandis que
le mot-clé qui l'identifie (par exemple ServiceAccountPwd, dbConnectionString)
se trouve dans la colonne Name — de sorte qu'une regex simple ne les voit jamais sur la même
« ligne » et que le mot-clé est enfoui dans un jeton composé sans limite de mot.
Pour les fichiers .csv / .tsv, le scanner effectue en plus un appariement structuré des colonnes (Private/Get-MBCsvFinding.ps1) :
Encrypted=True sont ignorées (la valeur n'est pas en clair).Password ou StorageKey), chaque cellule qui n'est pas un espace réservé est signalée.Les valeurs déjà couvertes par une règle à haute confiance (chaînes de connexion, clés de stockage, SAS) sont différées vers le passage en ligne brute pour un masquage plus strict, et les constatations sont dédupliquées par catégorie afin que le même secret ne soit jamais signalé deux fois. Si un fichier ne peut pas être analysé comme CSV, le scanner revient automatiquement à l'analyse normale en ligne brute.
-ScanValues)L'appariement ci-dessus repose sur le nom d'un paramètre. Pour également détecter les secrets stockés sous un nom sans signification (par exemple Config1 = P@ssw0rd2026!), passez -ScanValues. Il inspecte le contenu des cellules de valeur avec deux heuristiques prudentes de sévérité Faible :
!@#$%^&* …) plus des lettres et une autre classe. Les valeurs de type identifiant comme Standard_D2s_v3 (dont les seuls symboles sont _ - .) sont ignorées.-MinEntropy. Les chemins / URL / ID de ressource (tout ce qui contient / ou \) sont ignorés pour éviter de signaler des ID de ressource.Dans les tables Name/Value, il analyse la colonne Value ; dans les tables libres, il analyse chaque cellule. Cela échange un rappel plus élevé contre davantage de faux positifs, c'est donc désactivé par défaut — activez-le pour une analyse plus approfondie, puis triez les constatations de sévérité Faible.
Les dumps Azure sont pleins de longues chaînes à l'apparence aléatoire qui ne sont pas des secrets. Le scanner les filtre :
GUID (ID d'abonnement / de locataire / de ressource / d'objet) ne sont jamais signalés.
Espaces réservés et formes de valeurs non secrètes — ********, null, <provide-at-deploy>, true/false, caractères répétés, jetons de modèle (${var}, %VAR%), objets/tableaux JSON ({...}, [...], y compris multilignes), dates/horodatages, et noms de types/collections .NET sérialisés (par exemple une colonne Secrets de VM scale set rendue comme System.Collections.Generic.List1[...VaultSecretGroup]) — sont ignorés. Notez qu'il s'agit d'une logique basée sur la forme : une colonne Secrets` contenant une véritable valeur en clair est toujours signalée.
Champs de métadonnées de mot de passe bénins — les colonnes d'annuaire dont le nom contient un mot-clé mais ne décrivent que la du mot de passe, jamais le secret lui-même (, , , , , …). Ces champs sont courants dans les exports RBAC comme / et ne sont pas signalés, tandis qu'une colonne réellement nommée l'est toujours. Les colonnes de permissions de politique d'accès Key Vault (, , …) — qui contiennent des verbes de permission comme — sont également ignorées.
MicroBurstSecretsHunter.psd1 Module manifest
MicroBurstSecretsHunter.psm1 Module loader
Scan-MicroBurst.ps1 Convenience wrapper script
Public/
Invoke-MBSecretScan.ps1 Main cmdlet (file walk, matching, reporting)
Private/
Get-MBSignature.ps1 Detection rule set (edit to extend)
Get-MBCsvFinding.ps1 Structured CSV Name/Value column pairing
MBHelpers.ps1 Entropy, redaction, context rendering,
CSV field escaping, line windowing,
placeholder/GUID filters
Write-MBConsoleSummary.ps1 Console output
New-MBHtmlReport.ps1 HTML report generator
tests/
sample-dump/ Example Get-AzDomainInfo-style fixture
Pour l'essayer avec l'exemple fourni :
.\Scan-MicroBurst.ps1 -Path .\tests\sample-dump
Tout ce que le scanner n'a pas pu lire est un angle mort, et un angle mort silencieux se lit comme « rien trouvé ici ». Le scanner est donc explicite à ce sujet :
-MaxFileSizeMB produisent un Write-Warning les nommant, une ligne NOT scanned dans le résumé console, et une bannière dans le rapport HTML.-Verbose pour les chemins individuels.AdminPassword au-delà de toute coupure fixe ; les lignes sont donc analysées en fenêtres de 8000 caractères qui se chevauchent. Les correspondances en double dues au chevauchement sont éliminées lors de la déduplication.-ShowSecrets, ils contiennent les informations d'identification complètes en clair — stockez-les de manière sécurisée et supprimez-les après le tri.findings.csv |
| Une ligne par constatation (sévérité, règle, fichier, ligne, valeur masquée, contexte) pour le tri dans Excel. Les champs contenant du contenu analysé sont échappés contre l'injection de formules dans les feuilles de calcul. |
report.html | Rapport HTML autonome (aucune ressource externe) avec cartes de sévérité, filtre de texte en direct et bascules de sévérité — partageable avec le client. |
| Règle | Sévérité | Exemple de source dans un dump |
|---|
| Chaîne de connexion SQL/DB avec mot de passe intégré | Critique | Paramètres App Service, exports web.config |
| Chaîne de connexion de compte de stockage Azure / clé de 88 caractères | Critique | Paramètres d'application, exports Storage |
SharedAccessKey Service Bus / Event Hub | Critique | Configurations de ressources de messagerie |
| Clé de compte Cosmos DB | Critique | Paramètres d'application |
| Bloc de clé privée PEM | Critique | Exports Key Vault / certificats |
| Mot de passe Azure Redis Cache | Élevée | Chaînes de connexion du cache |
Secret client Azure AD (format …Q~… post-2021) | Élevée | Modèles ARM, paramètres d'application |
Jeton SAS / paramètre sig= | Élevée | URL SAS de stockage |
| Jeton JWT / bearer | Élevée | Jetons en cache, configurations |
Fichier de certificat / clé présent (.pfx, .pem, .key, …) | Élevée | N'importe où dans le dump |
Affectation générique password / pwd | Élevée | Variables d'automatisation, paramètres d'application, paramètres ARM |
Affectation générique secret / client_secret | Élevée | Paramètres d'application, modèles |
| Clé d'accès AWS / jetons GitHub / Slack | Élevée/Moyenne | Identifiants étrangers stockés dans des applications Azure |
api_key / access_key / connectionstring génériques | Moyenne | Paramètres d'application |
| Chaîne à haute entropie (heuristique) | Faible | Filet de sécurité pour les formats de clé inconnus — à activer explicitement via -IncludeEntropy |
| Champ | Requis | Objectif |
|---|
Id, Name, Category, Severity | oui | Identité et manière dont la constatation est signalée et triée. |
Pattern | oui | Le regex. Compilé une fois par analyse. |
ValueGroup | oui | Groupe de capture contenant le secret (0 = correspondance entière). Pilote le masquage. |
MultiLine | non | Évaluer sur le texte entier du fichier plutôt que ligne par ligne (blocs PEM). Chaque correspondance est signalée, pas seulement la première. |
CaseSensitive | non | Désactive la compilation IgnoreCase par défaut. À définir pour les formats définis en respectant la casse (AKIA, ghp_, eyJ, Q~) — sans cela, des imitations à casse arbitraire correspondent. |
Redact | non | Définissez $false lorsque la valeur capturée est une étiquette plutôt qu'un secret (une ligne d'en-tête PEM, un nom de fichier de certificat) afin qu'elle apparaisse textuellement au lieu d'être masquée jusqu'à l'illisibilité. Par défaut, masque. |
PasswordProfilePasswordPoliciesForceChangePasswordNextSignInLastPasswordChangeDateTimePasswordExpirationDateTimeInheritedOwners.csvInheritedContributors.csvPasswordPermissionsToSecretsStrPermissionsToKeysStrGet, List, Set, DeleteExpressions de code et de modèle — lorsque password/secret/etc. est un nom de variable ou de propriété pointant vers une expression plutôt qu'un littéral, la valeur capturée est ignorée : appels de cmdlet PowerShell (Get-RandomPassword 8, Get-AzKeyVaultSecret ...), références de variables, y compris celles à portée ($result, $kv.Secrets, $global:clientSecret, $env:KEY), sous-expressions ((-join $x)), et références ARM / Logic App (@{body(...)}, @body(...), [parameters('...')]). Courant dans les runbooks d'automatisation et les définitions Logic App.
Les formes ambiguës ici — $var, (expr), Verb-Noun — ne sont écartées que dans les fichiers qui contiennent réellement du code (.ps1, .json, .tf, .yaml, …). Un mot de passe est très souvent une référence de variable valide ($ummer2026, $ecretPass1), donc appliquer ce filtre aux cellules de valeur CSV écartait de vrais secrets. Les marqueurs de modèle non ambigus (@{, @body(, [parameters() sont filtrés partout.
Contiguïté des en-têtes de colonnes — les règles génériques mot-clé = valeur ne traitent que : et = comme séparateurs (pas ,), donc un en-tête CSV comme ...,AdminPassword,Secrets,... ne capture plus le nom de la colonne suivante comme mot de passe. Les paires Name,Value séparées par des virgules sont toujours couvertes par l'appariement CSV structuré.
Les chemins d'ID de ressource sont divisés en segments courts au lieu d'être traités comme un seul jeton à haute entropie.
Les formats d'identifiants sensibles à la casse (AWS AKIA…, GitHub ghp_…, JWT eyJ…, Azure AD …Q~…) sont détectés en respectant la casse, de sorte que des imitations à casse arbitraire comme akiaijklmnopqrstuvwx ne sont pas signalées. Les règles de mots-clés (password=, AccountKey=) restent insensibles à la casse.
L'heuristique d'entropie est désactivée par défaut — elle produit des constatations de sévérité Faible bruyantes, vous devez donc l'activer explicitement avec -IncludeEntropy pour une analyse plus approfondie. Même alors, elle ne se déclenche que sur des jetons qui ressemblent à du matériel clé (mélange de lettres+chiffres ou marqueurs base64), donc les identifiants camelCase comme networkSecurityGroups sont ignorés. Montez encore la barre avec -MinEntropy 4.5.
| Paramètre | Par défaut | Objectif |
|---|
-Path | (requis) | Dossier racine de la sortie MicroBurst. |
-OutputDirectory | dossier horodaté | Où les rapports sont écrits (jamais analysé). Ne peut pas être la racine d'analyse elle-même ; un dossier imbriqué à l'intérieur déclenche un avertissement. |
-IncludeEntropy | désactivé | Activer explicitement le passage heuristique à haute entropie (ajoute des constatations de sévérité Faible). |
-MinEntropy | 4.0 | Seuil d'entropie de Shannon (bits/caractère) pour l'heuristique. |
-ScanValues | désactivé | Inspecte également le contenu des cellules de valeur CSV pour des secrets sous des noms inoffensifs (sévérité Faible, rappel plus élevé). |
-ShowSecrets | désactivé | Émet des valeurs non masquées dans toutes les sorties pour accélérer le tri des faux positifs. Les rapports deviennent des informations d'identification réelles. |
-MaxFileSizeMB | 50 | Ignore les fichiers plus volumineux que cela. Les fichiers ignorés font l'objet d'un avertissement et sont comptés dans le résumé et le rapport HTML. |
-IncludeExtension | types de texte courants | Remplace les types de fichiers analysés (un point initial est facultatif). |
-NoCsv / -NoHtml | désactivé | Ignore un format de rapport. |
-Quiet | désactivé | Supprime le résumé console (les objets sont toujours renvoyés). |