WvdS Vault
Vault ist der eine Ort für die Betreibergeheimnisse der Paketfamilie: verschlüsselt abgelegt, mit Ablaufdatum, Übergabe-Rotation und einem Zugriffsprotokoll. Ohne ihn liegen Zugangsdaten an so vielen Stellen, wie es Pakete gibt. Gedacht ist das Paket für Verwalter, die Geheimnisse eintragen, wechseln und deren Verwendung nachweisen müssen.
Erste Schritte
Schnelleinstieg: Das erste Geheimnis ablegen und verweisen — der kürzeste Weg zum ersten Ergebnis, in drei Schritten.
Voraussetzungen prüfen → Schlüsselquelle festlegen → Schema wählen → Zugriffe nachweisen
Häufige Aufgaben
| Was Sie wollen | Für wen | Wo Sie das tun | Anleitung |
|---|---|---|---|
| ein Geheimnis eintragen oder ändern | Verwaltung | Administration > Tresor | Fünf Schemata |
| ein Geheimnis planmäßig wechseln | Verwaltung | Administration > Tresor | Rotation |
| die Schlüsselquelle wechseln | Verwaltung | – | Die Schlüsselquelle wechseln |
| nachweisen, wer wann zugegriffen hat | Verwaltung | Administration > Tresor | Das Zugriffsprotokoll |
| den zweiten Faktor vor dem Zugriff verstehen | Verwaltung | – | Zweiter Faktor |
| wissen, was der Tresor nicht leistet | Verwaltung | – | Was der Tresor nicht leistet |
Zweck
Ein Ort für die Betreibergeheimnisse der Suite: verschlüsselt abgelegt, mit Ablaufdatum,
Übergabe-Rotation und einem Zugriffsprotokoll. Ohne ihn liegen Zugangsdaten an so vielen Stellen,
wie es Plugins gibt, in so vielen Formen, wie ihre Autoren erfunden haben — und mindestens eine
davon ist Klartext in conf/local.php.
Angemeldeter Dienst (siehe Core Plugin): vault.secrets. Die Einträge liegen über
Storage Plugin in data/dwdo/.
Was der Tresor ausdrücklich nicht leistet
Die Grenze steht vorn, weil sie bei einem Tresor die wichtigste Auskunft ist.
Mit der voreingestellten Schlüsselquelle salt wird der Hauptschlüssel aus dem
Instanz-Salt des Wikis abgeleitet. Dieses Salt liegt unter data/meta/ — demselben Zweig wie
die Tresordatenbank unter data/dwdo/.
data/ enthält Schlüssel und
Chiffrat zusammen. Wer dieses Archiv hält, erreicht die Geheimnisse. Dagegen schützt dieses
Plugin nicht.
Wogegen es schützt, ist alles diesseits davon: eine ausgeplauderte Seite, ein zu weit gefasster Dateizugriff, ein Plugin, das seine eigene Konfiguration protokolliert, eine Datenbank, die einem Entwickler ausgehändigt wird.
Diese Klasse lässt sich vollständig verlassen, indem eine andere Schlüsselquelle gewählt wird
— siehe Konfiguration. env und file legen den Schlüssel außerhalb von data/ und
damit außerhalb der Wiki-Sicherung.
Fünf Schemata, eine Entscheidung des Betreibers
Ein Plugin, das ein Kennwort braucht, bekommt keinen Wert, sondern einen Verweis. Welche Quelle eine Installation benutzt, entscheidet damit der Betreiber und nicht der Autor jedes einzelnen Plugins.
| Verweis | Bedeutung |
|---|---|
vault:{kennung} | Eintrag aus diesem Tresor |
env:{name} | Umgebungsvariable |
file:{pfad} | Datei unterhalb des in file_root konfigurierten Verzeichnisses |
enc:… | unmittelbar verschlüsselt abgelegter Wert |
plain:… | Klartext, ausdrücklich als solcher gekennzeichnet |
Aufgelöst wird aus einem eigenen Plugin heraus über SecretRef; das Ergebnis unterscheidet
zwei Fälle, die nicht zusammengeworfen werden dürfen:
| Ergebnis | Bedeutung |
|---|---|
null | es war nichts konfiguriert |
SecretRefException | es war etwas konfiguriert und konnte nicht eingelöst werden |
Konfiguration
| Einstellung | Vorgabe | Bedeutung |
|---|---|---|
keysource | salt | Herkunft des Hauptschlüssels: salt, env oder file |
keysource_ref | leer | Variablenname für env, Dateipfad für file; bei salt ohne Wirkung |
file_root | leer | Wurzelverzeichnis, in dem file:-Verweise bleiben müssen. Leer schaltet das Schema ganz ab |
log_page_size | 100 | Zeilen je Seite im Zugriffsprotokoll |
log_keep_days | 365 | Alter, ab dem Zugriffssätze verfallen; 0 behält sie dauerhaft |
file_root ist leer voreingestellt und damit ausfallsicher geschlossen. Ein Verweis ist
vom Betreiber gelieferte Konfiguration; ohne eine Wurzel, die ihn einsperrt, wäre file: ein
Werkzeug zum Lesen beliebiger Dateien im Gewand eines Geheimnisses.
salt ist die Vorgabe, weil es keine Einrichtung braucht — und die schwächste der drei
Möglichkeiten. env und file sind beide auf eine andere Maschine und ein anderes
Betriebssystem kopierbar. Genau diese Anforderung schließt maschinengebundene Speicher (DPAPI,
TPM, Schlüsselbund) aus: ein Tresor, dessen Schlüssel den Rechner nicht verlassen kann, ist nach
einem Rechnerausfall unwiederbringlich — Sicherung vorhanden und unlesbar.
Die Schlüsselquelle wechseln
Der Wechsel ist unterstützt und für sich genommen gefahrlos: jeder Wert trägt einen Fingerabdruck des Schlüssels, unter dem er verschlüsselt wurde, niemals den Schlüssel selbst. Bestehende Einträge entschlüsseln deshalb weiter, neue Schreibvorgänge benutzen die neue Quelle.
Die Reihenfolge ist verbindlich:
- Einstellung ändern.
- Neuverschlüsselung auf dem Verwaltungsbildschirm ausführen.
- Erst danach das alte Schlüsselmaterial entfernen.
Der Bildschirm meldet über keyUsage(), wie viele Einträge noch unter dem alten Fingerabdruck
liegen. Das sind genau die, die beim vorzeitigen Entfernen unlesbar würden.
Rotation: zwei Fächer, vier Schritte
Ein Eintrag hat zwei Fächer. Ein neuer Wert wird zunächst bereitgelegt und schaltet dabei nichts um; erst das Übernehmen macht ihn zum gültigen Wert.
stage()— neuen Wert bereitlegen, der laufende Betrieb benutzt weiter den altenpromote()— den bereitgelegten Wert zum gültigen machen
Das Zugriffsprotokoll
Je Lesen, Schreiben und Übernehmen eine Zeile mit Handelndem, Eintrag, Vorgang und Ergebnis — und nie ein Wert. Das ist der Unterschied zwischen einem Tresor und einer verschlüsselten Datei.
Der Dienst vault.secrets gibt ausschließlich Lesen heraus (read(), has()) und
bindet den Handelnden. Ein Plugin, das ein Kennwort braucht, kann damit weder eines rotieren noch
ein Lesen jemand anderem zuschreiben.
Aufgeräumt wird über die Aufgabenausführung des Indexers, also bei gewöhnlichen Seitenaufrufen. Auf einem Wiki ohne Verkehr bleiben die Sätze deshalb schlicht stehen.
Zweiter Faktor vor jedem Zugriff auf Geheimnismaterial
Über den Identity Plugin Contract v1 (Vertragsbeschreibung) abgesichert: eine Brücke
do=wkvault_stepup mit fest verdrahteter Kategorienliste.
| Kategorie | Gilt für |
|---|---|
create | Einen Eintrag anlegen |
rotate | Einen Wert bereitlegen |
delete | Einen Eintrag löschen |
rekey | Die Schlüsselquelle wechseln und alles umschlüsseln |
Geprüft wird doppelt — lesend beim Zeichnen des Bildschirms und erneut beim Absenden —, und
in beiden Fällen zusätzlich zur DokuWiki-Zugriffsliste, nie an ihrer Stelle. Ohne
wkidentity verhält sich das Paket unverändert.
Die Brücke nimmt nie eine vom Aufrufer gelieferte Anforderung entgegen, nur einen Namen aus ihrer eigenen Liste; ein unbekannter Name ergibt eine Ablehnung, nie „keine Anforderung„.
Voraussetzungen
- PHP 8.2 oder neuer.
- Core Plugin für die Dienstregistrierung und Storage Plugin für die Einträge — beide erforderlich, nicht wahlweise.
- Administratorrechte für den Verwaltungsbildschirm.
Das Schema legt zwei Tabellen an, „vault.secret“ und „vault.zugriff“, jeweils idempotent. Der Punkt gehört zum Namen und trennt das Modul ab, seit alle Module ihre Tabellen in einer gemeinsamen Datenbank halten; er muss in SQL immer in Anführungszeichen stehen, weil SQLite ihn sonst als Datenbanktrenner liest und die Tabelle nicht findet.
Grenzen
- Die voreingestellte Schlüsselquelle teilt sich die Sicherung mit den Daten — siehe oben.
- Ein abgelaufenes Geheimnis wird weiterhin ausgeliefert. Der Ablauf ist eine Aufforderung, keine Sicherung: an einem Stichtag die Auslieferung zu verweigern legte Mailversand, Datenbanken und Repository-Zugang gleichzeitig still, und zwar aus einem verwaltungstechnischen Grund.
- Bereitlegen schaltet nichts um. Nur das Übernehmen tut das. Das ist die Bauform, kein Mangel.
- Der Tresor kann beim Anbieter nichts widerrufen. Eine Rotation abzuschließen, indem die alte Zugangsberechtigung ungültig gemacht wird, bleibt Aufgabe des Betreibers.
- Verlorenes Schlüsselmaterial heißt verlorene Werte. Einen Wiederherstellungsweg gibt es bauartbedingt nicht.
- Das Aufräumen hängt am Indexer des Wikis.
Paketangaben
Plugin: wkvault
Namespace: lib/plugins/wkvault/
Autor: Wolfgang van der Stille Wolfgang.van.der.Stille@gmail.com (The White Knight Labs)
Lizenz: GPL 2