Files
crm-system/docs/audits/06c-secrets-audit.md
T

5.1 KiB
Raw Blame History

06c Secrets-Handling-Audit (Security & Data-Engineering)

Projekt: CRM System v1.0
Datum: 2026-06-04
Auditor: Security Data Engineer (Phase 6)
Repository: Leopoldadmin/crm-system, Branch main
Scope: .env/.gitignore-Prüfung, AUTH_SECRET-Handling, DATABASE_URL-Credentials, Coolify-ENV-Vars, Hardcoded-Fallback-Kontrolle


Findings

ID Severity Kategorie Beschreibung Empfehlung
SEC-01 PASS .gitignore-Regel .gitignore enthält .env, .env.* mit Ausnahmen !.env.example und !.env.docker.example. Diese Konfiguration ist korrekt: Die .env-Datei (mit realen Dev-Secrets) ist nicht im Git-Tree (git ls-files --error-unmatch .env → "did not match"). Keine Änderung nötig. Sicherstellen, dass .env.docker (falls jemals erstellt) ebenfalls exkludiert ist (aktuell durch .env.* abgedeckt).
SEC-02 PASS .env.example (Template) Enthält AUTH_SECRET=replace-me-with-a-secure-random-string-at-least-32-chars-long mit klarer Anweisung zum Generieren. Kein echter Secret-Wert committed. Akzeptabel als Entwickler-Dokumentation.
SEC-03 PASS .env (Dev) Lokale .env enthält AUTH_SECRET=test-secret-with-at-least-thirty-two-characters-for-development 62 Zeichen, kein Platzhalter, aber ein Dev-Secret. Datei ist nicht committed. Nur für lokale Entwicklung akzeptabel. Sollte vor einem versehentlichen Commit durch .gitignore geschützt sein ist es.
SEC-04 PASS AUTH_SECRET-Validierung config.py Settings.AUTH_SECRET: str = Field(..., min_length=32) zwingendes Feld ohne Default, Hard-Fail bei fehlendem Wert. Zusätzlicher field_validator lehnt Platzhalter (replace-me, changeme, secret) ab. Erfüllt Architecture R-5 (NO JWT secret fallback). Robust implementiert. Kein Angriffspunkt.
SEC-05 PASS AUTH_SECRET-Generierung COOLIFY_SETUP.md dokumentiert Secret-Generierung mit python -c "import secrets; print(secrets.token_urlsafe(48))". Empfohlene Länge: 48 Zeichen (Base64-encoded, ~384 Bit Entropie). Entspricht Best Practices. Empfehlung für Rotation: cron-Job, der AUTH_SECRET rotiert und alle Tokens invalidiert (v1.1).
SEC-06 PASS Hardcoded-Fallback-Kontrolle Kein AUTH_SECRET = "dev-secret"-Fallback im Code. Field(...) (Ellipsis) in Pydantic bedeutet: Wert MUSS gesetzt sein, sonst ValidationError beim App-Start. get_settings() via @lru_cache cached die Settings-Instanz jede Änderung an Env-Vars erfordert App-Neustart. Erfüllt Architecture R-5. Kein Soft-Fallback vorhanden.
SEC-07 PASS DATABASE_URL Enthält Credentials im Format postgresql+asyncpg://crm_user:<PW>@<host>:5432/crm_db. Wird via Coolify Env-Var DATABASE_URL gesetzt (nicht im Repo). Dev-Default sqlite+aiosqlite:///./dev.db enthält keine Credentials. In COOLIFY_SETUP.md dokumentiert: Passwort mit secrets.token_urlsafe(24) generieren. Production-Passwort muss stark sein (≥ 16 Zeichen). Aktuelles Dev-Setup (SQLite) ist credential-frei.
SEC-08 PASS Coolify-ENV-Vars Alle erforderlichen Secrets in COOLIFY_SETUP.md dokumentiert: DATABASE_URL, AUTH_SECRET, CORS_ORIGINS, ENVIRONMENT, LOG_LEVEL, BCRYPT_ROUNDS, JWT_ALGORITHM, JWT_EXPIRY_HOURS. Bulk-Update-Skript via Coolify-API bereitgestellt. Vollständig dokumentiert. Keine weiteren Secrets nötig.
SEC-09 INFO Secrets-Rotation Keine Rotation von AUTH_SECRET oder DATABASE_URL-Passwort in v1 vorgesehen. Token-Invalidierung bei Secret-Rotation würde alle aktiven Sessions beenden kein Mechanismus dafür implementiert. Für v1 akzeptabel. In v1.1: Secret-Rotation mit invalidierungs-Mechanismus planen.
SEC-10 WARN dev.db im Repository Datei dev.db (286.720 Bytes) existiert im Working-Tree, ist aber durch .gitignore-Regel *.db geschützt. git ls-files zeigt sie nicht an. Dennoch: SQLite-DB mit potenziell echten Testdaten sollte nie im Repo liegen. Aktuell geschützt durch .gitignore. Vor Release: dev.db aus Working-Tree löschen und sicherstellen, dass .git/info/exclude oder .gitignore alle DB-Dateien blockiert.

Summary: PASS

Das Secrets-Handling ist sicher. .env ist korrekt exkludiert, AUTH_SECRET hat Hard-Fail-Validierung ohne Fallback, und alle Coolify-ENV-Vars sind dokumentiert. Keine kritischen Findings.

Offene Punkte: Secrets-Rotation ist für v1 nicht implementiert, und die lokale dev.db sollte vor Release aus dem Working-Tree entfernt werden.


Empfehlungen für Phase 7 (Quality-Reviewer)

  1. dev.db-Bereinigung Vor Release: dev.db aus Working-Tree löschen und .gitignore auf DB-Dateien prüfen.
  2. Secrets-Rotation-Planung Dokumentieren, wie AUTH_SECRET und DB-Password in Coolify rotiert werden (v1.1 ToDo).
  3. Environment-Parity-Check Sicherstellen, dass alle in .env.example dokumentierten Keys auch in Coolify gesetzt sind (und umgekehrt).
  4. Secrets-Audit in CI/CD Optional: detect-secrets oder git-secrets Pre-Commit-Hook für automatische Secrets-Erkennung.