Zehn Befunde, alle behoben. Die wichtigsten: scrypt lief mit N=2^15; das OWASP Password Storage Cheat Sheet nennt 2^17. Jetzt 2^17, alte Hashes bleiben gueltig und werden beim naechsten Anmelden still erneuert — das ist der einzige Moment, in dem das Klartextpasswort vorliegt. Passwoerter hatten keine Obergrenze. Ein Passwort von mehreren Megabyte haette scrypt beschaeftigt, und zwar an einem Endpunkt ohne Anmeldung. Jetzt 128 Zeichen, geprueft vor dem Hashen. Als CSRF-Schutz gab es nur SameSite=Lax. Das Merkblatt sagt ausdruecklich, dass das allein nicht genuegt — besonders beim Upload, der multipart entgegennimmt und damit von einem fremden Formular erreichbar waere. Jetzt wird bei jedem schreibenden Zugriff der Origin gegen den Host der Anfrage geprueft (nicht gegen BASE_URL, die Anwendung laeuft unter mehreren Domains). Es gab keinen einzigen Schutzheader — die Verwaltung liess sich einbetten und per Clickjacking fernsteuern. Jetzt frame-ancestors none, X-Frame-Options, nosniff, Referrer-Policy und Permissions-Policy; X-Powered-By ist weg. Sitzungen hatten keine absolute Obergrenze: eine gestohlene Sitzung haette durch regelmaessige Nutzung unbegrenzt weitergelebt. Jetzt SESSION_MAX_DAYS neben SESSION_IDLE_DAYS, beide einstellbar. Dazu: Secure auch hinter einem TLS-Proxy, weniger Auskunft ueber fremde Konten bei der Anmeldung, eine Bremse je Absender gegen breites Durchprobieren, Ersteinrichtung ohne Wettlauf, und abgelaufene Sitzungen werden aufgeraeumt. Die Datei heisst proxy.ts statt middleware.ts — Next 16 hat die Konvention umbenannt. /api/uploads bleibt davon ausgenommen: Der Proxy puffert Anfragekoerper nur bis 10 MB, eine Datei an der Groessengrenze kaeme sonst unvollstaendig an. Die Herkunftspruefung macht die Route dort selbst. Befund, Begruendungen und was bewusst offen bleibt: docs/sicherheit.md
78 lines
3.2 KiB
Bash
78 lines
3.2 KiB
Bash
# ---------------------------------------------------------------------------
|
|
# QR-Code-Generator — Konfiguration
|
|
# Diese Datei nach ".env" kopieren und anpassen:
|
|
# cp .env.example .env
|
|
# ---------------------------------------------------------------------------
|
|
|
|
# Öffentliche Adresse, unter der die App erreichbar ist. Sie wird in
|
|
# dynamische QR-Codes einkodiert ({BASE_URL}/r/{slug}) und muss deshalb von
|
|
# den Geräten erreichbar sein, die den Code scannen.
|
|
# Im LAN z. B.: http://192.168.1.50:3000
|
|
BASE_URL=http://localhost:3000
|
|
|
|
# Host-Port, unter dem die App veröffentlicht wird (Port-Mapping APP_PORT:3000).
|
|
APP_PORT=3000
|
|
|
|
# Anmeldung mit Benutzern, Gruppen und Rollen.
|
|
# false — jeder, der die App erreicht, darf alles (Einzelplatz/LAN).
|
|
# true — Anmeldung erforderlich. Beim ersten Aufruf legst du den ersten
|
|
# Administrator an.
|
|
# Bewusst hier und nicht in der Oberfläche: so kann man sich nicht aussperren.
|
|
# Wer den Zugang verliert, setzt den Wert zurück auf false und startet neu.
|
|
AUTH_ENABLED=false
|
|
|
|
# Groesste erlaubte Datei fuer die Typen "PDF" und "Bild", in Megabyte.
|
|
# Die Dateien liegen in der Datenbank — wer die sichert, hat alles. Sehr
|
|
# grosse Werte machen die Sicherung entsprechend schwer.
|
|
MAX_UPLOAD_MB=10
|
|
|
|
# Sitzungsdauer in Tagen.
|
|
# SESSION_IDLE_DAYS — ohne Aktivitaet laeuft die Sitzung ab.
|
|
# SESSION_MAX_DAYS — harte Obergrenze ab dem Anmelden, unabhaengig davon,
|
|
# wie oft sie benutzt wurde.
|
|
# OWASP empfiehlt fuer oeffentliche Anwendungen deutlich kuerzere Werte
|
|
# (Minuten bzw. Stunden); siehe docs/sicherheit.md.
|
|
SESSION_IDLE_DAYS=30
|
|
SESSION_MAX_DAYS=90
|
|
|
|
# --- Anmeldung ueber Authentik oder einen anderen OIDC-Anbieter -------------
|
|
# Setzt AUTH_ENABLED=true voraus. Einrichtung siehe docs/authentik.md.
|
|
OIDC_ENABLED=false
|
|
|
|
# Basis-URL des Anbieters, unter der /.well-known/openid-configuration liegt.
|
|
# Bei Authentik: https://auth.example.com/application/o/<slug>/
|
|
OIDC_ISSUER=
|
|
OIDC_CLIENT_ID=
|
|
OIDC_CLIENT_SECRET=
|
|
|
|
# Beschriftung des Knopfs auf der Anmeldeseite.
|
|
OIDC_BUTTON_LABEL=Mit Authentik anmelden
|
|
|
|
# Angeforderte Bereiche. "openid" ist Pflicht, "email" wird gebraucht.
|
|
OIDC_SCOPES=openid email profile
|
|
|
|
# Nur noch ueber den Anbieter anmelden? Dann verschwindet das Passwortfeld.
|
|
# Vorsicht: Faellt der Anbieter aus, kommt niemand mehr hinein — zum Loesen
|
|
# hier auf false setzen und neu starten.
|
|
OIDC_ONLY=false
|
|
|
|
# Rolle, die neu angelegte Benutzer in der Standardgruppe bekommen.
|
|
# VIEWER (nur lesen), EDITOR (Codes anlegen und aendern) oder ADMIN.
|
|
OIDC_DEFAULT_ROLE=VIEWER
|
|
|
|
# Gruppe beim Anbieter, deren Mitglieder die Verwaltung oeffnen duerfen.
|
|
# Leer lassen, um die Administratorrechte hier in der Anwendung zu pflegen.
|
|
OIDC_ADMIN_GROUP=
|
|
# Name des Anspruchs, in dem die Gruppen stehen (Authentik: groups).
|
|
OIDC_GROUPS_CLAIM=groups
|
|
|
|
# --- PostgreSQL ------------------------------------------------------------
|
|
POSTGRES_USER=qrcode
|
|
POSTGRES_PASSWORD=bitte-aendern
|
|
POSTGRES_DB=qrcode
|
|
|
|
# Verbindungsstring der App zur Datenbank.
|
|
# "db" ist der Servicename aus docker-compose.yml — innerhalb des Compose-
|
|
# Netzwerks wird darüber die Datenbank aufgelöst.
|
|
DATABASE_URL=postgresql://qrcode:bitte-aendern@db:5432/qrcode?schema=public
|