Zum Inhalt

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:

  1. 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 Cookie krywerk_lang (Path=/, HttpOnly, SameSite=Lax, bei HTTPS Secure, ein Jahr) und führt zur selben Seite zurück. Rücksprungziele gelten wie nach der Anmeldung nur innerhalb von /verwaltung/. Ohne JavaScript.
  2. Sonst die Browsereinstellung (Accept-Language): Englisch, wenn die erste unterstützte Sprache Englisch ist.
  3. 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

  1. Client im Anmeldedienst, Client-ID krywerk-verwaltung, Authorization Code mit PKCE S256, Rücksprung https://<server>/verwaltung/anmeldung, nach dem Abmelden https://<server>/verwaltung/abgemeldet.
  2. Keycloak aus compose.keycloak.yaml: Der Client steht schon in der Realm-Vorlage; die Adresse kommt aus KRYWERK_DOMAIN.
  3. Vorhandenes Keycloak: öffentlicher Client mit den Werten oben, dazu derselbe Gruppen-Mapper wie beim Client cryptomator.
  4. 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.
  5. In krywerk.env: KRYWERK_SERVER_WEB=1, optional KRYWERK_SERVER_WEB_CLIENT_ID, …_CLIENT_SECRET bzw. …_CLIENT_SECRET_FILE, …_SESSION_HOURS (8), …_IDLE_MINUTES (30), …_ADMIN_MANAGE_ALL (true). Für die Uhrzeiten TZ=Europe/Berlin.
  6. Die Caddy-Vorlagen lassen /verwaltung nur aus privaten Netzen zu. Wer von außen verwalten soll, passt den Block @verwaltung_extern an.
  7. krywerk-server check, dann https://<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) und nonce selbst 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 HTTPS Secure mit 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-origin ist nötig, weil Browser bei no-referrer Origin: null senden; 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.rs mit 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 über Accept-Language, Cookie vor Kopfzeile, Umschalter ohne offenen Redirect, /app-Seiten)
  • e2e/web_e2e.sh (Teil von run_all.sh stack): echter Keycloak des Test-Stacks mit Client über e2e/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.sh mit KRYWERK_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_hint mitschicken und dazu das ID Token aufbewahren. Heute fragt Keycloak einmal nach.