
Durchsucht exportierte Azure-Domain-Dumps nach Klartext-Passwörtern, Verbindungszeichenfolgen, Speicherschlüsseln und anderen Geheimnissen; erstellt geschwärzte CSV/HTML-Berichte für schreibgeschützte Audit-Workflows.
Ein PowerShell-Scanner, der MicroBurst-Ausgaben von Get-AzDomainInfo nach Klartext-Passwörtern, Schlüsseln, Verbindungszeichenfolgen und anderen Geheimnissen durchsucht, die niemals unverschlüsselt in einer Azure-Umgebung liegen sollten.
Entwickelt für Read-only-Audit-Workflows: Sie sammeln einen Domänen-Dump mit MicroBurst (Reader-Zugriff reicht für Get-AzDomainInfo), dann zeigen Sie mit diesem Tool auf den Ausgabeordner. Es greift nicht selbst auf Azure zu – es liest nur die Dateien, die Sie bereits exportiert haben. Geheimniswerte werden in jedem Bericht geschwärzt, sodass die Ausgabe bedenkenlos an Findings angehängt werden kann.
# Diesen Ordner klonen / kopieren, dann aus einer PowerShell-Eingabeaufforderung:
.\Scan-MicroBurst.ps1 -Path .\MicroBurst-2026 -Verbose
Oder das Modul importieren und das Cmdlet direkt verwenden:
Import-Module .\MicroBurstSecretsHunter.psd1 -Force
Invoke-MBSecretScan -Path .\MicroBurst-2026
Berichte werden in einen Zeitstempel-Ordner (MBSecretScan-<timestamp>) im aktuellen Verzeichnis geschrieben, sofern Sie nicht -OutputDirectory angeben.
Standardmäßig wird jeder Wert geschwärzt, damit die Berichte sicher geteilt werden können. Die sichtbaren Zeichen sind auf ein Viertel der Wertlänge begrenzt (max. 4 führende + 2 nachgestellte Zeichen), und alles, was 8 Zeichen oder kürzer ist, wird durch eine Maske fester Breite ersetzt – ein typisches Passwort erscheint also als ********, während ein 88 Zeichen langer Storage-Schlüssel als AAAA**********AA erkennbar bleibt. Kontextzeichenfolgen werden geschwärzt, bevor sie gekürzt werden, und jedes auf einer Zeile gefundene Geheimnis wird aus dem Kontext jedes Findings dieser Zeile entfernt, sodass in einem Bericht kein Klartext überlebt. Beim Triage von False Positives ist es oft schneller, den vollständigen Wert zu sehen – übergeben Sie -ShowSecrets, um ungeschwärzte Werte überall auszugeben (Konsole, CSV, HTML). Konsole und HTML tragen dann ein deutliches Warnbanner, und die Berichte müssen wie echtes Anmeldeinformationsmaterial behandelt werden:
Invoke-MBSecretScan -Path .\dump -ShowSecrets # Rohwerte, für lokales Triage
Funktioniert unter Windows PowerShell 5.1 und PowerShell 7+ (Windows, Linux, macOS).
Jeder Lauf erzeugt drei Dinge:
| Ausgabe | Beschreibung |
|---|---|
| Konsolenübersicht | Farbcodierte Zählungen nach Schweregrad/Kategorie sowie die wichtigsten Critical/High-Findings. |
findings.csv | Eine Zeile pro Finding (Schweregrad, Regel, Datei, Zeile, geschwärzter Wert, Kontext) für das Triage in Excel. Felder mit gescanntem Inhalt sind gegen Tabellenkalkulations-Formelinjektion geschützt. |
report.html | Eigenständiger HTML-Bericht (keine externen Ressourcen) mit Schweregrad-Karten, Live-Textfilter und Schweregrad-Umschaltern – mit dem Kunden teilbar. |
Das Cmdlet gibt außerdem Finding-Objekte an die Pipeline aus, sodass Sie nachverarbeiten können:
$f = Invoke-MBSecretScan -Path .\dump -Quiet
$f | Where-Object Severity -eq 'Critical' | Format-Table File,Line,RuleName
| Regel | Schweregrad | Beispielquelle in einem Dump |
|---|---|---|
| SQL-/DB-Verbindungszeichenfolge mit eingebettetem Passwort | Critical | App Service-Einstellungen, web.config-Exporte |
| Azure Storage-Kontoverbindungszeichenfolge / 88-Zeichen-Schlüssel | Critical | App-Einstellungen, Storage-Exporte |
Service Bus / Event Hub SharedAccessKey | Critical | Messaging-Ressourcenkonfigurationen |
| Cosmos DB-Kontoschlüssel | Critical | App-Einstellungen |
| PEM-Private-Key-Block | Critical | Key Vault / Zertifikatsexporte |
| Azure Redis Cache-Passwort | High | Cache-Verbindungszeichenfolgen |
Azure AD-Clientgeheimnis (Post-2021-…Q~…-Format) | High | ARM-Vorlagen, App-Einstellungen |
SAS-Token / sig=-Parameter | High | Storage-SAS-URLs |
| JWT-/Bearer-Token | High | Zwischengespeicherte Token, Konfigurationen |
Zertifikats-/Schlüsseldatei vorhanden (.pfx, .pem, .key, …) | High | Überall im Dump |
Generische password- / pwd-Zuweisung | High | Automation-Variablen, App-Einstellungen, ARM-Parameter |
Generische secret- / client_secret-Zuweisung | High | App-Einstellungen, Vorlagen |
| AWS-Zugriffsschlüssel / GitHub- / Slack-Token | High/Mittel | Fremde Anmeldeinformationen in Azure-Apps |
Generisches api_key / access_key / connectionstring | Mittel | App-Einstellungen |
| Zeichenfolge mit hoher Entropie (heuristisch) | Niedrig | Auffangnetz für unbekannte Schlüsselformate – Opt-in über -IncludeEntropy |
Der vollständige, bearbeitbare Regelsatz befindet sich in Private/Get-MBSignature.ps1. Jede Regel ist ein [PSCustomObject] mit diesen Feldern:
| Feld | Erforderlich | Zweck |
|---|---|---|
Id, Name, Category, Severity | ja | Identität sowie Art und Weise, wie das Finding gemeldet und sortiert wird. |
Pattern | ja | Der reguläre Ausdruck. Wird pro Scan einmal kompiliert. |
ValueGroup | ja | Welche Erfassungsgruppe das Geheimnis enthält (0 = gesamter Treffer). Steuert die Schwärzung. |
MultiLine | nein | Statt zeilenweise gegen den gesamten Dateitext auswerten (PEM-Blöcke). Jeder Treffer wird gemeldet, nicht nur der erste. |
CaseSensitive | nein | Verzicht auf die Standardkompilierung mit IgnoreCase. Für Formate festlegen, die case-sensitiv definiert sind (AKIA, ghp_, eyJ, Q~) – ohne dies werden beliebig großgeschriebene Ähnlichkeiten als Treffer gewertet. |
Redact | nein | Setzen Sie $false, wenn der erfasste Wert eher ein Label als ein Geheimnis ist (eine PEM-Headerzeile, ein Zertifikatsdateiname), damit er wörtlich erscheint, statt unlesbar maskiert zu werden. Standard ist Schwärzung. |
Get-AzDomainInfo exportiert Automation-Kontovariablen und App-Einstellungen als Name,Value[,Encrypted]-Zeilen. Das Geheimnis befindet sich in der Spalte Value, während das Schlüsselwort, das es identifiziert (z. B. ServiceAccountPwd, dbConnectionString), in der Spalte Name steht – ein einfacher regulärer Ausdruck sieht sie also nie in derselben "Zeile", und das Schlüsselwort ist ohne Wortgrenze in einem zusammengesetzten Token vergraben.
Für .csv-/.tsv-Dateien führt der Scanner zusätzlich eine strukturierte Spaltenpaarung durch (Private/Get-MBCsvFinding.ps1):
Encrypted=True werden übersprungen (der Wert ist kein Klartext).Password- oder StorageKey-Spalte), wird jede Zelle gemeldet, die kein Platzhalter ist.Werte, die bereits von einer Regel mit hoher Konfidenz abgedeckt werden (Verbindungszeichenfolgen, Storage-Schlüssel, SAS), werden an den Rohzeilen-Durchlauf zur engeren Schwärzung übergeben, und Findings werden nach Kategorie dedupliziert, sodass dasselbe Geheimnis nie doppelt gemeldet wird. Wenn eine Datei nicht als CSV geparst werden kann, greift der Scanner automatisch auf den normalen Rohzeilen-Scan zurück.
-ScanValues)Die obige Paarung knüpft an den Namen einer Einstellung an. Um auch Geheimnisse zu erfassen, die unter einem bedeutungslosen Namen gespeichert sind (z. B. Config1 = P@ssw0rd2026!), übergeben Sie -ScanValues. Dabei wird der Inhalt von Wert-Zellen mit zwei konservativen Heuristiken mit niedrigem Schweregrad untersucht:
!@#$%^&* …) sowie Buchstaben und eine weitere Zeichenklasse. Bezeichnerartige Werte wie Standard_D2s_v3 (deren einzige Symbole _ - . sind) werden ignoriert.-MinEntropy. Pfade / URLs / Ressourcen-IDs (alles, was / oder \ enthält) werden übersprungen, um das Markieren von Ressourcen-IDs zu vermeiden.In Name/Value-Tabellen wird die Value-Spalte gescannt; in Freiform-Tabellen wird jede Zelle gescannt. Das bedeutet höhere Trefferquote, aber auch mehr False Positives – daher ist es standardmäßig deaktiviert. Aktivieren Sie es für einen tieferen Sweep und führen Sie dann das Triage der Low-Findings durch.
Azure-Dumps sind voller langer, zufällig aussehender Zeichenfolgen, die keine Geheimnisse sind. Der Scanner filtert diese heraus:
GUIDs (Abonnement-/Mandanten-/Ressourcen-/Objekt-IDs) werden nie markiert.
Platzhalter & Nicht-Geheimnis-Wertformen – ********, null, <provide-at-deploy>, true/false, wiederholte Zeichen, Vorlagen-Tokens (${var}, %VAR%), JSON-Objekte/-Arrays ({...}, [...], einschließlich mehrzeiliger), Datums-/Zeitstempel und serialisierte .NET-Typ-/Sammlungsnamen (z. B. eine VM-Skalierungsgruppen-Secrets-Spalte, die als System.Collections.Generic.List1[...VaultSecretGroup]dargestellt wird) – werden übersprungen. Beachten Sie, dass dies formbasiert ist: EineSecrets`-Spalte mit einem tatsächlichen Klartextwert wird weiterhin markiert.
Harmlose Passwort-Metadatenfelder – Verzeichnisspalten, deren Name ein Schlüsselwort enthält, aber nur den Passwort-Status bzw. die Richtlinie beschreiben, niemals das Geheimnis selbst (PasswordProfile, PasswordPolicies, ForceChangePasswordNextSignIn, LastPasswordChangeDateTime, PasswordExpirationDateTime, …). Diese sind in RBAC-Exporten wie InheritedOwners.csv / InheritedContributors.csv häufig und werden nicht markiert, während eine Spalte, die tatsächlich Password heißt, weiterhin markiert wird. Key Vault-Zugriffsrichtlinien-Berechtigungsspalten (PermissionsToSecretsStr, PermissionsToKeysStr, …), die Berechtigungsverben wie Get, List, Set, Delete enthalten, werden ebenfalls ignoriert.
Code- & Vorlagenausdrücke – wenn password/secret/usw. ein Variablen- oder Eigenschaftsname ist, der auf einen Ausdruck statt auf ein Literal verweist, wird der erfasste Wert übersprungen: PowerShell-Cmdlet-Aufrufe (Get-RandomPassword 8, Get-AzKeyVaultSecret ...), Variablenreferenzen einschließlich skopierter ($result, $kv.Secrets, $global:clientSecret, $env:KEY), Unterausdrücke ((-join $x)) und ARM-/Logic-App-Referenzen (@{body(...)}, @body(...), [parameters('...')]). Häufig in Automation-Runbooks und Logic-App-Definitionen.
Die mehrdeutigen Formen hier – $var, , – werden nur in Dateien verworfen, die tatsächlich Code enthalten (, , , , …). Ein Passwort ist sehr oft eine gültige Variablenreferenz (, ), daher hat die Anwendung dieses Filters auf CSV-Wert-Zellen echte Geheimnisse verworfen. Eindeutige Vorlagenmarkierungen (, , ) werden überall herausgefiltert.
Spaltenkopf-Nähe – die generischen keyword = value-Regeln behandeln nur : und = als Trennzeichen (nicht ,), sodass ein CSV-Header wie ...,AdminPassword,Secrets,... den nächsten Spaltennamen nicht mehr als Passwort erfasst. Kommagetrennte Name,Value-Paare werden weiterhin von der strukturierten CSV-Paarung abgedeckt.
Ressourcen-ID-Pfade werden in kurze Segmente aufgeteilt, statt als ein Token mit hoher Entropie behandelt zu werden.
Case-sensitive Anmeldeinformationsformate (AWS AKIA…, GitHub ghp_…, JWT eyJ…, Azure AD …Q~…) werden case-sensitiv abgeglichen, sodass beliebig großgeschriebene Ähnlichkeiten wie akiaijklmnopqrstuvwx nicht gemeldet werden. Schlüsselwortregeln (password=, AccountKey=) bleiben case-insensitiv.
Die Entropie-Heuristik ist standardmäßig deaktiviert – sie erzeugt verrauschte Low-Severity-Findings, daher opt-in mit -IncludeEntropy für einen tieferen Sweep. Selbst dann feuert sie nur auf Tokens, die wie Schlüsselmaterial aussehen (gemischte Buchstaben+Ziffern oder Base64-Marker), sodass camelCase-Bezeichner wie networkSecurityGroups ignoriert werden. Erhöhen Sie die Messlatte weiter mit -MinEntropy 4.5.
| Parameter | Standard | Zweck |
|---|---|---|
-Path | (erforderlich) | Stammordner der MicroBurst-Ausgabe. |
-OutputDirectory | Zeitstempel-Ordner | Wo Berichte geschrieben werden (wird nie gescannt). Kann nicht selbst der Scan-Root sein; ein darin verschachtelter Ordner erzeugt eine Warnung. |
-IncludeEntropy | aus | Opt-in zum Hoch-Entropie-Heuristik-Durchlauf (fügt Low-Severity-Findings hinzu). |
-MinEntropy | 4.0 | Shannon-Entropieschwelle (Bits/Zeichen) für die Heuristik. |
-ScanValues | aus | Untersucht zusätzlich den Inhalt von CSV-Wert-Zellen auf Geheimnisse unter harmlosen Namen (Low-Severity, höhere Trefferquote). |
-ShowSecrets | aus | Gibt ungeschwärzte Werte in der gesamten Ausgabe aus, um das False-Positive-Triage zu beschleunigen. Berichte werden zu echtem Anmeldeinformationsmaterial. |
-MaxFileSizeMB | 50 | Überspringt Dateien, die größer sind. Übersprungene Dateien werden gewarnt und in der Übersicht sowie im HTML-Bericht gezählt. |
-IncludeExtension | häufige Texttypen | Überschreibt, welche Dateitypen gescannt werden (ein führender Punkt ist optional). |
-NoCsv / -NoHtml | aus | Überspringt ein Berichtsformat. |
-Quiet | aus | Unterdrückt die Konsolenübersicht (Objekte werden weiterhin zurückgegeben). |
MicroBurstSecretsHunter.psd1 Modulmanifest
MicroBurstSecretsHunter.psm1 Modullader
Scan-MicroBurst.ps1 Komfort-Wrapper-Skript
Public/
Invoke-MBSecretScan.ps1 Haupt-Cmdlet (Dateidurchlauf, Abgleich, Berichterstattung)
Private/
Get-MBSignature.ps1 Erkennungsregelsatz (zum Erweitern bearbeiten)
Get-MBCsvFinding.ps1 Strukturierte CSV-Name/Wert-Spaltenpaarung
MBHelpers.ps1 Entropie, Schwärzung, Kontextdarstellung,
CSV-Feld-Escaping, Zeilenfensterung,
Platzhalter-/GUID-Filter
Write-MBConsoleSummary.ps1 Konsolenausgabe
New-MBHtmlReport.ps1 HTML-Berichtsgenerator
tests/
sample-dump/ Beispiel-Fixture im Get-AzDomainInfo-Stil
Zum Testen mit der mitgelieferten Beispieldatei:
.\Scan-MicroBurst.ps1 -Path .\tests\sample-dump
Alles, was der Scanner nicht lesen konnte, ist ein blinder Fleck – und ein stiller blinder Fleck liest sich wie "hier wurde nichts gefunden". Der Scanner ist daher explizit diesbezüglich:
-MaxFileSizeMB erzeugen eine Write-Warning mit ihrem Namen, eine NOT scanned-Zeile in der Konsolenübersicht und ein Banner im HTML-Bericht.-Verbose aus, um die einzelnen Pfade zu sehen.AdminPassword gerne hinter jedem festen Cut-off. Daher werden Zeilen in überlappenden 8000-Zeichen-Fenstern gescannt. Doppelte Treffer aus der Überlappung werden in der Deduplizierung zusammengeführt.-ShowSecrets enthalten sie die vollständigen Klartext-Anmeldeinformationen – sicher aufbewahren und nach dem Triage löschen.(expr)Verb-Noun.ps1.json.tf.yaml$ummer2026$ecretPass1@{@body([parameters(