En sårbarhet i Linux-kjernen kalt CVE-2026-46300, med kallenavnet “Fragnesia”, tvang i sommer Google til å sende ut hastebulletiner for Google Kubernetes Engine (GKE). Feilen lar en angriper som allerede har fått lov til å opprette pods, bryte ut av containeren og ta over nodens vertsoperativsystem. Det er nøyaktig den typen hendelse som viser hvorfor container-sikkerhet i Kubernetes ikke lenger er noe man skrur på i etterkant. Denne guiden tar deg gjennom 12 konkrete steg, fra image-scanning til runtime-deteksjon, og bygger et fullstendig sikkerhetsoppsett du kan bruke i produksjon.
Du får et testmiljø med Kind, skanning av images med Trivy, CVSS-terskler i CI/CD med Docker Scout, herdet RBAC, håndhevet Pod Security Admission, nettverkspolicyer med default-deny, kryptering av hemmeligheter, og runtime-overvåkning med Falco. Alt er testet mot Kubernetes 1.34–1.36, som er versjonene de fleste norske og nordiske klynger kjører i 2026 etter at 1.30 gikk End of Life 15. juli 2025.
Guiden er skrevet for deg som drifter Kubernetes i produksjon, enten det er en egendrevet klynge på Hetzner eller On-Prem-utstyr, eller en administrert tjeneste som GKE, AKS eller EKS. Stegene er plattformuavhengige der det er mulig, med noter der skyleverandøren din krever noe annet. Du trenger ikke å implementere alt på én dag. Se guiden som en prioritert liste: start med image-scanning og RBAC, siden de gir mest sikkerhet per time investert, og jobb deg videre derfra.
Hvorfor container-sikkerhet i Kubernetes haster nå
Kubernetes har blitt standardplattformen for containeriserte arbeidslaster i nordiske virksomheter, men det gjør plattformen til et mer attraktivt mål samtidig. Angrepsflaten strekker seg fra selve container-imaget, via klyngens kontrollplan, til nettverket mellom pods og hemmelighetene appene dine bruker. Når noe går galt, går det ofte raskt: Fragnesia-sårbarheten rammer node-images bygget på Container-Optimized OS, og Google anbefaler eksplisitt å oppgradere nodegrupper til patchede versjoner som 1.36.0-gke.3545000 og 1.35.6-gke.1039000.
Det er ikke bare kjernefeil som truer. Tidlig i 2026 dukket det opp en privilegie-eskaleringssvakhet i selve API-serveren som lot autentiserte brukere oppnå cluster-admin-rettigheter under gitte konfigurasjoner. Klynger som fortsatt kjørte Kubernetes 1.28–1.30 var særlig utsatt, noe som forsterker poenget om at oppgradering er en sikkerhetskontroll i seg selv, ikke bare vedlikehold. Container runtime er heller ikke unntatt: containerd-versjoner eldre enn 1.7.15 hadde en svakhet som kunne gi container-utbrudd til verten.
Den gode nyheten er at forsvaret har modnet like mye som truslene. En fersk “State of Container Security”-undersøkelse fra 2026 viser at de fleste virksomheter nå kjører containere i produksjon, har image-scanning i CI, og har minst én runtime-sikkerhetskontroll på plass. Falco, Tracee og kommersielle eBPF-baserte verktøy gir i dag nok telemetri til at de fleste team kan bygge reelle deteksjonsprogrammer uten å skrive egen kjernekode. Denne guiden viser deg nøyaktig hvordan.
Verdt å nevne er at ingen av kontrollene under er nye oppfinnelser. RBAC, nettverkspolicyer og Pod Security Admission har eksistert i Kubernetes i årevis. Det som er nytt i 2026 er hvor mye raskere angripere går fra offentliggjort CVE til fungerende utnyttelse, og hvor mange klynger som fortsatt mangler grunnleggende herding fordi teamet aldri fikk satt av tid til å gjøre det etter at klyngen først kom i drift. Denne guiden er skrevet for å rette akkurat det, med konkrete kommandoer du kan kopiere inn i terminalen din i dag.
Forutsetninger: dette trenger du før du starter
Du trenger ikke en produksjonsklynge for å følge denne guiden, et lokalt testmiljø holder for alle stegene. Sørg for at følgende verktøy er installert før du starter:
- Docker Engine eller Docker Desktop (siste stabile versjon)
- kubectl versjon som matcher klyngen din, minimum 1.30, anbefalt 1.34 eller nyere
- Kind (Kubernetes in Docker) for lokalt testmiljø
- Helm 3, for installasjon av Falco og andre sikkerhetsverktøy
- Trivy CLI (Aqua Security sitt skanneverktøy for images og klynger)
- Tilgang til en container-registry, for eksempel Docker Hub eller et privat registry
- Minst 8 GB RAM og 20 GB ledig diskplass på maskinen du tester på
- Grunnleggende kjennskap til YAML og kubectl-kommandoer
Sett av rundt 45 minutter til å gå gjennom alle 12 stegene i praksis, litt mer hvis du vil eksperimentere med egne Falco-regler underveis. Kjør alltid disse stegene i et test- eller staging-miljø først. Å håndheve RBAC og nettverkspolicyer i en produksjonsklynge uten testing kan stoppe trafikk du ikke visste var avhengig av de gamle, åpne reglene.
Steg 1: Sett opp et sikkert Kubernetes-testmiljø med Kind
Start med en lokal klynge du trygt kan eksperimentere i. Kind lager en flernode Kubernetes-klynge inne i Docker-containere, noe som gjør det raskt å tilbakestille miljøet hvis noe går galt.
# Installer Kind (Linux)
curl -Lo ./kind https://kind.sigs.k8s.io/dl/latest/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind
# Opprett en klynge med tre noder
cat <
Forventet utskrift ser omtrent slik ut:
Kubernetes control plane is running at https://127.0.0.1:XXXXX
CoreDNS is running at https://127.0.0.1:XXXXX/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
Creating cluster "sikker-klynge" ...
✓ Ensuring node image (kindest/node:v1.34.x) 🖼
✓ Preparing nodes 📦 📦 📦
✓ Writing configuration 📜
✓ Starting control-plane 🕹️
✓ Installing CNI 🔌
✓ Installing StorageClass 💾
✓ Joining worker nodes 🚜
Merk versjonsnummeret i node-imaget. Kubernetes 1.30 gikk End of Life 15. juli 2025 og mottar ikke lenger sikkerhetsoppdateringer, så bruk et Kind-versjonsflagg som gir deg 1.34 eller nyere. Store skyleverandører har allerede beveget seg videre: Azure Kubernetes Service (AKS) satte 1.35 til generelt tilgjengelig i mars 2026 og 1.36 i juni 2026, mens 1.37 er ventet i oktober 2026.
Steg 2: Kartlegg de fire C-ene i Kubernetes-sikkerhet
Før du begynner å herde enkeltkomponenter, hjelper det å ha en mental modell. Sikkerhetsmiljøet rundt Kubernetes bruker gjerne modellen med fire lag, ofte kalt "de fire C-ene": Cloud (den underliggende infrastrukturen), Cluster (selve Kubernetes-klyngen), Container (image og runtime), og Code (applikasjonskoden din). Hvert lag beskytter laget innenfor, men et hull i et ytre lag kan gi angriperen fotfeste til å angripe de indre.
Denne guiden fokuserer mest på Container- og Cluster-lagene, siden det er der de fleste teamene har størst gap. Cloud-laget dekkes normalt av skyleverandørens delte ansvarsmodell, mens Code-laget krever egne verktøy for statisk kodeanalyse. Hold denne modellen i bakhodet gjennom resten av stegene: hver kontroll du setter opp hører hjemme i ett eller flere av disse fire lagene.
Det er lett å tenke at man er "ferdig" med et lag når man har satt opp én kontroll der, men i praksis overlapper lagene. Et default-deny NetworkPolicy hører til Cluster-laget, men beskytter i realiteten mot at en sårbarhet i Code-laget, altså en feil i applikasjonen din, kan utnyttes til å bevege seg videre i nettverket. Tenk på lagene som forsvarslinjer som skal fungere selv om ett av de andre laget svikter, ikke som fire uavhengige oppgaver du krysser av én etter én.
Steg 3: Skann container-images med Trivy før de når klyngen
Trivy er et gratis, åpen kildekode-skanneverktøy fra Aqua Security som identifiserer sårbarheter og feilkonfigurasjoner i images, filsystemer og Kubernetes-ressurser. Det er lettvekts, enkelt å integrere via CLI, og gir en alvorlighetsgradert liste over kjente CVE-er. Trivy gjør ingen runtime-inspeksjon, det er et bygge-tids verktøy, så det dekker bare halve bildet alene.
# Installer Trivy
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin
# Skann et image
trivy image nginx:1.27-alpine
# Skann kun HIGH og CRITICAL, feil ut hvis noe finnes
trivy image --severity HIGH,CRITICAL --exit-code 1 nginx:1.27-alpine
# Skann selve klyngen for feilkonfigurasjoner
trivy k8s --report summary cluster
Eksempel på utskrift fra en imageskanning:
nginx:1.27-alpine (alpine 3.20.3)
=================================
Total: 3 (HIGH: 2, CRITICAL: 1)
┌──────────┬────────────────┬──────────┬────────┬───────────────┬─────────────────┐
│ Library │ Vulnerability │ Severity │ Status │ Installed Ver. │ Fixed Version │
├──────────┼────────────────┼──────────┼────────┼───────────────┼─────────────────┤
│ libcrypto│ CVE-2026-XXXXX │ CRITICAL │ fixed │ 3.3.1-r0 │ 3.3.2-r0 │
│ libssl │ CVE-2026-XXXXX │ HIGH │ fixed │ 3.3.1-r0 │ 3.3.2-r0 │
│ busybox │ CVE-2025-XXXXX │ HIGH │ fixed │ 1.36.1-r29 │ 1.36.1-r30 │
└──────────┴────────────────┴──────────┴────────┴───────────────┴─────────────────┘
Legg trivy image --exit-code 1 inn i CI-pipelinen din slik at bygg med kritiske sårbarheter stoppes automatisk før de når registryet. Kombiner dette med Trivy sin Kubernetes-modus, som også kan skanne manifester og oppdage eksponerte hemmeligheter og policy-brudd direkte i klyngen, ikke bare i imaget.
Trivy kan også generere en SBOM (Software Bill of Materials) i CycloneDX- eller SPDX-format med trivy image --format cyclonedx -o sbom.json nginx:1.27-alpine. Lagre denne artifakten sammen med resten av bygget. Neste gang en ny kritisk CVE dukker opp i en populær pakke, kan du søke gjennom lagrede SBOM-er for å finne ut hvilke images som faktisk er berørt, i stedet for å skanne alt på nytt og vente på resultatet.
Steg 4: Sett CVSS-terskler med Docker Scout i CI/CD
Docker Scout analyserer images og kobler CVE-er til CVSS-score, der 9,0–10,0 klassifiseres som Critical. Der Trivy gir deg en rask liste, gir Scout deg mer kontekst om hvilke sårbarheter som faktisk er utnyttbare i din avhengighetskjede, noe som er nyttig når du skal prioritere hva som må rettes først.
# Aktiver Docker Scout
docker scout quickview nginx:1.27-alpine
# Analyser og sett en CVSS-terskel i CI
docker scout cves nginx:1.27-alpine \
--only-severity critical,high \
--exit-code
# Sammenlign to images for å se om en oppdatering løser sårbarheter
docker scout compare nginx:1.26-alpine --to nginx:1.27-alpine
Sett opp en enkel gate i pipelinen din: bygg som inneholder images med CVSS-score over 9,0 blokkeres automatisk fra å nå produksjonsregistryet. Dette er en av de mest kostnadseffektive kontrollene du kan innføre, fordi den fanger problemer minutter etter at koden er skrevet, ikke uker etter at den er i drift.
Start med en mild terskel, for eksempel bare Critical, og stram inn gradvis etter hvert som teamet blir vant til å rydde opp i funn før merge. Setter du terskelen for strengt fra dag én, ender du fort opp med at utviklere legger inn unntak for å komme forbi sjekken i stedet for å faktisk fikse sårbarhetene, og da har kontrollen mistet hele poenget sitt.
Steg 5: Herd RBAC og fjern standard service-accounts
Role-Based Access Control (RBAC) er sannsynligvis det enkeltverktøyet som stopper flest reelle angrep, fordi det begrenser hva en kompromittert pod faktisk kan gjøre videre i klyngen. Standardoppsettet i mange klynger gir imidlertid pods automatisk tilgang til default service-account, som ofte har mer tilgang enn nødvendig. Google sin bulletin om Fragnesia-sårbarheten peker konkret på at retten til å opprette pods er et sentralt angrepsvektor, og anbefaler å begrense create pods-rettigheten til betrodde brukere frem til alle noder er patchet.
# Deaktiver automatisk token-montering på default service-account
kubectl patch serviceaccount default \
-n produksjon \
-p '{"automountServiceAccountToken": false}'
# Opprett en dedikert, minimal service-account for én app
kubectl create serviceaccount betaling-app -n produksjon
# Definer en rolle med kun de rettighetene appen faktisk trenger
cat <
Regelen bør være: én dedikert service-account per arbeidslast, aldri standardkontoen, og aldri bredere rettigheter enn appen faktisk bruker. Kjør kubectl auth can-i --list --as=system:serviceaccount:produksjon:betaling-app jevnlig for å verifisere at kontoen faktisk er begrenset som tiltenkt.
Vær også bevisst på forskjellen mellom Role og ClusterRole. En Role gjelder kun innenfor ett namespace, mens en ClusterRole gjelder på tvers av hele klyngen. Det er en vanlig feil å gripe til ClusterRole fordi det "bare fungerer" uten å tenke over namespace-grenser, når det appen egentlig trenger er tilgang begrenset til sitt eget namespace. Bruk ClusterRole kun når arbeidslasten faktisk må lese ressurser på tvers av flere namespaces, for eksempel en overvåkningsagent.
Steg 6: Håndhev Pod Security Admission med Restricted-profil
Pod Security Admission (PSA) er den offisielle etterfølgeren til det utfasede PodSecurityPolicy-mekanismen, og har vært tilgjengelig siden versjon 1.25. PSA er i dag den anbefalte standarden for å håndheve sikkerhetsprofiler på pod-nivå, med tre nivåer: Privileged, Baseline og Restricted.
# Merk et namespace med Restricted-profilen, håndhevet i praksis
kubectl label namespace produksjon \
pod-security.kubernetes.io/enforce=restricted \
pod-security.kubernetes.io/enforce-version=latest \
pod-security.kubernetes.io/warn=restricted \
pod-security.kubernetes.io/audit=restricted
# Test at en usikker pod faktisk blir avvist
kubectl run test-privilegert --image=nginx \
--overrides='{"spec":{"containers":[{"name":"test","image":"nginx","securityContext":{"privileged":true}}]}}' \
-n produksjon
Hvis policyen er satt riktig opp, avviser klyngen forsøket med en feilmelding i stil med pods "test-privilegert" is forbidden: violates PodSecurity "restricted:latest": privileged (container "test" must not set securityContext.privileged=true). Bygg alle nye namespaces med denne merkingen fra dag én, det er langt vanskeligere å stramme inn etterpå enn å starte strengt.
Steg 7: Isoler pods med nettverkspolicyer og default-deny
Uten NetworkPolicy kan alle pods i en klynge som standard snakke med alle andre pods. Det betyr at en kompromittert frontend-pod fritt kan skanne og nå databaser, interne APIer og betalingstjenester. Løsningen er å starte med en default-deny-regel og deretter åpne opp bare den trafikken applikasjonene faktisk trenger.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-alt
namespace: produksjon
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: tillat-frontend-til-backend
namespace: produksjon
spec:
podSelector:
matchLabels:
app: backend
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 8080
Husk at NetworkPolicy krever en CNI-plugin som faktisk håndhever reglene, for eksempel Calico eller Cilium. Kind bruker som standard kindnet, som ikke håndhever NetworkPolicy, så for å teste dette lokalt må du installere Calico på Kind-klyngen først.
Glem heller ikke egress-regler. De fleste team husker å begrense innkommende trafikk, men glemmer utgående. En kompromittert pod som fritt kan nå internett, kan fortsatt eksfiltrere data eller ringe hjem til en angriperkontrollert server selv om ingressen er strengt låst ned. Legg til en eksplisitt egress-regel som kun tillater DNS-oppslag og trafikk til kjente, nødvendige tjenester, og bygg videre derfra i stedet for å la egress stå åpent som standard.
Steg 8: Krypter hemmeligheter med KMS v2 og etcd-kryptering
Kubernetes Secrets lagres i etcd, og uten kryptering ligger de i klartekst på disk. KMS v2-provideren lar deg kryptere secrets med nøkler forvaltet av en ekstern nøkkeltjeneste, for eksempel AWS KMS, Azure Key Vault eller HashiCorp Vault, i stedet for å stole på lokal disk-kryptering alene.
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
providers:
- kms:
apiVersion: v2
name: ekstern-kms
endpoint: unix:///var/run/kms-provider/socket.sock
timeout: 3s
- identity: {}
Legg denne konfigurasjonen til API-serverens --encryption-provider-config-flagg. Etter aktivering bør du rotere alle eksisterende secrets slik at de faktisk blir kryptert med den nye nøkkelen: kubectl get secrets --all-namespaces -o json | kubectl replace -f - tvinger en omskriving av alle secret-objekter gjennom det nye krypteringslaget.
Hvis du kjører på en administrert tjeneste som GKE, AKS eller EKS, tilbyr alle tre skyleverandørene KMS-integrasjon som en innebygd funksjon du kan slå på uten å konfigurere API-serveren manuelt. Sjekk dokumentasjonen for din spesifikke plattform, siden navnet på funksjonen og aktiveringsmåten varierer. Uansett hvilken vei du velger, er selve prinsippet det samme: nøklene som krypterer secrets skal aldri ligge lagret sammen med selve klyngen, de skal forvaltes av en separat tjeneste med eget tilgangskontrollregime.
Steg 9 og 10: Installer Falco og skriv egne runtime-regler
Falco er det CNCF-graduerte standardverktøyet for runtime-sikkerhet i containere. Det overvåker kernel-systemkall, i dag typisk via eBPF, og trigger regler som "shell spawned in container" eller "write below /etc". Der Trivy og Docker Scout stopper trusler før deploy, fanger Falco opp det som skjer etter at en container allerede kjører, inkludert forsøk på å utnytte sårbarheter som Fragnesia i sanntid.
# Installer Falco med Helm
helm repo add falcosecurity https://falcosecurity.github.io/charts
helm repo update
helm install falco falcosecurity/falco \
--namespace falco --create-namespace \
--set driver.kind=ebpf
# Se live-alarmer fra klyngen
kubectl logs -n falco -l app.kubernetes.io/name=falco -f
Eksempel på en Falco-alarm når noen åpner et skall inne i en container:
23:14:02.113881458: Notice A shell was spawned in a container
with an attached terminal (user=root user_loginuid=-1
container_id=8f3a2b1c9d4e container_name=betaling-app
shell=bash parent=runc cmdline=bash
image=produksjon/betaling-app:1.4.0)
priority=Notice rule=Terminal shell in container
Standardreglene dekker mye, men de mest verdifulle deteksjonene kommer ofte fra egne regler tilpasset applikasjonene dine:
- rule: Uventet utgående forbindelse fra betalingstjeneste
desc: Varsler når betaling-app kobler til noe utenfor kjente IP-er
condition: >
outbound and container.image.repository = "produksjon/betaling-app"
and not fd.sip in (kjente_betalings_endepunkter)
output: >
Uventet utgående trafikk fra betalingscontainer
(command=%proc.cmdline connection=%fd.name)
priority: WARNING
Koble Falco-alarmene til Slack, Teams eller din SIEM-løsning via Falcosidekick, slik at varsler faktisk når noen i sanntid i stedet for å forsvinne i logger ingen leser.
Vær forberedt på en periode med støy rett etter installasjon. Standardreglene i Falco er skrevet for å dekke generiske Linux-servere og containere, og vil i starten trigge på helt legitim atferd i applikasjonene dine, for eksempel et deploy-skript som midlertidig åpner et skall for helsesjekker. Sett av den første uken til å gå gjennom alarmene manuelt og enten justere reglene eller legge til unntak for kjent, forventet atferd. Et deteksjonssystem alle ignorerer fordi det roper ulv for ofte, er verdiløst uansett hvor teknisk avansert det er.
Steg 11 og 12: Patch Fragnesia-sårbarheten og automatiser audit-logging
Med kontrollene over på plass gjenstår det viktigste enkeltsteget: hold selve klyngen oppdatert. GKE sin bulletin om CVE-2026-46300 anbefaler å oppgradere nodegrupper til patchede versjoner, blant annet 1.36.0-gke.3545000, 1.35.6-gke.1039000 og 1.30.14-gke.2726000 for de som fortsatt henger igjen på eldre spor. Uansett hvilken skyleverandør du bruker, bør node-oppgradering behandles som en sikkerhetsoppgave med egen SLA, ikke en vedlikeholdsjobb som skyves ut.
# Sjekk hvilken versjon nodene dine kjører
kubectl get nodes -o custom-columns=NAME:.metadata.name,VERSION:.status.nodeInfo.kubeletVersion
# Aktiver audit-logging på API-serveren (eksempel policy)
cat < audit-policy.yaml
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: RequestResponse
resources:
- group: ""
resources: ["secrets", "pods"]
- level: Metadata
omitStages: ["RequestReceived"]
EOF
Legg --audit-policy-file=audit-policy.yaml og --audit-log-path til API-serverens oppstartsflagg. Send loggene videre til et sentralt SIEM-system, og sett opp en enkel dashboard som viser hvem som har opprettet pods de siste 24 timene. Det er nøyaktig den innsikten du trenger for raskt å se om noen utnytter en RBAC-svakhet som Fragnesia-relaterte pod-opprettelser.
Sett også opp et automatisk varsel som trigges hvis antall pod-opprettelser fra én enkelt bruker eller service-account plutselig hopper langt over normalen. Dette er et av de enkleste, men mest effektive signalene for å fange både feilkonfigurert automatisering og reelt misbruk tidlig, lenge før det får utvikle seg til et fullverdig innbrudd.
Kubernetes-versjoner og sikkerhetsstøtte i 2026
Hvilken versjon klyngen din kjører, avgjør om du i det hele tatt mottar sikkerhetsoppdateringer. Tabellen under viser status for versjonene som er relevante i 2026.
| Versjon | Status | GA / patch | End of Life |
|---|---|---|---|
| 1.30 | Utfaset | Siste patch 1.30.14 | 15. juli 2025 |
| 1.34 | Aktiv | Tidlig 2026 | 2027 |
| 1.35 | Aktiv (AKS GA mars 2026) | Mars 2026 | 2027–2028 |
| 1.36 | Aktiv (AKS GA juni 2026) | Juni 2026 | 2027–2028 |
| 1.37 | Kommende (AKS-mål okt. 2026) | Oktober 2026 | Okt. 2027 / 2028 LTS |
Andre administrerte Kubernetes-tjenester følger lignende løp. Alibaba sin ACK-tjeneste ga ut versjon 1.36 i mai 2026 med støtte frem til 30. mai 2027, noe som understreker mønsteret: produksjonsklynger i 2026 bør regnes som 1.34–1.36, ikke eldre versjoner du kanskje husker fra i fjor.
NIS2 og container-sikkerhet: hva EU-regelverket krever av nordiske virksomheter
For norske og nordiske virksomheter som driver samfunnskritisk infrastruktur eller tjenester av en viss størrelse, er container-sikkerhet ikke lenger bare et teknisk valg. NIS2-direktivet stiller eksplisitte krav til risikostyring i leverandørkjeden, håndtering av sårbarheter og hendelsesrapportering, og containeriserte arbeidslaster faller rett innenfor dette virkeområdet siden de ofte utgjør selve produksjonsmiljøet for kritiske tjenester. Norge har fulgt opp EU-direktivet gjennom nasjonal lovgivning som legger tilsvarende plikter på virksomheter innenfor definerte sektorer, blant dem energi, transport, helse og digital infrastruktur.
I praksis betyr det at flere av stegene i denne guiden ikke bare er god praksis, de er dokumentasjon du kan vise frem ved et tilsyn. Image-scanning med Trivy eller Docker Scout gir deg et revisjonsspor som viser at du faktisk sjekker for kjente sårbarheter før kode når produksjon. Audit-logging fra Steg 12 gir deg sporbarhet på hvem som gjorde hva og når, noe som er sentralt både for interne granskninger og for å oppfylle meldeplikten ved sikkerhetshendelser. RBAC-herding fra Steg 5 dokumenterer at du følger prinsippet om minste privilegium, som går igjen i de fleste rammeverk for informasjonssikkerhet virksomheter i Norden må forholde seg til.
Snakk med sikkerhetsansvarlig eller compliance-teamet ditt om hvilken kategori virksomheten din havner i under NIS2, og la den vurderingen styre hvor strengt du håndhever kontrollene i denne guiden. En liten SaaS-leverandør uten kritisk infrastruktur har mer handlingsrom enn en operatør av samfunnskritiske systemer, men begge har mye å tjene på et oppsett som allerede er dokumentert og revisjonsklart fra første dag.
Verktøysammenligning: Trivy, Docker Scout og Falco
De tre verktøyene i denne guiden dekker ikke det samme problemet, og du trenger som regel alle tre, ikke bare ett.
| Verktøy | Fase | Primær bruk | Lisens |
|---|---|---|---|
| Trivy | Bygge-tid | CVE- og feilkonfigurasjonsskanning av images og klynge | Åpen kildekode, gratis |
| Docker Scout | Bygge-tid / CI | CVSS-basert risikoscoring og policy-gating | Gratis nivå + betalte planer |
| Falco | Runtime | eBPF-basert deteksjon av mistenkelig atferd i kjørende containere | CNCF, åpen kildekode, gratis |
Trivy og Docker Scout stopper det du visste om på forhånd, altså kjente CVE-er. Falco fanger det du ikke visste om, som en angriper som utnytter en zero-day eller misbruker en legitim rettighet på en uventet måte. Kombinasjonen av bygge-tids skanning og runtime-deteksjon er det som gjerne kalles "shift left, watch right" i moderne container-sikkerhet.
Fem vanlige fallgruver du bør unngå
Selv team med gode intensjoner går ofte i de samme fellene når de setter opp container-sikkerhet for første gang. Ingen av disse er vanskelige å unngå når du vet om dem, men de er lette å overse midt i en travel utrulling.
- Å stole blindt på "latest"-tagger. Images tagget
latestendrer seg under føttene dine. Bruk faste versjonstagger eller enda bedre, digest-referanser (@sha256:...), slik at du alltid vet nøyaktig hva som kjører. - Å skanne images, men aldri revurdere dem. Et image som var rent i går kan ha en ny CVE i dag fordi en avhengighet fikk et nytt funn publisert. Sett opp periodisk re-skanning, ikke bare skanning ved bygg.
- Å bruke default service-account overalt. Det er raskt å komme i gang med, men gir hver kompromittert pod unødvendig bred tilgang til API-serveren.
- Å innføre NetworkPolicy uten å teste trafikkmønstre først. Default-deny uten forarbeid stopper ofte legitim trafikk mellom mikrotjenester du ikke visste var avhengige av hverandre.
- Å la Falco kjøre med kun standardregler. Standardreglene er en god start, men de kjenner ikke dine applikasjoners normale atferd, så du går glipp av mange relevante varsler uten egendefinerte regler.
Feilsøking: 8 vanlige problemer og løsninger
- Pods blir avvist av PodSecurity uten tydelig grunn. Kjør
kubectl get events -n produksjon --field-selector reason=FailedCreatefor å se den nøyaktige policy-bruddet i klartekst. - NetworkPolicy ser riktig ut, men blokkerer ikke trafikk. Sjekk at CNI-pluginen din faktisk håndhever NetworkPolicy. Kindnet, flannel i standardoppsett og enkelte eldre CNI-er håndhever ikke reglene i det hele tatt.
- Falco starter ikke, eBPF-modulen feiler. Kontroller at nodens kjerneversjon støtter eBPF CO-RE. Eldre kjerner under 4.14 krever ofte kernel-module-driveren i stedet.
- Trivy-skanning tar for lang tid i CI. Bruk
--cache-dirfor å persistere sårbarhetsdatabasen mellom kjøringer i stedet for å laste den ned på nytt hver gang. - Service-account med
automountServiceAccountToken: falsegjør at appen ikke får kontakt med API-serveren. Hvis appen faktisk trenger API-tilgang, monter token eksplisitt i pod-spesifikasjonen i stedet for på kontoen. - Docker Scout gir "ikke autentisert"-feil i CI. Sørg for at CI-jobben kjører
docker loginog har riktig organisasjons-scope satt førdocker scout-kommandoer kjøres. - KMS-kryptering av secrets feiler ved API-server-restart. Bekreft at KMS-pluginens socket faktisk er tilgjengelig før API-serveren starter, en race condition her er en vanlig årsak til krasj ved oppstart.
- Audit-logger fylles opp disken raskt. Begrens policyen til kun de ressurstypene du faktisk trenger (som secrets og pods på RequestResponse-nivå), og send logger videre til ekstern lagring fremfor å beholde alt lokalt.
Avanserte tips for produksjonsmiljøer
Når grunnmuren fra de 12 stegene er på plass, er neste nivå å signere images med Sigstore/Cosign og håndheve at klyngen kun kjører signerte, verifiserte images via en admission-kontroller. Dette lukker et av de siste hullene i forsyningskjeden: selv om et image passerer Trivy- og Scout-skanning, vil du fortsatt vite at det faktisk kom fra din egen CI-pipeline og ikke ble byttet ut underveis.
Vurder også å generere en SBOM (Software Bill of Materials) for hvert image som en del av bygget, slik at du kan svare raskt neste gang en ny CVE i en populær avhengighet dukker opp, uten å måtte skanne alt på nytt for å finne ut hvilke systemer som er berørt. Kombiner dette med CIS Kubernetes Benchmark for å få en punktvis sjekkliste for kontrollplan-herding utover det som er dekket her, og kjør kube-bench periodisk for å måle avvik fra benchmarken automatisk.
Til slutt, bygg en enkel "game day"-øvelse der teamet ditt simulerer et container-utbrudd i et testmiljø og øver på å bruke Falco-alarmer, audit-logger og RBAC-begrensninger til å begrense skaden. Verktøyene i denne guiden er bare like gode som teamets evne til å reagere når de faktisk trigges.
Et annet grep som betaler seg over tid er å automatisere selve base-image-hygienen. Sett opp en jobb som flagger alle base-images eldre enn seks måneder og oppretter en pull request med oppdatert base-image automatisk, for eksempel med Renovate eller Dependabot konfigurert mot Dockerfile-er. Kombiner det med en fast rebuild-rytme, selv for images der ingen kodeendring har skjedd, siden nye sårbarheter i underliggende pakker dukker opp uavhengig av om du har endret egen kode. Mange team lener seg også mer og mer på minimale distribusjoner, som Distroless eller Alpine-baserte images, rett og slett fordi et mindre image har færre pakker som kan inneholde en fremtidig CVE.
Komplett eksempelprosjekt: fra image til overvåket klynge
Under følger et minimalt, men komplett oppsett som binder sammen alle 12 stegene i én arbeidsflyt du kan kopiere direkte inn i et testprosjekt.
# 1. Bygg og skann image
docker build -t registry.local/betaling-app:1.4.0 .
trivy image --severity HIGH,CRITICAL --exit-code 1 registry.local/betaling-app:1.4.0
docker scout cves registry.local/betaling-app:1.4.0 --only-severity critical --exit-code
# 2. Push kun hvis skanning er grønn
docker push registry.local/betaling-app:1.4.0
# 3. Opprett namespace med Restricted PSA
kubectl create namespace produksjon
kubectl label namespace produksjon pod-security.kubernetes.io/enforce=restricted
# 4. Dedikert service-account med minimal RBAC
kubectl create serviceaccount betaling-app -n produksjon
kubectl apply -f rbac-betaling-app.yaml
# 5. Deploy med default-deny NetworkPolicy allerede aktiv
kubectl apply -f network-policy.yaml
kubectl apply -f deployment-betaling-app.yaml
# 6. Verifiser at Falco overvåker namespacet
kubectl logs -n falco -l app.kubernetes.io/name=falco --since=5m | grep produksjon
Med dette oppsettet kjørende har du et image som er skannet før push, en klynge som håndhever restriktive pod-policyer, en applikasjon som kjører med minimale rettigheter, nettverkstrafikk som er eksplisitt tillatt fremfor implisitt åpen, og runtime-overvåkning som varsler deg hvis noe likevel går galt. Det er nøyaktig de fire C-ene i praksis, ikke bare i teorien.
Tabellen under oppsummerer hvilket verktøy som hører til hvert av de 12 stegene, slik at du har en rask referanse å sjekke oppsettet ditt mot.
| Steg | Verktøy | Formål |
|---|---|---|
| 1–2 | Kind, kubectl | Testmiljø og sikkerhetsmodell |
| 3 | Trivy | Image-skanning før push |
| 4 | Docker Scout | CVSS-terskler i CI/CD |
| 5 | RBAC | Minimale rettigheter per arbeidslast |
| 6 | Pod Security Admission | Håndhevet pod-sikkerhetsprofil |
| 7 | NetworkPolicy, Calico/Cilium | Default-deny nettverkstrafikk |
| 8 | KMS v2 | Kryptering av hemmeligheter |
| 9–10 | Falco | Runtime-deteksjon via eBPF |
| 11–12 | kubectl, audit-policy | Node-patching og sporbarhet |
Ofte stilte spørsmål
Trenger jeg både Trivy og Docker Scout, eller holder det med ett verktøy?
De fleste team klarer seg fint med ett skanneverktøy i CI, forutsatt at de faktisk bruker det konsekvent. Trivy er det mest brukte gratis alternativet og dekker både images og klyngeressurser, mens Docker Scout gir bedre risikoscoring og policy-gating hvis du allerede bruker Docker sitt økosystem. Å kjøre begge parallelt gir marginalt bedre dekning, men den største gevinsten kommer fra å faktisk håndheve terskler, ikke fra hvilket verktøy du velger.
Er Falco nødvendig hvis jeg allerede har et kommersielt sikkerhetsverktøy?
Ikke nødvendigvis. Mange kommersielle plattformer bygger faktisk på samme eBPF-telemetri som Falco bruker under panseret. Poenget er at du har en eller annen form for runtime-deteksjon, ikke spesifikt Falco. Fordelen med Falco er at det er CNCF-graduert, gratis, og gir deg full kontroll over reglene uten leverandørbinding.
Hvor ofte bør jeg oppgradere Kubernetes-versjon?
Følg gjerne skyleverandørens støttevindu, men som en tommelfingerregel bør du aldri kjøre en versjon som er mer enn to minor-versjoner bak siste stabile utgivelse. Med 1.30 nå utfaset og 1.34–1.36 som aktiv standard i 2026, betyr det i praksis en oppgradering hver tredje til fjerde måned for de fleste produksjonsklynger. Sett opp en fast rutine for dette fremfor å vente til en sårbarhet tvinger deg til det, siden en planlagt oppgradering nesten alltid er billigere og mindre stressende enn en hastepatch under tidspress.
Hva gjør jeg hvis jeg ikke kan patche mot Fragnesia-sårbarheten med en gang?
Google sin egen anbefaling er å begrense hvem som kan opprette pods i klyngen inntil node-oppgraderingen er fullført, siden det er hovedveien inn for å utnytte svakheten. Kombiner det med økt overvåkning via Falco på noder som ennå ikke er patchet, slik at du i det minste ser forsøk på utnyttelse i sanntid.
Kan jeg bruke Pod Security Admission og en tredjeparts admission-kontroller samtidig?
Ja, og det er faktisk en vanlig kombinasjon. PSA håndhever grunnleggende pod-sikkerhetsprofiler direkte innebygd i Kubernetes, mens et verktøy som OPA Gatekeeper eller Kyverno kan håndheve mer detaljerte, organisasjonsspesifikke policyer på toppen, for eksempel krav om signerte images eller obligatoriske ressursgrenser.
Påvirker NetworkPolicy ytelsen i klyngen?
Overheaden er normalt minimal med moderne eBPF-baserte CNI-er som Cilium. Med eldre iptables-baserte implementasjoner kan et svært høyt antall regler i store klynger gi merkbar latens, så test alltid ytelsen med et representativt antall policyer før du ruller ut i stor skala.
Må jeg kryptere alle secrets, eller holder det med de mest sensitive?
Krypter alle secrets som standard. Kostnaden ved å aktivere KMS v2-kryptering for hele klyngen er lav, mens kostnaden ved å glemme ett enkelt sensitivt secret fordi det ikke sto på en manuelt vedlikeholdt liste kan være svært høy.
Hvor lang tid tar det å implementere alle 12 stegene i en eksisterende klynge?
Selve verktøyinstallasjonen tar om lag 45 minutter, som denne guiden er bygget rundt. Å faktisk migrere en eksisterende produksjonsklynge til restriktiv RBAC, default-deny NetworkPolicy og håndhevet PSA uten å bryte noe tar normalt flere uker, siden du må kartlegge eksisterende trafikkmønstre og rettighetsbehov gradvis, namespace for namespace.
Relaterte saker
- Azure AKS-Sårbarhet: CVSS 9,4, 415 Feil Patchet [2026]
- OpenCost Setup: 12 Steg, 30% Lavere Skykostnad [2026]
- AWS FinOps-agent: 29% av Skyforbruket Kastes Bort [2026]
- Skyrepatriering: Norge 19 %, Finland Kutter 29 % [2026]
- AWS 76 %, Azure 74 %: Skysuverenitet Snur Norden [2026]
For flere saker om skyinfrastruktur og sikkerhet, se vår samleside for skytjenester.
Kilder og videre lesning: Kubernetes sin offisielle sikkerhetsdokumentasjon, Pod Security Standards, OWASP Kubernetes Top 10, Falco-dokumentasjonen, Trivy, Docker Scout, og Google Kubernetes Engine sine sikkerhetsbulletiner.




