2.9 KiB
2.9 KiB
Säkerhets-hardening – checklista (spec §51, §56)
Server (steg 1, befintlig maskin)
- Dedikerad Linux-användare
<slug>(från brand.config.json) utan sudo; äger/opt/<slug>-platform— ej provisionerad (/opt tom) - Secrets i
/opt/<slug>-platform/secrets/*.env, ägare<slug>, chmod 600 — ej provisionerad - Docker-containrar kör som non-root —
Dockerfile.apiochDockerfile.workerharUSER app;Dockerfile.adminsaknar 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
<slug>-appmed åtkomst ENDAST till appens S3-bucket — ej provisionerad - S3: block public access, SSE-S3-kryptering, lifecycle (temporary/ 7 dagar, scans/ 90 dagar) — ej provisionerad
- RDS: separat databas + användare med minsta privilegier —
create-database.sqlfinns 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
- Lösenord: scrypt med OWASP-parametrar
- Refresh-tokens: hashade, roterande, familjeåterkallelse vid återanvändning
- Rate limiting globalt + strikt på auth-endpoints
- Idempotency-nycklar för känsliga POST (tabell finns; aktiveras per route)
- Correlation-ID på alla requests
- Audit log för känsliga åtgärder
- Zod-validering på all indata
- Säkerhetsheaders (nosniff, frame-deny, no-referrer, no-store)
- CORS låst till kända origins
- Hälsodata i egna tabeller, exponeras aldrig via hushålls-endpoints
- Produktion vägrar starta med dev-hemligheter eller AAMOS_MODE=mock
GDPR (spec §56)
- Export:
GET /v1/me/export - Radering:
DELETE /v1/me(cascade + anonymisering) - Samtycken: separata, med tidsstämplar och audit
- Minne: transparent, korrigerbart, pausbart, raderbart
- Träningsdata endast med
anonymized_improvement-samtycke (snapshot per korrigering) - 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)
- 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
- Ingen hälso-/kostdata till reklam – policybeslut, inga annons-SDK:er i appen