58 lines
3.4 KiB
Markdown
58 lines
3.4 KiB
Markdown
# Del 12 – Säkerhet & GDPR
|
||
|
||
Konkret checklista (spec §56). Status: ✅ implementerat i kod, 🔧 process/deploy-steg.
|
||
Teknisk hardening-lista per miljö: `infrastructure/security/hardening-checklist.md`.
|
||
|
||
## Autentisering & åtkomst
|
||
|
||
- ✅ Lösenord: scrypt (OWASP-parametrar N=2^15, r=8, p=1), unika salter, timingSafeEqual
|
||
- ✅ JWT access 15 min; refresh-tokens hashade + roterande; återanvändning revokerar hela familjen
|
||
- ✅ Rollmodell user/moderator/admin; admin dubbelkollas mot DB, alla admin-anrop auditloggas
|
||
- ✅ Hushållsåtkomst: `requireMembership` är enda vägen till hushållsdata; roller owner/adult/member/child
|
||
- ✅ Rate limiting: 300/min globalt, 10/min på auth
|
||
- ✅ Least privilege i DB: separat databas + egen användare med minsta privilegier utan superuser (skript i infrastructure/deployment)
|
||
|
||
## Dataseparation (spec §7, §56)
|
||
|
||
- ✅ Hälsodata (`user_health_profiles`) i egen tabell; hushålls-endpoints returnerar ALDRIG medlemmars hälsodata/allergier/mål
|
||
- ✅ Individuellt: mål, allergier, smakprofil, måltidshistorik. Delat: lager, lista, plan, matlådor, budget
|
||
- ✅ Pseudonymiserat subjectRef till AAMOS – aldrig e-post/namn
|
||
|
||
## Samtycke & minne (spec §32–33)
|
||
|
||
- ✅ Separata samtycken: personalization / anonymized_improvement / image_training / health_integration / location_weather / push – med grant/revoke-tidsstämplar + audit
|
||
- ✅ Minne transparent ("Vad appen vet om mig"), korrigerbart, pausbart, raderbart; användarrättelser vinner alltid
|
||
- ✅ Träningsexport filtrerar på samtyckessnapshot taget VID korrigeringstillfället
|
||
- ✅ Ingen hälso-/kostdata till reklam: inga annons-SDK:er; policybeslut D-014
|
||
|
||
## Registrerades rättigheter
|
||
|
||
- ✅ Export: `GET /v1/me/export` (konto, profil, preferenser, samtycken, måltider, minne, betyg)
|
||
- ✅ Radering: `DELETE /v1/me` – hälsodata/minne/måltider/tokens raderas hårt, kontot anonymiseras
|
||
- 🔧 Backup-retention: raderad data roteras ur backupper enligt policy (30 dagar) – dokumenteras i DPA
|
||
|
||
## Applikationssäkerhet
|
||
|
||
- ✅ Zod-validering på ALL indata; enhetliga felsvar utan stackspår; user enumeration förhindrad vid login
|
||
- ✅ Säkerhetsheaders (nosniff, DENY, no-referrer, no-store); CORS låst till kända origins
|
||
- ✅ Correlation-ID på varje request → loggar → jobb → AAMOS → audit (spec §58)
|
||
- ✅ Idempotens: unika nycklar för butiks-transaktioner; idempotency_keys-tabell för klient-retries
|
||
- ✅ Säker filuppladdning: presignade URL:er med HMAC, content-type-krav, 15 MB-tak, nycklar utan användardata
|
||
- ✅ Signerad entitlement-token (HS256) med TTL + grace – aldrig permanent lokal boolean (§44)
|
||
- ✅ Produktionsstart vägrar dev-hemligheter och AAMOS_MODE=mock
|
||
- ✅ Mobilen: tokens i SecureStore; inga AI-nycklar i appen (§61.13)
|
||
|
||
## Drift (🔧 vid deploy, se hardening-checklistan)
|
||
|
||
Egen Linux-user + secrets 600 → senare SSM/Secrets Manager; egen IAM-roll endast mot
|
||
egen S3-bucket; S3: block public access, SSE, lifecycle (temporary 7d, scans 90d);
|
||
TLS via reverse proxy på egen domän; backupper: RDS-snapshots + logisk dump före varje
|
||
deploy (deploy.sh vägrar migrera utan lyckad dump); **restore-test kvartalsvis,
|
||
protokollfört**; incidentplan i Del 17.
|
||
|
||
## Kvarstående juridiska uppgifter
|
||
|
||
🔧 DPA med AWS och AAMOS-driften · 🔧 registerförteckning (art. 30) ·
|
||
🔧 integritetspolicy + villkor (jurist före TestFlight-extern) ·
|
||
🔧 DPIA rekommenderas (hälsorelaterad data + profilering) före publik lansering.
|