- SECURITY.md: Overordnet visjon med lenker til alle manifestfiler - SECURITY_AUDITS.md: Historikk og To-Do liste - RUNBOOK.md: 6 operasjonelle scenarier (ukjent bruker, eksponert secret, 401/403, 50x, VPC-SC, BinAuthz) - INCIDENT_RESPONSE.md: PICERL-modell med eskaleringsmatrise - SECRET_MANAGEMENT.md: Policy + lokal utvikling - ACCESS_CONTROL.md: IAM-policy med service account-oversikt - COMPLIANCE.md: TYR, Binary Auth, KMS-attestasjon Opprydding: - Slettet sensitive filer (test_secret.txt, final-secret-test.txt, tyr/certs/ca_password.txt) - Slettet engangsskript og midlertidige filer - Oppdatert .gitignore med *.txt
11 KiB
OSVxCC Runbook
Dette dokumentet beskriver operasjonelle prosedyrer for å håndtere varsler og verifisere systemstatus. Målet er å raskt avklare om en hendelse er reell eller en falsk positiv.
Innholdsfortegnelse
- Varsel: "Ukjent bruker" Git Push
- Hendelse: Eksponert Hemmelighet
- Hendelse: Høy andel HTTP 401/403 på Cloud Run
- Hendelse: HTTP 50x (Cloud Run nede)
- Hendelse: VPC Service Controls blokkerer tilgang
- Hendelse: Cloud Build / Binary Authorization feiler deploy
1. Varsel: "Ukjent bruker" Git Push
Symptom
Chat-applikasjonen (f.eks. Slack, Discord) rapporterer gjentatte Git-pushes fra en "ukjent bruker" eller en generisk app-bruker (f.eks. "CodeOSS-push, App"). Aktiviteten skjer ofte på faste tidspunkter (f.eks. 09:00 og 21:00).
Undersøkelsesprosedyre
Følg disse stegene for å verifisere aktiviteten:
-
Sjekk Git-loggen umiddelbart.
git log -n 10 --pretty=format:"%h %an <%ae> %ar: %s"- Se etter: Er de siste comittene fra en kjent og autorisert bidragsyter (f.eks.
Chris Christiansen <chris.christiansen@vauco.no>)?
- Se etter: Er de siste comittene fra en kjent og autorisert bidragsyter (f.eks.
-
Analyser tidspunkt og innhold.
- Spørsmål: Samsvarer tidspunktene med normalt utviklingsarbeid? Er commit-meldingene og filendringene logiske?
-
Verifiser webhook-konfigurasjon.
- Undersøk: Sjekk innstillingene for webhooken i Gitea/GitHub og i chat-applikasjonen. Ofte kan webhooks være konfigurert slik at de ikke klarer å mappe den tekniske brukeren til et visningsnavn, og faller tilbake på et generisk navn.
-
Kontroller automatiserte systemer (for å utelukke dem).
- Sjekk Cloud Build-triggere, cron-jobs på VM-en, og eventuelle lokale Git hooks for uventet aktivitet.
Konklusjon (Mest sannsynlig)
Ingen sikkerhetshendelse. Aktiviteten er høyst sannsynlig legitimt utviklingsarbeid utført av en autorisert bruker via en IDE (som VS Code) sin Git-integrasjon. "Ukjent bruker"-navnet er et resultat av hvordan webhooken tolker og presenterer hendelsen.
Status
✅ Avklart — Falsk positiv. Ingen tiltak er nødvendig med mindre git log viser ukjente forfattere.
2. Hendelse: Eksponert Hemmelighet
Symptom
En hemmelighet (API-nøkkel, passord, tjenestenøkkel) er oppdaget på et usikret sted. Eksempler:
- Limt inn i en offentlig chat (Slack, Discord).
- Sjekket inn i Git og pushet til Gitea/GitHub.
- Hardkodet i en offentlig tilgjengelig fil.
Dette er en KRITISK hendelse.
Undersøkelsesprosedyre (PICERL-fasene)
Fase 1: Containment (Innkapsling) - UMIDDELBART
- Roter hemmeligheten umiddelbart. Dette er det viktigste steget for å stoppe misbruk.
- Generer en ny verdi for hemmeligheten.
- Opprett en ny versjon i Secret Manager med den nye verdien. Se
docs/SECRET_MANAGEMENT.mdfor detaljerte kommandoer.# Eksempel for mcp-server-key printf "<NY_HEMMELIG_VERDI>" | gcloud secrets versions add mcp-server-key --data-file=- - Oppdater applikasjonen(e) som bruker hemmeligheten til å peke mot den nye versjonen (
latest). For Cloud Run, deploy en ny revisjon med den oppdaterte hemmelighetsreferansen. - Deaktiver den gamle versjonen i Secret Manager. Ikke slett den ennå. Dette fungerer som en "kill switch".
gcloud secrets versions disable <GAMMEL_VERSJON> --secret=<HEMMELIGHETENS_NAVN>
Fase 2: Eradication (Utryddelse)
- Fjern hemmeligheten fra eksponeringsstedet.
- Git: Bruk et verktøy som
git-filter-repoellerBFG Repo-Cleanerfor å fjerne hemmeligheten fra hele Git-historikken. En vanliggit commiter ikke nok.- Referanse: Den tidligere hendelsen med
mcp-server-key(sedocs/SECURITY_AUDITS.md).
- Referanse: Den tidligere hendelsen med
- Slack/Chat: Slett meldingen.
- Filer: Fjern hemmeligheten fra filen og deploy på nytt.
- Git: Bruk et verktøy som
Fase 3: Recovery & Lessons Learned
- Analyser logger. Sjekk Secret Manager audit logs for å se om den eksponerte hemmeligheten ble aksessert av uautoriserte IP-adresser eller tjenestekontoer.
- Naviger til
Logging > Log Exploreri Cloud Console. - Query:
resource.type="gcp_secret" protoPayload.methodName="AccessSecretVersion" protoPayload.resourceName="projects/.../secrets/<HEMMELIGHETENS_NAVN>/versions/<GAMMEL_VERSJON>"
- Naviger til
- Verifiser at alle systemer fungerer med den nye hemmeligheten.
- Destruer den gamle versjonen i Secret Manager etter en verifikasjonsperiode (f.eks. 24-48 timer).
- Dokumenter hendelsen og diskuter hvordan det skjedde for å forhindre gjentakelse.
Status
🔴 KRITISK TIL AVKLART. Følg prosedyren til alle steg er fullført.
3. Hendelse: Høy andel HTTP 401/403 på Cloud Run
Symptom
Cloud Monitoring-varsler rapporterer en unormalt høy andel av HTTP-responser med statuskode 401 (Unauthorized) eller 403 (Forbidden) fra MCP-serveren (opax-mcp).
Undersøkelsesprosedyre
- Analyser kildene.
- Gå til
Logging > Log Exploreri Cloud Console. - Kjør en spørring for å gruppere 401/403-feil etter kilde-IP.
resource.type="cloud_run_revision" resource.labels.service_name="opax-mcp" httpRequest.status IN (401, 403) - Se i loggene etter
jsonPayload.remoteIp.
- Gå til
- Skill mellom angrep og feilkonfigurasjon.
- Brute-force/Scanning: Ser du mange forespørsler fra én eller få IP-adresser som ikke er gjenkjennelige? Dette kan tyde på et angrepsforsøk. Vurder å blokkere IP-en midlertidig med Cloud Armor.
- Feilkonfigurert klient: Ser du forespørsler fra kjente IP-adresser (f.eks. andre VM-er i prosjektet)? Dette tyder på at en legitim klient bruker en utdatert eller feilaktig hemmelighet (
X-MCP-Secret). - Mønster: Er feilene sporadiske eller konstante? Konstante feil fra en kjent klient indikerer nesten alltid en konfigurasjonsfeil hos klienten.
Konklusjon (Mest sannsynlig)
- Scenario A (Ukjent IP): Potensielt sikkerhetsproblem (scanning). Overvåk og vurder blokkering.
- Scenario B (Kjent IP): Operasjonell feil. Informer eieren av klienten om å oppdatere sin hemmelighet.
Status
🟡 MODERAT TIL AVKLART.
4. Hendelse: HTTP 50x (Cloud Run nede)
Symptom
Cloud Monitoring varsler om en høy andel HTTP 5xx-feil, eller tjenesten svarer ikke. Dette indikerer at containeren krasjer eller ikke starter.
Undersøkelsesprosedyre
- Sjekk container-logger for krasj.
- Gå til
Cloud Run > opax-mcp > Logs. - Se etter meldinger som indikerer at prosessen stoppet uventet, f.eks.
panic,out of memory, eller andre unntak ved oppstart.
- Gå til
- Verifiser IAM-tilganger (spesielt til Secret Manager).
- Gå til
Cloud Run > opax-mcp > Revisions. - Sjekk hvilken Service Account som brukes (skal være
jason-vauger@...). - Gå til
IAM & Admin > IAM. - Verifiser at
jason-vauger@...har rollenroles/secretmanager.secretAccessor. - Vanlig feil: Hvis applikasjonen ikke får hentet
mcp-server-keyved oppstart på grunn av manglende IAM-tilgang, vil den ofte krasje med en 5xx-feil.
- Gå til
- Analyser nylige endringer.
- Har det vært en nylig deployering? Rull tilbake til en tidligere, fungerende revisjon via
Cloud Run > opax-mcp > Manage Revisionsfor å se om problemet vedvarer.
- Har det vært en nylig deployering? Rull tilbake til en tidligere, fungerende revisjon via
Konklusjon (Mest sannsynlig)
- Oftest er dette enten en bug i koden (som fører til krasj) eller en IAM/Secret Manager-konfigurasjonsfeil.
Status
🔴 KRITISK TIL AVKLART.
5. Hendelse: VPC Service Controls blokkerer tilgang
Symptom
En applikasjon, et skript eller en utvikler mottar en 403 Request Prohibited by organization's policy feil ved kall mot en GCP API (f.eks. BigQuery, Storage) som er beskyttet av en VPC-SC perimeter.
Undersøkelsesprosedyre
- Finn VPC-SC brudd-loggen.
- Gå til
Logging > Log Explorer. - Bruk følgende spørring for å finne de relevante loggene:
log_id("cloudaudit.googleapis.com/activity") protoPayload.metadata.violationReason = "SERVICE_NOT_ALLOWED_FROM_VPC" OR "NO_MATCHING_ACCESS_LEVEL"
- Gå til
- Analyser logg-detaljene.
resource.labels.project_id: Hvilket prosjekt skjedde bruddet i?protoPayload.authenticationInfo.principalEmail: Hvem eller hva ble blokkert?protoPayload.requestMetadata.callerIp: Hvor kom kallet fra (hvis relevant)?protoPayload.resourceName: Hvilken beskyttet ressurs var målet?
Konklusjon (Mest sannsynlig)
- Scenario A (Legitimt kall blokkert): En ny tjeneste eller utvikler-VM er satt opp utenfor perimeteren og trenger tilgang. Tiltak: Vurder å inkludere ressursen i perimeteren, eller opprett et tilgangsnivå (Access Level).
- Scenario B (Uventet kall blokkert): Et uautorisert skript eller en ekstern tjeneste prøver å nå en beskyttet ressurs. Konklusjon: Perimeteren har fungert som designet og forhindret et potensielt datainnbrudd.
Status
🟡 MODERAT TIL AVKLART. Krever analyse for å skille mellom feilkonfigurasjon og reell beskyttelse.
6. Hendelse: Cloud Build / Binary Authorization feiler deploy
Symptom
En Cloud Build-pipeline feiler på det siste "deploy to Cloud Run"-steget. Feilmeldingen nevner Binary Authorization eller attestation.
Undersøkelsesprosedyre
- Sjekk bygge-loggen for TYR-feil.
- Åpne loggen for den feilede builden i Cloud Build.
- Scroll opp til steget som kjører TYR Compliance Scan.
- Hvis dette steget feilet (rødt ikon), vil loggen inneholde detaljer om nøyaktig hvilken compliance-regel som ble brutt.
- Verifiser at attestering finnes.
- Hvis TYR-steget var vellykket, men deploy likevel feiler, kan selve attesteringen mangle.
- Finn "digest" for ditt image i loggen (en lang
sha256:...streng). - Kjør denne kommandoen i Cloud Shell:
gcloud container binauthz attestations list --artifact-url="[REGION]-docker.pkg.dev/[PROJECT_ID]/[REPO]/[IMAGE_NAME]@[IMAGE_DIGEST]"
Konklusjon (Mest sannsynlig)
- TYR-feil: Den vanligste årsaken. En endring i koden eller infrastrukturen bryter med en definert sikkerhetsregel. Tiltak: Rett feilen som TYR rapporterer.
- Manglende attestering: Output fra
gclouder tomt. Dette kan skyldes en midlertidig feil med KMS eller at IAM-rettighetene til Cloud Build sin service account er feil. Tiltak: Prøv å kjøre builden på nytt. Hvis feilen vedvarer, sjekk IAM forcloud-build-private-pool@....
Status
🟡 MODERAT TIL AVKLART. Vanligvis en operasjonell feil forårsaket av en compliance-endring.