Konsolidierte Funde aus postgres-/sql-/jwt-/owasp-top10-expert-Review: - Race Conditions gefixt: doppelte aktive Kontrolle (SAVEPOINT + partieller Unique-Index), doppelte Mindermengen-Genehmigung (FOR UPDATE + Unique-Index), Lost-Update bei Nachfüllung (FOR UPDATE auf Fehlbestand/Objektposition). - Migration 0007: partielle Unique-Indizes als DB-Sicherheitsnetz + fehlende FK-Indizes (fehlbestand.material_id, kontrolle(objekt_id,status), zustaendigkeit, benutzer_rolle.rolle, objektposition.ablaufdatum u.a.). - Connection-Pool explizit begrenzt (pool_size=5, max_overflow=5) - ohne das könnte jeder uvicorn-Worker den Postgres max_connections-Wert sprengen. - Timing-Angriff bei Login-Enumeration gefixt (konstante Antwortzeit über Dummy-Hash), JWT-Decode verlangt jetzt exp/sub-Claims. - App-seitiges Rate-Limiting (slowapi, 5/min) auf /auth/login als Verteidigung in der Tiefe zusätzlich zum nginx-Limit. - nginx: TLS mit selbstsigniertem Zertifikat (LAN-Betrieb, keine Domain), HSTS, Content-Security-Policy, Permissions-Policy ergänzt. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
Deployment – MABEA
Zielserver: siehe Projekt-Memory (Debian 13, kein Docker-Zwang, Prompt 19).
Server-Grundausstattung (einmalig)
scp -i ~/.ssh/id_claude -r deploy root@<server>:/root/mabea-deploy
ssh -i ~/.ssh/id_claude root@<server>
cd /root/mabea-deploy
chmod +x install_server.sh
DB_PASSWORD='<sicheres-passwort>' APP_DOMAIN=<domain-oder-ip> ./install_server.sh
Installiert PostgreSQL + nginx, legt DB-Rolle/Datenbank an, richtet nginx als Reverse-Proxy vor 127.0.0.1:8000 ein. Ausgegebene DATABASE_URL sichern.
Backend deployen (später, nach Sprint-Fortschritt)
backend/auf den Server kopieren (z. B. nach/opt/mabea/backend),.venvdort anlegen,pip install -e ".[dev]"bzw. ohnedev-Extra für Produktion..envausbackend/example.envableiten,DATABASE_URLaus Schritt oben eintragen.alembic upgrade headausführen.mabea-backend.service.templatenach/etc/systemd/system/mabea-backend.servicekopieren (Pfade/User anpassen),systemctl daemon-reload && systemctl enable --now mabea-backend.
Eskalations-Prüfung einrichten (Karte 12, nach Backend-Deploy)
cp mabea-eskalation.service.template /etc/systemd/system/mabea-eskalation.service
cp mabea-eskalation.timer.template /etc/systemd/system/mabea-eskalation.timer
systemctl daemon-reload
systemctl enable --now mabea-eskalation.timer
Läuft täglich 06:00 Uhr (±5min Streuung), ruft scripts/eskalation_pruefen.py direkt
gegen die DB auf (kein HTTP/Admin-Token nötig). Zeitschwellen selbst liegen in der DB
(eskalation_konfiguration, admin-editierbar über GET/PUT /api/v1/eskalation/konfiguration),
nicht in dieser Timer-Konfiguration. Manueller Testlauf: systemctl start mabea-eskalation.service,
Ergebnis in journalctl -u mabea-eskalation.service.
Dateien
install_server.sh– Server-Grundausstattung (PostgreSQL, nginx), idempotentnginx_mabea.conf.template– Reverse-Proxy-Vorlage, voninstall_server.shverwendetmabea-backend.service.template– systemd-Unit-Vorlage für das Backend (noch nicht aktiviert, Pfade anpassen)mabea-eskalation.service.template/mabea-eskalation.timer.template– täglicher Eskalations-Prüflauf (Karte 12)