fix(securitate): hardening prod — headere, body-cap, non-root, backup

Findings security-review P1/P2 (2026-07-03):
- headere de securitate pe toate raspunsurile (nosniff, X-Frame-Options,
  Referrer-Policy, HSTS doar pe HTTPS) + teste
- body-cap global 10MB ca middleware ASGI pur (413 inainte de parserul
  multipart/JSON; verificarea per-endpoint ramane strat 2)
- imagine Docker non-root (uid 10001), port 8010 aliniat, loguri pe
  volumul /data
- fail-fast la boot cu rar_env=prod fara AUTOPASS_REQUIRE_API_KEY sau
  AUTOPASS_SESSION_SECRET
- compose: env-uri critice obligatorii (:?) ca api/worker sa nu diverga
  tacit; FORWARDED_ALLOW_IPS ca rate-limit-ul sa vada IP-ul real dupa
  Traefik
- signup fara PII in stdout: log_event in loc de print cu email (idem
  notify degradat)
- ratelimit: sterge cheile fara timestamp-uri valide (crestere monotona
  a memoriei pe IP-uri reale)
- backup criptat SQLite (backup online API, gpg AES256) + verificare
  restore + docs/backup.md

Suita completa verde: 1557 passed, 1 skipped (live).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Claude Agent
2026-07-06 12:46:49 +00:00
parent fa52468a80
commit 63b6cbc01d
19 changed files with 957 additions and 29 deletions

View File

@@ -8,20 +8,55 @@ AUTOPASS_CREDS_KEY=
# --- Auth API-key ---
# true = orice /v1/* cere cheie valida (prod). false = dev (fara cheie -> cont id=1).
# OBLIGATORIU in docker-compose.yml (:?) — vezi nota din compose.
AUTOPASS_REQUIRE_API_KEY=false
# --- Worker ---
# Send catre RAR. false = nu trimite (default, sigur pentru probe). true = end-to-end.
# OBLIGATORIU in docker-compose.yml (:?) — vezi nota din compose.
AUTOPASS_WORKER_SEND_ENABLED=false
# Dev: foloseste creds <test> din settings.xml cand submission-ul nu are creds criptate.
AUTOPASS_WORKER_USE_TEST_CREDS=false
# --- RAR ---
# test | prod
# test | prod. Ancora globala, NU tinta trimiterilor: dupa PRD 5.20 mediul RAR e
# per submission/cont (worker-ul trimite dupa submissions.rar_env). Variabila asta
# e doar fallback API pentru conturi fara medii disponibile, backfill la migrare
# si afisaj dashboard. OBLIGATORIE in docker-compose.yml (:?) — vezi nota din compose.
AUTOPASS_RAR_ENV=test
# --- Sesiuni web ---
# Secret semnat cookie sesiune, PARTAJAT intre restart-uri (fara el, fiecare
# redeploy delogheaza toti userii). Genereaza:
# python3 -c "import secrets; print(secrets.token_hex(32))"
# OBLIGATORIU in docker-compose.yml (:?).
AUTOPASS_SESSION_SECRET=
# True (prod, implicit in compose): cookie de sesiune cu flag Secure (necesita HTTPS).
# False: doar pentru smoke-test local pe HTTP simplu (browserul dropeaza cookie-ul
# Secure pe HTTP, deci login-ul ar esua silentios cu true).
AUTOPASS_SESSION_HTTPS_ONLY=true
# --- Embeddings (sugestie mapare, Stratul 2 PRD 5.14) ---
# false = dezactivat (default; /mapari instant, sugestii din GOLD/SILVER + fuzzy).
# true = sugestii semantice. Prima cerere /mapari lazy-load-eaza modelul fastembed/ONNX
# (~230MB pe disc) sincron -> hang la prima cerere. Doar API-ul il incarca.
AUTOPASS_EMBEDDINGS_ENABLED=false
# --- Backup SQLite criptat (T2/P0-4, vezi docs/backup.md) ---
# TRIGGER DUR: backup-ul trebuie configurat INAINTE de prima declaratie reala in
# prod. Baza e sistemul legal de evidenta (L.142/2023); FINALIZATA e terminal la
# RAR, deci pierderea volumului fara backup produce duplicate necorectabile.
#
# Parola de criptare (gpg AES256) a backup-urilor — obligatorie, tools/backup_db.sh
# refuza sa scrie un backup necriptat. Foloseste fisierul (secret montat), NU variabila
# inline, in prod:
AUTOPASS_BACKUP_PASSPHRASE_FILE=
# Alternativa (ex. teste locale) — parola inline, evita in prod:
AUTOPASS_BACKUP_PASSPHRASE=
# Director destinatie backup-uri (pe volumul persistent, NU efemer).
AUTOPASS_BACKUP_DIR=/data/backups
# Cate backup-uri locale criptate se pastreaza (cele mai vechi se sterg).
AUTOPASS_BACKUP_KEEP=14
# Tinta rclone optionala pentru upload off-site (ex. remote:bucket/autopass). Fara ea,
# backup-ul ramane doar local pe volum — sarit explicit cu log, nu esec silentios.
AUTOPASS_BACKUP_RCLONE_REMOTE=