Zurück zum Blog

Klartext-Secrets in der eigenen Doku — beim Aufräumen entdeckt

Klartext-Secrets in der eigenen Doku — beim Aufräumen entdeckt

Datum 19. Juli 2026
Kategorie Security
Lesezeit 6 Minuten

Der Fund beim Umzug

Beim Aufräumen der Dokumentation — verstreute Dateien in eine saubere Struktur überführen — lief zur Sicherheit ein Muster-Scan über die verschobenen Dateien. Das Ergebnis war unangenehm: In alten Anleitungen standen echte Zugangsdaten im Klartext. Datenbank-Passwörter, OIDC-Client-Secrets, ein API-Schlüssel — allesamt beim Aufsetzen einmal per Copy-&-Paste aus einer .env in eine „So habe ich das eingerichtet"-Notiz gewandert und dann committet.

Wichtig: Es war keine neue Lücke — die Werte lagen längst in der Git-Historie. Der Umzug hat sie nur sichtbar gemacht. Genau deshalb ist ein Scan beim Aufräumen Gold wert: Er zeigt, was man über Monate übersehen hat.

Warum das passiert

Niemand schreibt bewusst Passwörter in die Doku. Es passiert schleichend: Beim Einrichten dokumentiert man die Schritte „wie sie waren" — inklusive der konkreten Werte, die man gerade in der Hand hatte. Die Notiz landet im Repo, wird nie wieder angefasst, und der Wert veraltet im Kopf, aber nicht in der Historie. Ein Pre-Commit-Hook, der bekannte Secret-Muster blockiert, hätte das früh verhindert — und tut es ab jetzt.

Der Denkfehler: Scrubben ≠ Entfernen

Der erste Reflex ist, die Werte durch Platzhalter zu ersetzen und zu committen. Das ist richtig und gehört gemacht — aber es beseitigt die Werte nur aus dem aktuellen Stand. In der Historie (und auf jedem geklonten Rechner, jedem Backup, jedem Spiegel-Remote) bleiben sie erhalten. Wer nur scrubbt und sich dann sicher fühlt, hat ein falsches Sicherheitsgefühl.

Aktueller Stand:   Platzhalter  ✔  (Scrubben)
Historie:          echter Wert  ✘  (bleibt bis Rotation/Rewrite)
Klone / Backups:   echter Wert  ✘

Rotation ist die eigentliche Behebung

Die einzige Maßnahme, die den exponierten Wert wirklich wertlos macht, ist die Rotation: einen neuen Wert erzeugen, auf beiden Seiten setzen — beim Aussteller und beim Nutzer — und den Dienst den neuen Wert übernehmen lassen. Danach ist es egal, wie oft der alte Wert noch irgendwo in einer Historie steht: Er öffnet nichts mehr.

Für ein OIDC-Client-Secret heißt das konkret: neuen Wert im Identity-Provider hinterlegen, denselben Wert in der Konfiguration des Dienstes setzen, den Provider-Cache leeren und den Dienst neu starten. Wichtig ist die Reihenfolge und Verifikation — beide Seiten müssen exakt denselben Wert tragen, sonst schlägt der Login fehl.

Bewährtes Vorgehen pro Rotation: vorher den alten Wert sichern (für ein Sekunden-Rollback), den neuen Wert server-seitig erzeugen (nie durch Logs/Terminals reichen), auf beiden Seiten setzen, gezielt nur den betroffenen Dienst neu starten, danach prüfen, dass beide Seiten übereinstimmen und der Login funktioniert.

Wenn ein Schlüssel nicht rotierbar ist

Nicht jeder Schlüssel lässt sich einfach tauschen. Ein Verschlüsselungs-Schlüssel, mit dem ein Dienst seine gespeicherten Zugangsdaten chiffriert, ist so ein Fall: Ändert man ihn naiv, sind alle damit verschlüsselten Daten unlesbar. So etwas braucht einen bewussten Re-Key-Vorgang (mit dem alten Schlüssel entschlüsseln, mit dem neuen wieder verschlüsseln) und gehört nicht in eine schnelle Nacht-und-Nebel-Aktion, sondern in einen geplanten, getesteten Schritt.

Lehre: Bevor man rotiert, klären, ob ein Wert ein austauschbares Credential ist oder ein Schlüssel, an dem Daten hängen. Die beiden erfordern völlig verschiedene Abläufe.

Privat ≠ egal — aber ändert die Dringlichkeit

Ein wichtiger Faktor für die Priorisierung: Ist das Repository öffentlich oder privat? Ist es öffentlich, ist jeder exponierte Wert sofort ein Notfall. Ist es privat und einbenutzt, sinkt die Dringlichkeit deutlich — das Risiko beschränkt sich auf jemanden mit Zugriff auf das private Repo, einen Klon oder ein Backup. Das rechtfertigt keine Nachlässigkeit, aber es entscheidet, ob man einen aufwändigen History-Rewrite (mit Werkzeugen wie git filter-repo) überhaupt braucht — und der lohnt ohnehin erst nach der Rotation. Solange die alten Werte noch gültig sind, ist ein Rewrite verschenkte Mühe.

Checkliste

Wenn du Secrets in deiner Doku/History findest:
  • Scannen — mit Muster-Suche, am besten als Pre-Commit-Hook dauerhaft.
  • Scrubben — Platzhalter im aktuellen Stand (nötig, aber nicht ausreichend).
  • Rotieren — der eigentliche Fix: macht den alten Wert wertlos.
  • Unterscheiden — austauschbares Credential vs. Schlüssel mit anhängenden Daten (Re-Key).
  • Priorisieren — öffentlich = Notfall; privat = wichtig, aber planbar.
  • History-Rewrite — nur nach Rotation und nur, wenn die Sichtbarkeit es rechtfertigt.
  • Vorbeugen — Doku mit Platzhaltern schreiben, echte Werte nur in der geschützten Konfiguration.

Der unangenehme Fund hatte am Ende etwas Gutes: Er hat einen blinden Fleck beleuchtet, einen Pre-Commit-Schutz etabliert und die riskantesten Werte tot gemacht. Aufräumen zahlt sich aus — manchmal anders als erwartet.