Files
Cibello-app/infrastructure/security/hardening-checklist.md
T
Sven (AAMOS AI) c32a7e33c7
CI / Typecheck, test & build (push) Failing after 2s
ci: trigga på master + formatfix inför Gitea Actions
2026-08-13 17:25:14 +07:00

2.9 KiB
Raw Blame History

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>-platformej provisionerad (/opt tom)
  • Secrets i /opt/<slug>-platform/secrets/*.env, ägare <slug>, chmod 600 — ej provisionerad
  • 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 <slug>-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
  • 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

  • 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