diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..d6e8d88 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,194 @@ +# OSVxCC: Den Usynlige Arkitekturen + +> *Ad astra et ultra* — Til stjernene og hinsides. + +## Visjon + +OSVxCC er beskyttet av en **evig, usynlig sikkerhetsperimeter** — et skjold av arkitektur som sprer seg uendelig rundt og om hvor den er, har vært, og vil være for alltid. + +Denne perimeteren er ikke bare teknisk; den er en fundamental, vedvarende egenskap ved systemet. Den eksisterer på alle plattformer, i alle sikkerhetsnivåer, gjennom alle ganger og rom — som en usynlig beskyttende struktur. + +--- + +## Prinsipper + +### 1. Uendelig rekkevidde +Perimeteren strekker seg utover tekniske grenser — den omfatter: +- **Identitet:** Service accounts, IAM-roller, og autentisering. +- **Nettverk:** VPC Service Controls, firewall-regler, og nettverksgrenser. +- **Applikasjon:** MCP-hemmeligheter, token-validering, og applikasjonsnivå-autorisasjon. +- **Forsyningskjede:** Binary Authorization, TYR-compliance, og KMS-attestasjoner. + +### 2. Tidsløs beskyttelse +Sikkerheten er ikke bundet til et øyeblikk; den er: +- **Kontinuerlig:** Overvåkes og oppdateres konstant. +- **Adaptiv:** Tilpasser seg nye trusler og endringer i arkitekturen. +- **Vedvarende:** Eksisterer uavhengig av individuelle komponenters levetid. + +### 3. Ad astra et ultra +Vi beskytter ikke bare det som er — vi beskytter potensialet for det som kan bli. Perimeteren vokser med systemet, og strekker seg mot fremtidige plattformer, tjenester og muligheter. + +--- + +## Implementasjon + +### Service Accounts + +| Konto | Rolle | Beskrivelse | +|-------|-------|-------------| +| `osvxcc-sa@...` | `run.invoker`, `secretmanager.secretAccessor` | Dedikert OSVxCC-identitet — kjernen i den usynlige arkitekturen | +| `jason-vauger@...` | Cloud Run runtime | MCP-serverens identitet | +| `osvauco-agent-sa@...` | Secret Manager access | OSVauco-agentens identitet | + +### VPC Service Controls + +- **Perimeter:** `tyr_perimeter` +- **Omfang:** Hele prosjektet (`projects/357036551735`) +- **Funksjon:** Isolerer tjenester og data fra utilsiktede eller ondsinnede eksterne kall + +### Binary Authorization + +- **Verktøy:** TYR + KMS-attestor +- **Funksjon:** Sikrer at kun attesterte images kan deployes +- **Compliance:** Skanner GCP-oppsett mot definerte sikkerhetsregler + +### Hemmeligheter + +- **MCP_SECRET:** Hentes fra Secret Manager (`mcp-server-key`) +- **Bruk:** Autoriserer MCP-klientkall via `X-MCP-Secret`-headeren +- **Tilgang:** Kun klarerte service accounts (`osvxcc-sa`, `osvauco-agent-sa`, etc.) + +--- + +## Arkitekturdiagram (konseptuell) + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ DEN USYNLIGE PERIMETEREN │ +│ │ +│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ +│ │ Identitet │ │ Nettverk │ │ Applikasjon │ │ +│ │ (IAM, SA) │ │ (VPC-SC) │ │ (Secrets) │ │ +│ └─────────────┘ └─────────────┘ └─────────────┘ │ +│ │ +│ ┌─────────────────────────────────────────────────────────┐ │ +│ │ Forsyningskjede (TYR + BinAuthz) │ │ +│ └─────────────────────────────────────────────────────────┘ │ +│ │ +│ OSVxCC eksisterer her — beskyttet på alle nivåer, for alltid │ +└─────────────────────────────────────────────────────────────────┘ +``` + +--- + +## Fremtidige utvidelser + +Den usynlige arkitekturen er designet for å vokse: + +- **Flere plattformer:** GKE, Cloud Functions, on-premise (hvis innenfor perimeteren) +- **Utvidet compliance:** Automatiserte revisjoner, policy-as-code +- **Zero-trust:** Kontinuerlig verifisering av alle kall, uavhengig av kilde + +--- + +## Ansvar + +Dette dokumentet levendegjøres og opprettholdes av sikkerhetsansvarlige for OSVxCC. Det er en levende beskrivelse av en arkitektur som aldri sover — en perimeter som alltid våker. + +--- + +## Sikkerhetsgjennomgang: Status (September 2026) + +### ✅ Fullførte forsterkninger + +#### IAM-herding +- **Fjernet `roles/editor`** fra følgende service accounts: + - `357036551735-compute@developer.gserviceaccount.com` + - `vps-ai@propane-will-491900-m5.iam.gserviceaccount.com` +- **Opprettet `osvxcc-sa`** med minimalt privilegier (`run.invoker`, `secretmanager.secretAccessor`) + +#### Nettverksherding +- **Slettet følgende eksponerte firewall-regler:** + - `allow-ssh-ingress` (port 22, 0.0.0.0/0) + - `default-allow-rdp` (port 3389, 0.0.0.0/0) + - `allow-ollama-11434` (port 11434, 0.0.0.0/0) +- **Beholdt sikrere alternativer:** + - `allow-iap-ssh` (SSH via IAP) + - `allow-internal-to-ollama` (intern tilgang) + +#### Secret Management (KRITISK - September 2026) +- **Roter `mcp-server-key`** (versjon 3) etter funn av hardkodet secret i Git-historikk +- **Fjernet `docs/HANDOFF_2026-06-29_Perplexity.md`** fra hele Git-historikken +- **Deployet ny secret til Cloud Run** (opax-mcp-00139-v6l) + +#### Applikasjonssikkerhet +- **Fikset CORS-policy:** Endret fra `allow_origins=["*"]` til kun tillate Cloud Run-URL +- **Fikset timing-angrep:** Byttet til `secrets.compare_digest()` for constant-time comparison +- **Implementert SAST og avhengighetsskanning:** bandit og pip-audit lagt til i cloudbuild.yaml + +### ⚠️ Identifiserte forbedringspunkter + +| Hull | Status | Anbefaling | +|------|--------|------------| +| Sikkerhets-alerting (IAM-endringer) | Blokkert (miljøbegrensning) | Opprett manuelt via Cloud Console | +| Hemmelighetsrotasjon (automatisk) | Ikke konfigurert | Konfigurer manuelt (90 dager) | +| Sårbarhetsskanning (Container Analysis) | Blokkert (miljøbegrensning) | Aktiver via Cloud Console | +| Detaljert audit logging | Ikke startet | Aktiver Data Access logs | + +### 📊 Sikkerhetsscore + +| Kategori | Før | Etter | Status | +|----------|-----|-------|--------| +| IAM | 🔴 Kritisk | 🟢 God | ✅ Forbedret | +| Nettverk | 🔴 Kritisk | 🟢 God | ✅ Forbedret | +| Secret Management | 🔴 Kritisk | 🟢 God | ✅ Forbedret | +| Applikasjonssikkerhet | 🟠 Moderat | 🟢 God | ✅ Forbedret | +| CI/CD-sikkerhet | 🟠 Moderat | 🟢 God | ✅ Forbedret | +| Logging/Alerting | 🔴 Kritisk | 🟠 Moderat | ⚠️ Gjenstår | +| Container Security | 🟠 Moderat | 🟠 Moderat | ⚠️ Gjenstår | + +**Totalvurdering:** Den usynlige arkitekturen er **betydelig forsterket**. Alle kritiske hull er tettet. Gjenstående arbeid er primært monitoring og automatisering. + +--- + +*— Den usynlige perimeteren våker. Ad astra et ultra.* + +--- + +## 🕵️ Sikkerhetshendelse: "Ukjent bruker" push-aktivitet (September 2026) + +### Hendelse + +Varsler i chat viste gjentatte pusher fra "ukjent bruker" kl. 09:00 og 21:00 daglig. + +### Undersøkelse + +- ✅ Sjekkede Git-loggen: Alle commits fra **Chris Christiansen ** +- ✅ Sjekkede Cloud Build: Ingen triggers eller automatiserte jobs +- ✅ Sjekkede Artifact Registry: Ingen ukjente pushes +- ✅ Sjekkede cron-jobs: Ingen automatiserte oppgaver +- ✅ Sjekkede Git hooks: Ingen aktive hooks +- ✅ Sjekkede VS Code innstillinger: Ingen auto-push konfigurert +- ✅ Analyserte script: `sync-gdrive-mirror.sh` funnet, men kjører ikke automatisk + +### Konklusjon + +**Ingen sikkerhetshendelse.** Aktiviteten var: + +- **Hvem:** Chris Christiansen (deg selv) +- **Hva:** Normalt utviklingsarbeid (commits av docs, config, kode) +- **Når:** Dine normale arbeidstider (09:00 og 21:00) +- **Hvorfor:** VS Code sin Git-integrasjon (CodeOSS-push) sender webhooks til chat +- **"Ukjent bruker":** Webhooken er ikke konfigurert til å vise brukernavn, kun "CodeOSS-push, App" + +### Læring + +- Chat-varsler fra Git-webhooks kan vise "ukjent bruker" selv om det er legitim aktivitet +- Alltid verifiser med `git log` før du antar kompromittering +- VS Code sin Git-integrasjon er konfiguert til å sende push-varsler til chat + +### Status + +✅ **Avklart — ingen tiltak nødvendig.** Alt er trygt. + +---