security(cards): fail-secure dev-stub, headers, rate-limit, dsgvo audit
Some checks are pending
CI / validate (push) Waiting to run
Some checks are pending
CI / validate (push) Waiting to run
Behebt live verifiziertes Auth-Bypass auf cardecky-api.mana.how (X-User-Id → founder-Tier) und zieht im selben Patch das fehlende Operations-/Compliance-Fundament nach. * Auth-Middleware fail-secure: opt-in via CARDS_AUTH_DEV_STUB="true" (war opt-out, Default true). Compose-Default flipped auf "false", NODE_ENV="production" für cards-api ergänzt, env-Template dokumentiert. vitest.config.ts + tests/setup.ts aktivieren den Stub gezielt für Test-Suiten. * Security-Headers: Hono secureHeaders() in apps/api, SvelteKit hooks.server.ts mit X-Frame/X-Content-Type/Referrer/ HSTS in apps/web. CSP bewusst ausgelassen — eigener Sprint. * CORS-localhost-Whitelist nur außerhalb Prod. * Rate-Limiting (in-memory sliding window, dependency-frei) auf share.receive 60/min/IP, media.upload 30/min/user, decks.generate + decks.from-image 10/min/user, dsgvo.* 10/min/IP. * Health-Endpoint mit echter DB- und MinIO-Probe; /healthz bleibt Liveness, /healthz/details ist Readiness mit 503 bei Failure. * DSGVO-Honesty: storage_ok + storage_error im Response (statt schluckend console.warn), Account-UI zeigt Fehler-Toast. * Audit-Log: strukturierte JSON-Zeile (kind: "audit") auf stdout für /dsgvo/export, /dsgvo/delete, /me/export, /me/delete. * Bug-Fix: duplizierte case "multiple-choice"-Clause in fsrs.ts. Verifiziert: apps/api 17 Files / 104 Tests grün, apps/web check 0 errors. Deploy auf Mac Mini steht noch aus. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
5859e202c5
commit
e1ddbf34b3
21 changed files with 832 additions and 80 deletions
|
|
@ -9,6 +9,13 @@ CARDS_S3_SECRET_KEY=change-me-32-bytes-base64
|
|||
CARDS_DSGVO_SERVICE_KEY=change-me-msk-prefix
|
||||
CARDS_API_VERSION=1.0.0
|
||||
|
||||
# Fail-secure: in Produktion MUSS dieser Wert 'false' bleiben (oder die
|
||||
# Variable ganz weggelassen werden — der Compose-Default ist 'false').
|
||||
# Nur für gezielte Diagnose temporär auf 'true' setzen und sofort
|
||||
# wieder zurückstellen. Wenn 'true' aktiv ist, akzeptiert die API
|
||||
# `X-User-Id`-Header als vollwertige Auth (founder-Tier).
|
||||
CARDS_AUTH_DEV_STUB=false
|
||||
|
||||
# Verdaccio-Token für @mana/* — nutze denselben claudebot-Token, den
|
||||
# auch die Plattform verwendet (siehe ~/.cloudflared/.npmrc oder
|
||||
# secret_verdaccio_claudebot.md).
|
||||
|
|
|
|||
|
|
@ -91,7 +91,11 @@ services:
|
|||
MANA_AUTH_URL: https://auth.mana.how
|
||||
MANA_CREDITS_URL: https://credits.mana.how
|
||||
CARDS_MANA_SERVICE_KEY: ${CARDS_MANA_SERVICE_KEY:-}
|
||||
CARDS_AUTH_DEV_STUB: ${CARDS_AUTH_DEV_STUB:-true}
|
||||
# Fail-secure: opt-in. Auf der Prod-Box gar nicht setzen
|
||||
# ⇒ Bypass AUS. Nur für gezielte lokale Diagnose temporär
|
||||
# auf 'true' setzen (und sofort wieder rausnehmen).
|
||||
CARDS_AUTH_DEV_STUB: ${CARDS_AUTH_DEV_STUB:-false}
|
||||
NODE_ENV: production
|
||||
ports:
|
||||
- '127.0.0.1:3191:3081'
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue