Web-Verwaltung von Krywerk Server¶
Stand: 2026-10-15. Umgesetzt sind W1–W4 des Plans: Anmeldung, Übersicht, Verwalten, Protokoll. W5, also Schlüsseloperationen im Browser, fehlt bewusst (Abschnitt 7). Die Web-Verwaltung ersetzt die Web-Konsole des früheren Boxcryptor-Firmenkontos, soweit das mit Ende-zu-Ende-Verschlüsselung ohne Schlüssel auf dem Server geht.
Krywerk Server liefert die Web-Verwaltung selbst aus, unter https://<server>/verwaltung/. Es gibt keinen
zusätzlichen Container und keinen Node-Build. Standardmäßig ist sie aus (KRYWERK_SERVER_WEB=1 schaltet sie ein).
1. Wer sieht was¶
| verwaltende Person (OWNER) | IT-Administration (Rolle admin) |
alle anderen | |
|---|---|---|---|
| Übersicht mit Handlungsbedarf | eigene Team-Ordner | alle | leer |
| Team-Ordner: Mitglieder, Zugriff, Notfallzugriff, Ereignisse | eigene | alle | – |
| Mitglieder aufnehmen/Rolle/entfernen, archivieren, löschen | eigene | alle (abschaltbar: web.admin_manage_all) |
– |
| Personen: Liste, Detail, Geräte, sperren/entsperren, gesperrte endgültig löschen (DSGVO) | nur sich selbst (Geräte entfernen) | alle | nur sich selbst |
| Gruppen: Übersicht; eigene Gruppen anlegen, befüllen, löschen | – | ja | – |
| Notfallanträge ansehen und abbrechen | eigene Ordner | alle | – |
| Protokoll mit Filter und CSV-Export | Ereignisse eigener Ordner | alles | – |
Die Rollen kommen aus denselben Token-Claims wie bei der API (oidc.roles_claim, oidc.admin_role).
2. Funktionen¶
- Übersicht: Kacheln (aktive/archivierte Ordner, Personen, Gruppen, gesperrte Personen, offene Notfallanträge) und darunter der Handlungsbedarf:
- Ordner, in denen niemand Zugriff gewähren kann (keine verwaltende Person mit eingerichtetem Konto)
- Personen, die auf eine Freigabe warten
- offene Notfallanträge
- gesperrte Personen, die noch in Ordnern stehen
- Personen ohne eingerichtetes Konto
Unten folgen die letzten Ereignisse. - Team-Ordner: Liste mit Suche und Statusfilter. Die Detailseite zeigt: - direkte Mitglieder, mit Rolle wechseln und Entfernen - Suche nach Personen und Gruppen, mit „Als Mitglied“ / „Als verwaltend“ - „Wer hat Zugriff“: alle Personen, auch über verschachtelte Gruppen, jeweils mit Herkunft und Stand („Zugriff aktiv“, „wartet auf Freigabe“, „Konto nicht eingerichtet“, „gesperrt“) - Notfallzugriff, Archivieren/Reaktivieren, Löschen (nur archiviert, mit Eingabe des Namens) und die letzten Ereignisse
Die letzte verwaltende Person lässt sich nicht entfernen. - Personen: Liste mit Filtern („Konto nicht eingerichtet“, „gesperrt“), letzte Anmeldung und letzte Nutzung eines Geräts. Die Detailseite zeigt Team-Ordner samt Herkunft, Gruppen, Geräte mit „Entfernen“ und die Ereignisse. Person sperren wirkt sofort: - keine Anmeldung, kein Entsperren und keine API-Anfrage mehr (403), Web-Sitzungen beendet - auf Wunsch Geräte entfernen sowie direkte Mitgliedschaften und Krywerk-Gruppen entziehen - Hinweis auf Ordner, deren Schlüssel die Person hatte, mit der Empfehlung „Schlüssel erneuern“ (F10) - Gruppen: Gruppen aus dem Anmeldedienst sind nur einsehbar; sie werden bei jeder Anmeldung abgeglichen. Eigene Gruppen (Herkunft „Krywerk“) lassen sich hier anlegen, umbenennen, befüllen (Personen und Untergruppen, ohne Zyklen) und löschen. Das ist für Organisationen gedacht, deren Anmeldedienst keine Gruppen liefert, und entspricht den Gruppen der Boxcryptor-Konsole. - Notfallzugriff: alle Anträge mit Begründung, Zustimmungen und Stand. Offene Anträge lassen sich abbrechen. Darunter stehen die Ordner ohne Notfallzugriff. Einrichten und Zustimmen bleibt in der App, weil dafür Schlüssel nötig sind. - Protokoll: wer wann was geändert hat, aus der App, aus Cryptomator-Apps (Gerät registriert, Schlüssel abgerufen oder verweigert) und aus der Web-Verwaltung („(Web)“). Filter nach Zeitraum, Ereignis, Ordner und Person; CSV-Export für Tabellenprogramme, mit Schutz gegen Formeln. - Sprache: Deutsch und Englisch, siehe unten.
Sprache¶
Die Web-Verwaltung und die Seiten unter /app (Ziel der Browser-Anmeldung aus der Krywerk-App und den
Cryptomator-Apps) gibt es auf Deutsch und Englisch. Die Sprache wird je Anfrage bestimmt:
- Ausdrückliche Wahl: Der Link „English“ bzw. „Deutsch“ oben rechts (auch auf der Anmelde- und Abmeldeseite)
ruft
/verwaltung/sprache?lang=en|de&zurueck=<Seite>auf. Das setzt das Cookiekrywerk_lang(Path=/,HttpOnly,SameSite=Lax, bei HTTPSSecure, ein Jahr) und führt zur selben Seite zurück. Rücksprungziele gelten wie nach der Anmeldung nur innerhalb von/verwaltung/. Ohne JavaScript. - Sonst die Browsereinstellung (
Accept-Language): Englisch, wenn die erste unterstützte Sprache Englisch ist. - Sonst Deutsch.
Übersetzt sind alle Texte: Navigation, Tabellen, Formulare, Bestätigungen, Hinweise, Fehlerseiten, die
Ereignisnamen im Protokoll und die Spaltenköpfe des CSV-Exports (Reihenfolge der Spalten gleich). Datum und Uhrzeit:
15.10.2026, 11:20 bzw. 15 Oct 2026, 11:20, in beiden Fällen in der Zeitzone des Servers. Gespeichert werden
weiterhin nur Codes (z. B. ORDNER_ANGELEGT); frei formulierte Angaben, die schon im Protokoll stehen (etwa
„Geräte entfernt: 2, …“ beim Sperren), bleiben so, wie sie geschrieben wurden. Alle Texte stehen in
crates/kw-server/src/web/i18n/texte.rs; ein Test prüft, dass jeder Text in beiden Sprachen vorhanden ist.
3. Was bewusst nicht geht¶
- Zugriff gewähren, also Ordnerschlüssel für neue Mitglieder verschlüsseln, braucht den Schlüssel einer verwaltenden Person. Das macht die Krywerk-App („Verwalten → Zugriff gewähren“). Die Web-Verwaltung zeigt, wer wartet.
- Team-Ordner anlegen braucht Schreibzugriff auf den Cloud-Ordner und läuft deshalb in der App.
- Nicht abbildbar sind Dateien ansehen, öffentliche Links und Richtlinien wie bei Boxcryptor. Den Firmen-Hauptschlüssel ersetzen sichtbare verwaltende Personen und der Notfallzugriff.
- Personen anlegen gehört zum Anmeldedienst. Eine Person erscheint nach ihrer ersten Anmeldung.
4. Einrichten¶
- Client im Anmeldedienst, Client-ID
krywerk-verwaltung, Authorization Code mit PKCE S256, Rücksprunghttps://<server>/verwaltung/anmeldung, nach dem Abmeldenhttps://<server>/verwaltung/abgemeldet. - Keycloak aus
compose.keycloak.yaml: Der Client steht schon in der Realm-Vorlage; die Adresse kommt ausKRYWERK_DOMAIN. - Vorhandenes Keycloak: öffentlicher Client mit den Werten oben, dazu derselbe Gruppen-Mapper wie beim
Client
cryptomator. - Entra ID direkt: App-Registrierung (Web-Plattform) mit diesem Umleitungs-URI und geheimem Clientschlüssel
(
KRYWERK_SERVER_WEB_CLIENT_SECRET). Rollen und Gruppen müssen dort im ID Token stehen. - In
krywerk.env:KRYWERK_SERVER_WEB=1, optionalKRYWERK_SERVER_WEB_CLIENT_ID,…_CLIENT_SECRETbzw.…_CLIENT_SECRET_FILE,…_SESSION_HOURS(8),…_IDLE_MINUTES(30),…_ADMIN_MANAGE_ALL(true). Für die UhrzeitenTZ=Europe/Berlin. - Die Caddy-Vorlagen lassen
/verwaltungnur aus privaten Netzen zu. Wer von außen verwalten soll, passt den Block@verwaltung_externan. krywerk-server check, dannhttps://<server>/verwaltung/öffnen.
Protokoll-Einstellungen: KRYWERK_SERVER_AUDIT_RETENTION_DAYS (365; 0 = nie löschen) und
KRYWERK_SERVER_AUDIT_RECORD_IP (aus). Das Protokoll wird auch ohne Web-Verwaltung geschrieben.
5. Sicherheit¶
- Anmeldung als „Backend for Frontend“:
- Der Server führt Authorization Code mit PKCE (S256),
state(an ein Cookie des Browsers gebunden) undnonceselbst durch. - Er prüft ID Token (Signatur, Aussteller,
aud/azp= Web-Client,nonce) und Access Token wie die API. - Tokens werden nicht aufbewahrt. Der Browser bekommt nur ein Sitzungs-Cookie:
HttpOnly,SameSite=Lax, bei HTTPSSecuremit dem Präfix__Host-. - In der Datenbank liegt nur SHA-256 der Sitzungs-ID. Sitzungen enden nach 8 Stunden, nach 30 Minuten ohne Anfrage, beim Abmelden und beim Sperren der Person.
- Formulare: jedes mit CSRF-Token je Sitzung (Vergleich in konstanter Zeit) und
Origin-Prüfung. Zerstörende Aktionen haben eine eigene Bestätigungsseite. - Kopfzeilen: CSP
default-src 'none'ohne Skripte,frame-ancestors 'none',X-Frame-Options: DENY,Cache-Control: no-store,Referrer-Policy: same-origin.same-originist nötig, weil Browser beino-referrerOrigin: nullsenden; die Caddy-Vorlagen setzen ihren Wert deshalb nur, wenn der Server keinen schickt. - Ausgabe: HTML entsteht nur über
web::html::Html. Markup ist dort nur als feste Zeichenkette möglich, alles andere wird maskiert, ein Test prüft das mit Namen wie<img onerror=…>. Rücksprungziele nach der Anmeldung gelten nur innerhalb von/verwaltung/, damit niemand auf fremde Seiten umgeleitet werden kann. - Protokoll: enthält nie Schlüssel, JWEs, Tokens oder Setup Codes. Ein Test prüft auch das Serverprotokoll darauf.
- API: Gesperrte Personen bekommen jetzt auch dort 403. Das weicht bewusst vom Referenz-Hub ab.
6. Tests¶
cargo test -p kw-server:- Einheiten: Escaping, CSV (Spaltenköpfe in beiden Sprachen), Rücksprungziele, Audience, Konfiguration,
Protokoll, Abfragen, neutrale Begriffe, Sprachwahl (
Accept-Language, Cookie), jeder Text auf Deutsch und Englisch mit denselben Platzhaltern tests/web.rsmit OIDC-Stub und PKCE-Prüfung: Anmeldung (state, nonce, aud, Rolle, Einmal-Code), Kopfzeilen, Rechte, CSRF/Origin, letzte verwaltende Person, Archiv/Löschen, Sperren samt API-Wirkung, Gerät entfernen, Leerlauf-Ablauf, eigene Gruppen mit Zyklusschutz, Notfallantrag abbrechen, Protokoll/CSV, Abmelden, Sprache (Englisch überAccept-Language, Cookie vor Kopfzeile, Umschalter ohne offenen Redirect,/app-Seiten)e2e/web_e2e.sh(Teil vonrun_all.sh stack): echter Keycloak des Test-Stacks mit Client übere2e/hub/web_client.sh, Anmeldung über das Keycloak-Formular, 30 Prüfungen (auf Deutsch, der Voreinstellung) sowie Serverprotokoll ohne Tokens/Cookies.e2e/server_ops_e2e.shmitKRYWERK_OPS_KEYCLOAK=1:- Realm-Vorlage: Client mit dem Rücksprung aus
KRYWERK_DOMAIN, fremde Rücksprünge abgelehnt - Weiterleitung hinter Caddy
- Caddy behält
Referrer-Policy: same-origin - Manuell (Testplan, Sitzung E): Browser auf einem anderen Rechner, Telefonbreite, Dunkelmodus, Tastatur, Screenreader-Stichprobe.
7. Offen¶
- W5 Zugriff gewähren im Browser über den Setup Code (WebCrypto). Bewusst zurückgestellt; erst entscheiden, wenn es Erfahrung mit der Alternative gibt.
- Automatisches Gewähren in der App: zurückgestellt – seit dem Web of Trust gewährt die App Zugriff bewusst Person für Person mit sichtbarer Vertrauensstufe (DECISIONS.md D-8).
- Abmelden bei Keycloak ohne Rückfrage: dafür müsste der Server
id_token_hintmitschicken und dazu das ID Token aufbewahren. Heute fragt Keycloak einmal nach.