From 714d0a2e5b09dc2cc7d3979dda084bcbd937d54a Mon Sep 17 00:00:00 2001 From: "Sven (AAMOS AI)" Date: Tue, 11 Aug 2026 07:30:50 +0700 Subject: [PATCH] =?UTF-8?q?docs(security):=20genomg=C3=A5ng=20av=20hardeni?= =?UTF-8?q?ng-checklist=20inf=C3=B6r=20prod?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../security/hardening-checklist.md | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/infrastructure/security/hardening-checklist.md b/infrastructure/security/hardening-checklist.md index 69eb6aa..bcb452b 100644 --- a/infrastructure/security/hardening-checklist.md +++ b/infrastructure/security/hardening-checklist.md @@ -2,19 +2,19 @@ ## Server (steg 1, befintlig maskin) -- [ ] Dedikerad Linux-användare `` (från brand.config.json) utan sudo; äger `/opt/-platform` -- [ ] Secrets i `/opt/-platform/secrets/*.env`, ägare ``, chmod 600 -- [ ] Docker-containrar kör som non-root (Dockerfiles gör detta) -- [ ] API exponeras endast på 127.0.0.1 bakom reverse proxy med TLS (API-domän ur brand.config.json) -- [ ] Brandvägg: endast 80/443 inåt; Redis/Postgres nås aldrig utifrån -- [ ] Automatiska säkerhetsuppdateringar (unattended-upgrades) +- [ ] 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 -- [ ] S3: block public access, SSE-S3-kryptering, lifecycle (temporary/ 7 dagar, scans/ 90 dagar) -- [ ] RDS: separat databas + användare med minsta privilegier (create-database.sql) -- [ ] Secrets Manager/SSM för produktionshemligheter (steg 2) +- [ ] 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 @@ -39,5 +39,5 @@ - [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 +- [ ] Personuppgiftsbiträdesavtal med AWS + AAMOS-drift — *ej på plats* - [x] Ingen hälso-/kostdata till reklam – policybeslut, inga annons-SDK:er i appen