Files
qrcode-generator/.env.example
T
Florian Wilde 1e0d04d0db Befunde der Sicherheitspruefung abarbeiten
S1 (hoch): Die OIDC-Rueckkehr verknuepft eine Identitaet mit einem
bestehenden Konto nur bei bestaetigter E-Mail — geprueft wurde das auch,
nur war die Bestaetigung als `email_verified !== false` berechnet. Damit
galt auch ein fehlender Claim als bestaetigt, und genau den schicken
manche Anbieter gar nicht. Jetzt zaehlt allein ein ausdrueckliches `true`.

S2 (hoch): `isAuthEnabled()` verlangte den Wert "true"; alles andere hiess
"aus". Eine vergessene Variable ergab eine Anwendung, in der jeder
Besucher alles darf, und nichts sah danach aus. Umgedreht: Abgeschaltet
wird nur, wer ausdruecklich "false" setzt. Die Vorgaben in Compose und
.env.example stehen auf true, und der Container warnt beim Start
mehrzeilig, solange die Anmeldung aus ist.

S5 (mittel): Der OIDC-Bootstrap las `user.count()` und legte danach an —
zwei gleichzeitige erste Anmeldungen konnten beide Administrator werden.
Jetzt in einer serialisierbaren Transaktion, wie die lokale
Ersteinrichtung es laengst tut.

S6 (niedrig): Die Herkunftspruefung verglich nur den Host, nicht das
Schema. Das Schema kommt jetzt aus BASE_URL — die eine Angabe zum
Ursprung, ueber die der Aufrufer nicht mitbestimmt.

S3, S4 und S7 bleiben offen und stehen begruendet in docs/sicherheit.md.
Bei S3 wurde der naheliegende Ausweg geprueft und verworfen: Waehrend der
Sperre weiter Passwoerter zu pruefen kostet 128 MiB je Versuch und
tauschte eine Sperre gegen ein Konto gegen eine gegen alle.

Refs #20
2026-08-24 01:02:03 +02:00

81 lines
3.4 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.
# true — Anmeldung erforderlich. Beim ersten Aufruf legst du den ersten
# Administrator an. Das ist die Vorgabe, auch wenn die Zeile fehlt.
# false — jeder, der die App erreicht, darf alles: Verwaltung, Uploads,
# saemtliche Codes. Nur fuer Einzelplatz- oder LAN-Betrieb, und
# nur, wenn niemand Fremdes an den Rechner kommt. Der Container
# warnt beim Start deutlich, solange das so steht.
# Bewusst hier und nicht in der Oberfläche: so kann man sich nicht aussperren.
# Wer den Zugang verliert, setzt den Wert auf false und startet neu.
AUTH_ENABLED=true
# 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