# Säkerhets-hardening – checklista (spec §51, §56) ## Server (steg 1, befintlig maskin) - [ ] Dedikerad Linux-användare `` (från brand.config.json) utan sudo; äger `/opt/-platform` — _ej provisionerad (/opt tom)_ - [ ] Secrets i `/opt/-platform/secrets/*.env`, ägare ``, chmod 600 — _ej provisionerad_ - [x] Docker-containrar kör som non-root — `Dockerfile.api` och `Dockerfile.worker` har `USER app`; **`Dockerfile.admin` saknar USER och kör som root** (gap) - [ ] API exponeras endast på 127.0.0.1 bakom reverse proxy med TLS (API-domän ur brand.config.json) — _deploy-skriptet väntar 127.0.0.1:4100/healthz, men reverse proxy/TLS är ej uppsatt i denna miljö_ - [ ] Brandvägg: endast 80/443 inåt; Redis/Postgres nås aldrig utifrån — _ej verifierad i denna miljö_ - [ ] Automatiska säkerhetsuppdateringar (unattended-upgrades) — _ej verifierad i denna miljö_ ## AWS - [ ] Egen IAM-roll `-app` med åtkomst ENDAST till appens S3-bucket — _ej provisionerad_ - [ ] S3: block public access, SSE-S3-kryptering, lifecycle (temporary/ 7 dagar, scans/ 90 dagar) — _ej provisionerad_ - [x] RDS: separat databas + användare med minsta privilegier — `create-database.sql` finns och skapar begränsad roll; faktisk RDS-instans ej provisionerad i denna miljö - [ ] Secrets Manager/SSM för produktionshemligheter (steg 2) — _ej provisionerad; first-deploy.sh vägrar generera prod-secrets_ ## Applikation - [x] Lösenord: scrypt med OWASP-parametrar - [x] Refresh-tokens: hashade, roterande, familjeåterkallelse vid återanvändning - [x] Rate limiting globalt + strikt på auth-endpoints - [x] Idempotency-nycklar för känsliga POST (tabell finns; aktiveras per route) - [x] Correlation-ID på alla requests - [x] Audit log för känsliga åtgärder - [x] Zod-validering på all indata - [x] Säkerhetsheaders (nosniff, frame-deny, no-referrer, no-store) - [x] CORS låst till kända origins - [x] Hälsodata i egna tabeller, exponeras aldrig via hushålls-endpoints - [x] Produktion vägrar starta med dev-hemligheter eller AAMOS_MODE=mock ## GDPR (spec §56) - [x] Export: `GET /v1/me/export` - [x] Radering: `DELETE /v1/me` (cascade + anonymisering) - [x] Samtycken: separata, med tidsstämplar och audit - [x] Minne: transparent, korrigerbart, pausbart, raderbart - [x] Träningsdata endast med `anonymized_improvement`-samtycke (snapshot per korrigering) - [x] Retentionspolicy automatiserad: dagligt RUN_RETENTION-jobb (tokens 7 d, refresh 30 d, skanningar/notiser 90 d); S3 lifecycle sätts vid bucket-skapandet (runbook steg 3) - [x] Backup-restore-test genomfört och protokollfört (skript: infrastructure/deployment/backup-restore-test.sh; senaste protokoll i infrastructure/backups/ – GODKÄND, 62 tabeller identiska). Upprepa kvartalsvis - [ ] Personuppgiftsbiträdesavtal med AWS + AAMOS-drift — _ej på plats_ - [x] Ingen hälso-/kostdata till reklam – policybeslut, inga annons-SDK:er i appen