Secrets in Fabric-Notebooks: Azure Key Vault statt Hardcoded Passwords
Wie PySpark-Notebooks in Microsoft Fabric Secrets sicher zur Laufzeit laden, welche RBAC-Rollen fürs Pflegen und Auslesen nötig sind und wie man Leaks vermeidet.
1. Secrets zur Laufzeit laden (Code)
Die Vault-URL gehört in eine Parameter-Zelle (so läuft dasselbe Notebook in Dev, Test und Prod). Im eigentlichen Code werden nur die Namen der Secrets referenziert:
# Parameter-Zelle (in Pipeline überschreibbar)
KEY_VAULT_URL = "https://<dein-vault>.vault.azure.net/"
# Secrets laden
import notebookutils
api_user = notebookutils.credentials.getSecret(KEY_VAULT_URL, "api-user")
api_key = notebookutils.credentials.getSecret(KEY_VAULT_URL, "api-key")
# Sanity Check (ohne Werte zu leaken)
assert api_user and api_key, "Fehler: Mindestens ein Secret ist leer!"
print("Secrets erfolgreich geladen.")
Die Werte liegen so ausschließlich flüchtig im Speicher der Spark-Session.
2. Berechtigungen: Rollen zum Pflegen & Auslesen
Azure Key Vault trennt strikt zwischen der Verwaltung der Ressource (Control Plane) und dem Zugriff auf die Daten (Data Plane).
| Aufgabe | Zielgruppe | Benötigte RBAC-Rolle |
|---|---|---|
| Secrets pflegen (anlegen, aktualisieren, löschen) | Entwickler / Admins | Key Vault Secrets Officer |
| Secrets nur lesen | Notebooks / Pipelines / Apps | Key Vault Secrets User (Least Privilege) |
| Volle Verwaltung (Inhalte + Berechtigungen) | Vault-Administratoren | Key Vault Administrator |
Warum scheitert die Pipeline nachts?
Ein Klassiker: Tagsüber läuft das Notebook interaktiv fehlerfrei (über den eigenen Entwickler-Account mit Officer/User-Rechten). Nachts in der Fabric-Pipeline bricht es mit 403 Forbidden ab.
Lösung: Die in der Pipeline hinterlegte Identität (z. B. Workspace Identity oder Service Principal) benötigt ebenfalls die Rolle Key Vault Secrets User auf dem Key Vault.
3. Typische Leaks: Wo Secrets trotzdem durchsickern
Fabric schwärzt bekannte Secrets bei direkter Ausgabe (print(secret)) nach Best-Effort-Prinzip. Das ist keine Sicherheitsgrenze! Sobald der Wert transformiert wird (z. B. Base64-Auth-Header oder Substrings), greift der Schutz nicht mehr.
Die 4 häufigsten Leckstellen im Alltag:
- Request- & Dumps (z. B. SOAP/REST-Payloads):
Wer zur Fehlersuche ganze Payloads ausgibt, muss Auth-Header oder
<Password>-Tags vor dem Loggen maskieren. - Pipeline-Parameter &
exit(): Secrets niemals als Notebook-Parameter übergeben oder mitnotebookutils.notebook.exit(...)zurückliefern – sie erscheinen im Klartext im Ausführungsverlauf der Pipeline. Immer nur den Secret-Namen übergeben. - URL Query-Parameter:
API-Keys niemals an die URL hängen (
?apiKey=...). Bei Verbindungsfehlern landen sie unweigerlich im Stacktrace. Nutzen Sie stattdessen HTTP-Header. - Delta-Tabellen (Audit-Logs): Werden Requests für Analysen in eine Delta-Tabelle geschrieben, müssen Passwörter vorher herausgefiltert werden. Durch Delta Lake Time Travel sind versehentlich geschriebene Klartext-Secrets nur schwer wieder zu löschen.
Quellen
Recherchiert mit KI-Unterstützung, geprüft und verantwortet von Sergej Steinhauer.