I mitten av augusti 2026 släppte Microsoft en patch för CVE-2026-50516, en sårbarhet i Azure Kubernetes Service med CVSS-poäng 9,4. Åtta dagar senare publicerade Red Hat sin advisory om CVE-2026-66794 i Multicluster Engine for Kubernetes, poäng 9,3. Två kritiska brister på drygt en vecka, båda med potential för fullständig kontroll över klustret om de utnyttjas. Den som driftar Kubernetes i produktion i Sverige eller övriga Norden fick ett tydligt kvitto på att härdning inte är ett engångsprojekt utan ett löpande arbete som aldrig blir klart.

Den här guiden går igenom tolv konkreta steg för att härda ett Kubernetes-kluster mot de sårbarheter som faktiskt drabbar produktionsmiljöer just nu, med kommandon, YAML-manifest och ett komplett exempelprojekt du kan använda direkt. Vi utgår uteslutande från verkliga CVE:er verifierade mot NVD (National Vulnerability Database) och versionsnummer hämtade direkt från respektive projekts officiella GitHub-utgåvor, inte teoretiska hot eller gissade versioner. Räkna med cirka 90 minuter för hela genomgången på ett testkluster, längre om du kör den mot en produktionsmiljö med flera team.

Kubernetes-säkerhet har dessutom blivit en regulatorisk fråga i Norden, inte bara en teknisk. Svenska och nordiska bolag som faller under NIS2 måste kunna visa att kritiska system, containerplattformar inräknade, har dokumenterad riskhantering och incidentberedskap. Ett kluster som saknar grundläggande härdning blir svårt att motivera inför en revision, oavsett hur bra applikationskoden i övrigt är skriven.

Guiden är skriven för dig som redan driftar ett kluster i produktion, inte för den som ska sätta upp Kubernetes från grunden. Har ni ännu inte ett kluster igång alls rekommenderar vi att först bygga en fungerande driftmiljö och sedan komma tillbaka hit innan ni tar emot skarp trafik, snarare än att försöka härda och bygga samtidigt.

Varför Kubernetes-säkerhet är kritiskt efter augustivågen 2026

Kubernetes har blivit standardplattformen för containerdrift i både startups, banker och myndigheter, vilket gör klustren till ett attraktivt mål. Under 2026 har den officiella Kubernetes CVE-listan vuxit med flera allvarliga poster, och i augusti tillkom två kritiska brister i hanterade molntjänster inom loppet av nio dagar. Det är ett annat mönster än tidigare år, då de flesta bristerna satt i själva kärnkomponenterna som kube-apiserver eller kubelet. Nu läcker sårbarheterna in via tilläggskomponenter: ingress-kontrollrar, CSI-drivrutiner och molnleverantörernas egna hanteringslager ovanpå kärnan.

Det ändrar hotbilden på ett sätt många team missar helt. Du kan ha ett välpatchat Kubernetes-kärnsystem och ändå vara exponerad, eftersom attackytan idag ligger i addonarkitekturen snarare än i kärnan: ingress-nginx som routar all extern trafik, CSI-drivrutiner som monterar lagring åt hundratals poddar, och styrplan-tillägg som cluster-proxy-addon i Red Hats Multicluster Engine. Ett kluster med tio installerade tillägg har tio separata uppdateringscykler att hålla koll på, och det är där de flesta incidenterna faktiskt börjar, inte i kubelet eller etcd som man ofta fokuserar på.

Enligt Kubernetes officiella säkerhetsdokumentation bygger en säker klusterarkitektur på fyra lager, ofta kallade 4C: kod, container, kluster och moln (cloud). Wiz forskningsteam beskriver i sin genomgång av härdningsmetoder samma princip men delar upp den efter livscykelfas: build, deploy och runtime. Den här guiden går igenom praktiska åtgärder i samtliga lager och faser, med fokus på det som faktiskt stoppar de sårbarheter som är aktiva just nu i augusti 2026, inte generella råd du redan läst tio gånger.

God Kubernetes-säkerhet handlar i praktiken om att göra flera saker samtidigt, inte om att hitta en enda silverkula. Ett team som bara patchar CVE:er men aldrig städar RBAC blir träffat av nästa läckta token. Ett team som bara städar RBAC men aldrig patchar ingress-nginx blir träffat av nästa konfigurationsinjektion. De tolv stegen nedan är byggda för att komplettera varandra: förebyggande kontroller i steg 1 till 9, upptäckt i steg 10, och hantering av de delar av stacken du inte själv äger i steg 11 och 12.

Förutsättningar: verktyg, versioner och åtkomst du behöver

Innan du börjar behöver du administratörsåtkomst till klustret samt några verktyg installerade lokalt. Här är den uppsättning guiden utgår från, med de senaste versionerna hämtade direkt från respektive projekts release-sidor vid publiceringstillfället:

  • Kubernetes v1.37.0 eller senare (kontrollera med kubectl version, äldre versioner saknar flera av de senaste säkerhetsfixarna i API-servern)
  • kubectl matchande din klusterversion, plus cluster-admin-behörighet för den första inventeringen
  • ingress-nginx controller v1.15.1 eller senare, versionen som täpper till CVE-2026-4342 och CVE-2026-3288
  • Kyverno v1.19.0 eller OPA Gatekeeper v3.23.0 för admission control, beroende på vilket policyspråk teamet redan behärskar
  • Falco 0.44.1 för runtime-detektion av avvikande processer
  • HashiCorp Vault v2.0.4 eller motsvarande extern hemlighetshantering
  • Helm 3.x för installation och uppgradering av samtliga addons ovan
  • Ett testkluster, till exempel via kind eller minikube, för att öva igenom stegen innan du rör produktion

Räkna med cirka 90 minuter för att gå igenom samtliga tolv steg på ett mindre testkluster. Ett större produktionskluster med flera team tar ofta en hel arbetsdag utspridd över en vecka, eftersom RBAC-städning och nätverkspolicyer kräver avstämning med applikationsägarna innan du vågar sätta reglerna i enforce-läge. Skynda inte igenom det steget bara för att checklistan känns lång.

Samtliga verktyg i listan ovan är öppen källkod och kostnadsfria att köra i grundutförande, vilket gör att den här härdningsnivån är fullt möjlig även för mindre team utan säkerhetsbudget. Kyverno, Gatekeeper och Falco drivs alla som CNCF-projekt, och Vault finns i en öppen community-utgåva utöver HashiCorps kommersiella Enterprise-version. Kostnaden ligger i arbetstiden, inte i licenser.

Steg 1–2: Kartlägg klustret och patcha ingress-nginx

Första steget är alltid inventering. Du kan inte skydda det du inte vet finns, och det låter klyschigt men stämmer ändå i nästan varje incidentutredning vi sett. Kör följande för att se vilka versioner av de mest kritiska komponenterna som faktiskt kör i klustret just nu:

kubectl get deployment -n ingress-nginx ingress-nginx-controller \
  -o jsonpath='{.spec.template.spec.containers[0].image}'

kubectl get pods -A -o jsonpath='{range .items[*]}{.spec.containers[*].image}{"\n"}{end}' \
  | sort -u | grep -i csi

Om ingress-nginx-imagen är äldre än v1.15.1 är klustret sannolikt exponerat för två aktiva CVE:er som båda beskrivs i detalj hos NVD. CVE-2026-4342 (CVSS 8,8) tillåter konfigurationsinjektion i nginx via en kombination av ingress-annotationer, vilket kan leda till kodkörning i controllerns kontext. CVE-2026-3288 (CVSS 8,8) utnyttjar annotationen nginx.ingress.kubernetes.io/rewrite-target på liknande sätt. Båda kräver att en angripare kan skapa eller ändra en Ingress-resurs i namnrymden, vilket gör dem särskilt farliga i multi-tenant-kluster där enskilda utvecklarteam har rätt att skapa egna ingresser utan central granskning.

Uppgraderingen i sig är enkel om du kör Helm för din ingress-installation:

helm repo update ingress-nginx
helm upgrade ingress-nginx ingress-nginx/ingress-nginx \
  --namespace ingress-nginx \
  --version 4.15.1 \
  --set controller.image.tag=v1.15.1

Verifiera att inga annotationer i befintliga ingresser innehåller ovanlig eller osedvanligt lång syntax innan du uppgraderar, eftersom vissa av de sårbara mönstren också fungerar som legitima konfigurationstrick i äldre installationer. Städa bort dem i samma veva i stället för att bara byta version och hoppas på det bästa.

Ett enkelt sätt att hitta riskabla annotationer innan du uppgraderar är att lista alla ingresser och grep:a fram de fält som historiskt utnyttjats för injektion:

kubectl get ingress -A -o json | \
  jq -r '.items[] | .metadata.annotations // {} | to_entries[] |
  select(.key | test("rewrite-target|configuration-snippet")) |
  "\(.key)=\(.value)"'

Får du träffar med ovanligt lång eller kodliknande text i värdet, granska raden manuellt innan du går vidare. Det är precis den typen av fält som ligger bakom både CVE-2026-4342 och CVE-2026-3288.

Steg 3: Lås CSI-drivrutinerna mot subDir-sårbarheten

CVE-2026-3864 (CVSS 6,5) sitter i CSI-drivrutinen för NFS, där parametern subDir i volymidentifierare inte valideras tillräckligt noggrant. En angripare som kan skapa PersistentVolume-resurser kan använda path traversal för att komma åt eller radera kataloger utanför den avsedda volymen. Poängen är lägre än ingress-buggarna ovan, men konsekvensen, dataförlust eller dataläckage på delad lagring, gör den värd att stänga direkt snarare än att vänta på nästa patchfönster.

Begränsa vem som får skapa PersistentVolume-objekt direkt, och styr i stället allt via PersistentVolumeClaim och StorageClass med dynamisk provisionering. Ett minimalt exempel på hur rollen ska se ut:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: no-direct-pv-create
rules:
  - apiGroups: [""]
    resources: ["persistentvolumes"]
    verbs: ["get", "list", "watch"]
    # create/update/delete utelämnat med avsikt

Uppdatera sedan CSI-drivrutinen till en version som validerar subDir-parametern mot path traversal. Kontrollera release notes för din specifika CSI-drivrutin, NFS eller SMB, eftersom fixarna landade separat för varje driver under våren 2026 och inte alla distributioner backporterat dem lika snabbt.

Om ni delar lagringsvolymer mellan flera team eller kunder i samma kluster, en vanlig arkitektur i multi-tenant-plattformar, är det extra viktigt att inte bara lita på patchen. Lägg också till en admission-policy (se steg 8 och 9 nedan) som blockerar PersistentVolumeClaim-manifest där subDir innehåller tecken som ../, som ett extra skyddslager oavsett vilken version av CSI-drivrutinen som råkar vara installerad vid ett givet tillfälle.

CVEKomponentCVSSPubliceradTyp av brist
CVE-2026-4342ingress-nginx8,8 (Hög)19 mars 2026Konfigurationsinjektion via annotation
CVE-2026-3288ingress-nginx8,8 (Hög)9 mars 2026Injektion via rewrite-target
CVE-2026-3864CSI Driver NFS6,5 (Medel)20 mars 2026Path traversal via subDir
CVE-2026-8715Vault Secrets OperatorEj fastställd i CVSS 3.113 aug 2026Godtycklig filläsning, exfiltrering
CVE-2026-50516Azure Kubernetes Service9,4 (Kritisk)11 aug 2026Saknad autentisering, privilegieeskalering
CVE-2026-66794Multicluster Engine (cluster-proxy-addon)9,3 (Kritisk)19 aug 2026Autentiseringsbypass via användarroute

Steg 4: Aktivera Pod Security Standards i restricted-läge

Pod Security Standards ersatte det gamla PodSecurityPolicy-systemet och styrs numera via enkla namnrymdsetiketter i stället för ett separat API-objekt. Det finns tre profiler: privileged (ingen begränsning), baseline (blockerar de mest kända eskaleringsvägarna) och restricted (kräver att processer inte kör som root, blockerar privilegierade containrar och stänger av farliga volymtyper som hostPath). Restricted är den enskilt mest effektiva spärren mot att en komprometterad container tar sig ut till värdnoden, och den kostar i praktiken ingenting i prestanda.

kubectl label namespace produktion \
  pod-security.kubernetes.io/enforce=restricted \
  pod-security.kubernetes.io/enforce-version=v1.37 \
  pod-security.kubernetes.io/audit=restricted \
  pod-security.kubernetes.io/warn=restricted

Sätt alltid warn och audit parallellt med enforce första gången du rör en namnrymd, och kör en vecka i observationsläge innan du blockerar på riktigt. Annars riskerar du att stoppa legitima poddar som kör med förhöjda rättigheter av gamla, historiska skäl, ofta äldre leverantörsbilder som aldrig anpassats för restricted-profilen och som ingen i teamet vågar röra.

Ett konkret exempel: en äldre Redis-image som kör som root och skriver till en hostPath-volym för persistens kommer att avvisas direkt av restricted-profilen. Lösningen är sällan att göra undantag för namnrymden, utan att byta till en uppdaterad image som stödjer icke-root-körning och peka om lagringen till en vanlig PersistentVolumeClaim i stället för hostPath. Det extra arbetet betalar sig första gången en container faktiskt komprometteras, eftersom angriparen då inte kan nå värdnodens filsystem.

Steg 5: Städa RBAC och ta bort överdrivna rättigheter

De flesta produktionskluster har minst en ServiceAccount med bindning till cluster-admin som ingen längre minns varför den skapades, ofta ett arv från en tidig proof-of-concept som aldrig städades bort. Kör en genomgång av alla ClusterRoleBindings mot cluster-admin:

kubectl get clusterrolebindings -o json | \
  jq -r '.items[] | select(.roleRef.name=="cluster-admin") | .subjects[]?.name'

Ersätt varje träff med ett specifikt Role som bara ger de verb och resurser applikationen faktiskt använder. Ett vanligt mönster är att en CI/CD-pipeline bara behöver skapa Deployments och Services i en enda namnrymd, inte hela klustret:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: ci-deploy
  name: deployer
rules:
  - apiGroups: ["apps"]
    resources: ["deployments"]
    verbs: ["get", "list", "create", "update", "patch"]
  - apiGroups: [""]
    resources: ["services"]
    verbs: ["get", "list", "create", "update"]

Det här jobbet tar tid eftersom det kräver dialog med teamen som äger tjänsterna, men det är åtgärden som ger mest säkerhet per arbetstimme du lägger ner. En stulen token med cluster-admin-rättigheter är i praktiken en fullständig klusterövertagning, medan samma stulna token bakom en snäv Role bara ger åtkomst till en enda namnrymd.

Ett bra riktmärke är att ingen ServiceAccount ska ha bredare rättigheter än vad som krävs för att köra just den arbetslasten, och att människor loggar in med individuella konton kopplade till er identitetsleverantör snarare än att dela på ett gemensamt kubeconfig med breda rättigheter. Det senare är vanligt i mindre team av bekvämlighetsskäl, men gör det omöjligt att i efterhand avgöra vem som faktiskt gjorde en given ändring om något går fel.

Steg 6: Bygg nätverkspolicyer mot lateral rörelse

Utan NetworkPolicy kan varje pod i klustret prata med varje annan pod, oavsett namnrymd. Det gör att en komprometterad frontend-container kan nå databaser och interna API:er direkt, vilket är exakt det mönster som utnyttjas när en enskild sårbarhet, som en av ingress-buggarna ovan, ska eskaleras till fullständig dataexfiltrering. Börja med en default-deny-policy per namnrymd och öppna sedan bara den trafik som faktiskt behövs, inget mer:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-all
  namespace: produktion
spec:
  podSelector: {}
  policyTypes:
    - Ingress
    - Egress
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-frontend-to-api
  namespace: produktion
spec:
  podSelector:
    matchLabels:
      app: api
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: frontend
      ports:
        - port: 8443

Kom ihåg att NetworkPolicy bara verkställs om din CNI-plugin faktiskt stödjer det. Flannel i grundutförande gör det inte, medan Calico och Cilium gör det. Testa alltid policyn i en icke-produktionsnamnrymd först. Ett vanligt misstag är att glömma DNS-trafik i egress-reglerna, vilket får hela namnrymden att sluta fungera eftersom poddarna inte längre kan slå upp Service-namn via kube-dns.

Kör ni Cilium kan ni gå längre än standard-NetworkPolicy och skriva regler på applikationslager (L7), till exempel att en frontend-pod bara får anropa GET /api/v1/produkter på api-podden men inte DELETE på samma endpoint. Det är särskilt värdefullt i kluster som redan haft en ingress-relaterad incident, eftersom det begränsar vad en angripare kan göra även efter att ha tagit sig förbi själva ingress-lagret.

Steg 7: Flytta hemligheter till Vault eller extern KMS

Kubernetes Secrets är bara base64-kodade som standard, inte krypterade i etcd om du inte aktiverat kryptering vid vila separat. Det innebär att vem som helst med läsåtkomst till etcd-databasen, eller ett fungerande backup-uttag av den, kan läsa alla hemligheter i klartext. HashiCorp Vaults Kubernetes-autentisering löser problemet genom att låta poddar hämta hemligheter dynamiskt utan att de någonsin lagras som klusterobjekt:

vault auth enable kubernetes

vault write auth/kubernetes/config \
  kubernetes_host="https://kubernetes.default.svc:443"

vault write auth/kubernetes/role/api-service \
  bound_service_account_names=api \
  bound_service_account_namespaces=produktion \
  policies=api-secrets-read \
  ttl=1h

Se även upp för Vault Secrets Operator om du kör den i klustret. En augustiuppdatering till version 1.5.0 täppte till CVE-2026-8715, som i version 1.3.0 till 1.4.1 tillät godtycklig filläsning och exfiltrering av autentiseringsuppgifter från operatorns egna pod-filsystem via AppRole-konfigurationen. En tenant med begränsade RBAC-rättigheter kunde alltså läsa filer från operatorns filsystem och skicka innehållet vidare. Uppgraderingen tar bort det gamla fältet spec.appRole.secretIDPath, så räkna med att migrera konfigurationen till spec.appRole.secretRef samtidigt som du uppgraderar, inte efteråt.

Om ni ännu inte kör Vault alls, är det värt att prioritera minst kryptering av Secrets vid vila i etcd som ett minimum medan ni utvärderar en fullständig Vault-installation. Det är en engångskonfiguration på API-servern och kräver ingen ny infrastruktur, men stänger den enklaste vägen in för någon som får tag i en etcd-backup eller läsåtkomst till datalagret.

Steg 8–9: Skanna images och sätt admission control

Ett härdat kluster hjälper inte mycket om vem som helst kan köra osignerade, oskannade images med kända sårbarheter i botten av lagren. Här kompletterar image-skanning och admission control varandra: skanningen (till exempel med Trivy eller Grype i din CI-pipeline) hittar problemen innan bygget ens är klart, medan admission-kontrollen stoppar dem från att någonsin nå klustret om något ändå slinker igenom.

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-signed-images
spec:
  validationFailureAction: Enforce
  rules:
    - name: verify-signature
      match:
        resources:
          kinds: ["Pod"]
      verifyImages:
        - imageReferences:
            - "registry.example.com/*"
          attestors:
            - entries:
                - keys:
                    publicKeys: |-
                      -----BEGIN PUBLIC KEY-----
                      (din publika nyckel här)
                      -----END PUBLIC KEY-----

Kyverno och OPA Gatekeeper löser samma problem på olika sätt. Kyverno använder YAML-baserade policyer som liknar vanliga Kubernetes-manifest och är därför lättare att komma igång med för team utan tidigare erfarenhet. Gatekeeper bygger på Rego, ett eget policyspråk från Open Policy Agent, som ger mer uttryckskraft men en brantare inlärningskurva. Välj utifrån vad teamet redan kan snarare än vilket verktyg som råkar vara populärast just nu.

Image-skanning hänger också ihop med leveranskedjesäkerhet i stort. Om ni redan bygger en SBOM (Software Bill of Materials) för era applikationer, koppla samma verktygskedja till admission-kontrollen så att en image utan giltig SBOM eller med kända sårbarheter över en viss allvarlighetsgrad aldrig ens accepteras av klustret. Det gör skanningen till en spärr snarare än bara en rapport någon läser i efterhand.

VerktygPolicyspråkSenaste versionBäst för
KyvernoYAML (deklarativt)v1.19.0Team utan tidigare Rego-erfarenhet
OPA GatekeeperRegov3.23.0Organisationer med befintlig OPA-användning
FalcoFalco-regler (YAML)0.44.1Runtime-detektion, inte admission control
VaultPolicy-språk (HCL)v2.0.4Dynamisk hemlighetshantering

Steg 10: Logga och larma med Falco och audit-loggar

Förebyggande kontroller stoppar det du känner till i förväg. Falco upptäcker det du inte förutsåg, genom att övervaka syscalls i realtid och larma på avvikande beteende, som en interaktiv shell som öppnas inuti en container som normalt aldrig kör interaktiva processer alls:

- rule: Terminal shell in container
  desc: En interaktiv shell startades inuti en container
  condition: >
    spawned_process and container
    and shell_procs and proc.tty != 0
  output: >
    Skal öppnat i container (user=%user.name container=%container.name
    shell=%proc.name parent=%proc.pname)
  priority: WARNING

Komplettera med Kubernetes audit-loggar aktiverade på API-servern, så att du kan se exakt vem som skapade eller ändrade vilken resurs och när. Kombinationen av admission control, Falco och audit-loggar täcker de tre faserna build, deploy och runtime som också beskrivs i OWASP:s Kubernetes Security Cheat Sheet. Utan runtime-lagret ser du bara att något gick fel efteråt, i loggarna, i stället för medan det faktiskt händer.

Skicka Falco-larmen och audit-loggarna vidare till samma ställe där ni redan samlar övrig säkerhetstelemetri, i stället för att låta dem ligga isolerade i klustret. Ett larm som ingen tittar på förrän någon råkar leta i efterhand ger noll värde jämfört med ett larm som triggar en utredning inom minuter. Många team kopplar Falco till en Slack-kanal för lägre allvarlighetsgrad och till en riktig incidentprocess för det som är märkt CRITICAL, vilket håller bruset nere utan att missa det som faktiskt spelar roll.

Steg 11: Härda hanterade kluster (AKS-fallet)

CVE-2026-50516, patchad av Microsoft den 11 augusti 2026, är en bugg med saknad autentisering i Azure Kubernetes Service som tillåter en angripare att eskalera privilegier över nätverket. Bristen sitter i AKS hanteringslager, inte i själva Kubernetes-kärnan, vilket betyder att du inte kan patcha den själv oavsett hur snabbt du agerar. Det du kan göra är att begränsa attackytan medan du väntar: stäng åtkomst till klusterns API-server från publika nätverk, aktivera Azure AD-integrerad autentisering i stället för lokala konton, och slå på Microsoft Defender for Containers för att fånga avvikande aktivitet i hanteringslagret medan patchen rullas ut till din region.

Samma princip gäller oavsett molnleverantör: hanterade Kubernetes-tjänster som AKS, EKS och GKE delar ansvar mellan dig och leverantören. Du äger härdningen av arbetslaster, RBAC och nätverk, vilket är precis det stegen 1 till 10 i den här guiden går igenom. Leverantören äger styrplanet. När styrplanet brister, som i det här fallet, är begränsning av blast radius det enda verktyget du faktiskt har tills patchen landar i din region, oavsett hur välhärdat resten av klustret är.

Prenumerera på säkerhetsbulletiner från din molnleverantör separat från de generella driftmeddelandena, eftersom kritiska brister som CVE-2026-50516 ofta kommuniceras via en egen säkerhetskanal med snävare distribution. Ett team som bara läser den vanliga statussidan missar ofta att en patch för just deras region redan finns tillgänglig, och lever kvar i onödan lång tid med extra kompenserande kontroller som annars kunnat plockas bort.

Steg 12: Skydda multikluster-komponenter

Kör du flera kluster via en central hanteringsplattform, som Red Hats Multicluster Engine for Kubernetes, får du en extra angreppsyta: komponenter som pratar mellan kluster och som ofta får bredare rättigheter än en enskild arbetslast någonsin skulle behöva. CVE-2026-66794, publicerad 19 augusti 2026 med CVSS 9,3, ligger i komponenten cluster-proxy-addon och tillåter en oautentiserad angripare med tillgång till den användarvända routen att kringgå autentisering helt.

Åtgärden är dubbel: uppgradera till den patchade versionen av Multicluster Engine så snart Red Hat släpper den för din distribution, och begränsa i mellantiden vilka nätverk som kan nå den användarvända routen för cluster-proxy-addon via en ingress-nivå-regel eller brandvägg framför den. Multikluster-hantering är bekvämt när man har många team och miljöer att hålla reda på, men varje ny hanteringskomponent är också en ny sak att patcha, vilket är värt att räkna in innan man inför ännu fler sådana lager ovanpå varandra.

Innan ni inför ett nytt multikluster-verktyg, fråga vem i teamet som äger patchningen av just den komponenten, inte bara av arbetslasterna som körs inuti klustren. Ett vanligt scenario är att ett hanteringsverktyg installeras av en plattformsgrupp och sedan aldrig uppgraderas eftersom ingen längre räknar det som sitt ansvar när personal byts ut. Det är exakt den typen av glömd komponent som CVE-2026-66794 kan utnyttjas i.

Fallgropar och felsökning

De flesta härdningsprojekt misslyckas inte på grund av tekniken, utan på grund av ordningen man gör sakerna i eller för att man hoppar över observationsperioden. Samma fem misstag dyker upp om och om igen oavsett bransch eller klusterstorlek. Ingen av dem kräver avancerad kunskap för att undvika, bara lite tålamod och rätt ordning:

  • Att sätta enforce direkt utan audit-period. Pod Security Standards och admission-policyer i enforce-läge från dag ett stoppar produktionstrafik utan förvarning. Kör alltid audit och warn i minst en vecka innan du växlar.
  • Att glömma DNS i NetworkPolicy-egress. Default-deny utan ett explicit undantag för kube-dns bryter namnuppslagning för hela namnrymden, ofta upptäckt först när supporttelefonen ringer.
  • Att patcha ingress-nginx utan att granska befintliga annotationer. Gamla, kreativa konfigurationstrick i annotationer kan sluta fungera, eller värre, fortsätta vara sårbara om uppgraderingen inte täcker exakt rätt version.
  • Att lämna kvar gamla ClusterRoleBindings efter en RBAC-städning. Om du skapar nya, snävare roller men glömmer radera de gamla bindningarna har du bara lagt till komplexitet, inte säkerhet, eftersom den gamla vägen in fortfarande fungerar.
  • Att lita blint på molnleverantörens patchning. Hanterade tjänster patchar styrplanet, men arbetslaster, RBAC och nätverkspolicyer är fortfarande ditt eget ansvar, som CVE-2026-50516 påminde många om i augusti.

Felsökningstabell: 8 vanliga fel och lösningar

SymptomTrolig orsakLösning
Poddar startar inte efter Pod Security-etikettContainer kör som root eller med privilegierad kontextSätt runAsNonRoot: true och allowPrivilegeEscalation: false i securityContext
DNS-uppslagning slutar fungera i namnrymdDefault-deny-egress saknar undantag för kube-dnsLägg till egress-regel mot namnrymden kube-system på port 53
CI/CD-pipeline kan inte längre deployaRBAC-roll för snäv efter städningLägg till saknade verb (patch, update) på rätt resurstyp
Kyverno-policy blockerar alla poddarvalidationFailureAction satt till Enforce innan test i AuditSätt till Audit, granska loggar, justera policy innan Enforce
Ingress slutar routa trafik efter uppgraderingAnnotation borttagen eller inkompatibel i ny versionJämför release notes och uppdatera annotationssyntax
Falco-larm på legitim adminaktivitetRegel för generisk, matchar normala driftverktygLägg till undantag för kända adminprocesser i regelfilen
Vault-autentisering misslyckas för ny podServiceAccount saknar bindning i Vault-rollenUppdatera bound_service_account_names i Vault-rollen
Kluster-API otillgängligt efter nätverksbegränsningEgen adminåtkomst blockerad av samma regel som stoppar angripareLägg till explicit undantag för kontor-IP eller VPN-intervall

Avancerade tips och komplett exempelprojekt

Avancerade tips för mognare säkerhetsteam

När grundstegen är på plats finns det tre saker som ger mest utdelning härnäst. Först: automatisera CVE-bevakningen mot din faktiska image-inventering med ett verktyg som prenumererar på Kubernetes officiella CVE-flöde, så att nya poster som CVE-2026-50516 eller CVE-2026-66794 matchas mot dina kluster automatiskt i stället för att upptäckas manuellt via nyhetsbrev veckor senare. För det andra: separera hanteringsplanets nätverk fysiskt eller logiskt från arbetslastnätverket, särskilt om ni kör multikluster-hantering, eftersom det stoppar just den typ av lateral åtkomst som CVE-2026-66794 utnyttjar. För det tredje: bygg policy-as-code i CI/CD så att Kyverno- eller Gatekeeper-policyer testas mot manifest innan de ens når klustret, vilket flyttar felet från runtime till build-tid, där det är billigare att åtgärda.

Mognare team kör också regelbundna övningar mot sina egna kluster, där en person aktivt försöker utnyttja kända CVE:er i en testmiljö medan en annan person validerar att admission-policyer och Falco-regler faktiskt fångar försöket i realtid. Det avslöjar snabbt om en policy bara ser bra ut på papper eller faktiskt håller när den prövas. Kör den övningen efter varje större ändring i policy-uppsättningen, inte bara en gång om året.

En fjärde punkt värd att lyfta för team med krav på regelefterlevnad: koppla varje härdningsåtgärd till ett konkret NIS2-krav när ni dokumenterar arbetet. Kubernetes-säkerhet blir mycket lättare att motivera för ledningen och för en revisor om ni kan visa att steg 4 (Pod Security Standards) täcker kravet på systemhärdning, steg 7 (Vault) täcker kravet på kryptering av känsliga uppgifter, och steg 10 (Falco och audit-loggar) täcker kravet på loggning och upptäckt av incidenter. Det gör härdningsarbetet till en investering som syns även utanför driftteamet.

Komplett exempelprojekt: härdad manifestuppsättning

Nedan är strukturen för ett minimalt men fullständigt härdat projekt du kan anpassa till din egen miljö. Den samlar alla lager från guiden i en mapp per komponent, vilket gör det enkelt att applicera stegvis i rätt ordning:

harda-kluster/
├── namespace.yaml            # PodSecurity-etiketter i restricted-läge
├── rbac/
│   ├── role-deployer.yaml    # Minsta möjliga rättigheter för CI/CD
│   └── rolebinding.yaml
├── network/
│   ├── default-deny.yaml     # Default-deny ingress/egress
│   ├── allow-dns.yaml        # Undantag för kube-dns
│   └── allow-frontend-api.yaml
├── policies/
│   └── kyverno-require-signed-images.yaml
├── vault/
│   └── kubernetes-auth-role.yaml
└── monitoring/
    └── falco-rule-shell-detect.yaml

Applicera i den här ordningen: namnrymd och RBAC först, sedan nätverkspolicyer i audit-läge, sedan Kyverno-policyer i Audit, och sist Vault och Falco. Kör kubectl apply -f harda-kluster/ --dry-run=server innan varje steg för att fånga syntaxfel utan att röra klustret. När allt är verifierat i audit-läge under minst en vecka växlar du nätverkspolicyer och Kyverno till Enforce en komponent i taget, aldrig alla på en gång, så att du kan koppla varje eventuellt fel till exakt en förändring.

Utdatan från en lyckad testkörning ser ut ungefär så här:

$ kubectl apply -f harda-kluster/ --dry-run=server
namespace/produktion configured (server dry run)
role.rbac.authorization.k8s.io/deployer created (server dry run)
networkpolicy.networking.k8s.io/default-deny-all created (server dry run)
networkpolicy.networking.k8s.io/allow-dns created (server dry run)
clusterpolicy.kyverno.io/require-signed-images created (server dry run)

Om någon rad i utdatan i stället visar ett felmeddelande om ogiltig syntax eller saknad CRD, betyder det oftast att Kyverno eller den CSI-drivrutin manifestet refererar till inte är installerad än. Installera beroendena i rätt ordning innan du applicerar mapparna igen.

Vanliga frågor

Måste jag göra alla 12 steg samtidigt?
Nej. Börja med patchning av ingress-nginx och CSI-drivrutiner (steg 1 till 3), eftersom de täpper till kända, aktiva CVE:er direkt. RBAC-städning och nätverkspolicyer kan sedan rullas ut gradvis över flera veckor i takt med att teamen hinner testa.

Påverkar Pod Security Standards prestandan?
Nej, restricted-profilen styr behörigheter och konfiguration, inte CPU eller minne. Den enda risken är att poddar som förlitar sig på privilegierad åtkomst slutar starta tills bilderna anpassas för profilen.

Kyverno eller OPA Gatekeeper, vilket ska jag välja?
Kyverno är oftast snabbare att komma igång med om teamet redan kan YAML, medan Gatekeeper passar bättre om organisationen redan använder Rego i andra sammanhang, till exempel för molnpolicyer i andra system.

Räcker det att patcha AKS via Microsofts uppdateringar?
Microsoft patchar styrplanet, men CVE-2026-50516 visar att du fortfarande bör begränsa nätverksåtkomst till API-servern och aktivera Azure AD-autentisering som extra lager, eftersom du inte kan verifiera exakt när din specifika region fått patchen utrullad.

Hur ofta bör jag köra inventeringssteget (steg 1)?
Minst en gång i månaden, och direkt efter varje ny CVE-publicering som rör en komponent du kör. Automatisera gärna kontrollen med en schemalagd körning mot Kubernetes officiella CVE-flöde i stället för att göra det manuellt.

Behöver jag Vault, eller räcker Kubernetes Secrets?
Kubernetes Secrets fungerar för enkel drift utan känslig data, men de är bara base64-kodade som standard och inte krypterade vid vila om du inte konfigurerat det separat. Vault ger kryptering, korta TTL:er och dynamisk rotation, vilket är värt investeringen så snart du hanterar produktionsdata eller kunduppgifter.

Vad gör jag om jag inte kan uppgradera ingress-nginx direkt?
Granska och lås ner vilka team som får skapa eller ändra Ingress-resurser via RBAC, som ett tillfälligt lager tills uppgraderingen kan planeras in i ett underhållsfönster. Det stoppar inte sårbarheten helt, men minskar kraftigt vem som kan utnyttja den.

Räknas de här stegen som en del av NIS2-kraven på Kubernetes-säkerhet?
Ja, i praktiken täcker stegen flera av de tekniska kraven i NIS2 kring riskhantering, kryptering och incidentupptäckt, men själva lagen kräver också dokumentation, ansvarsfördelning och en incidentplan som går utöver de tekniska åtgärderna i den här guiden.

Hur vet jag om mitt kluster redan är komprometterat via någon av dessa CVE:er?
Granska audit-loggarna för ovanliga ändringar av Ingress-resurser eller PersistentVolume-objekt runt de datum sårbarheterna publicerades, och jämför mot Falco-larm från samma period om du redan kört Falco. Saknar du historiska loggar går det tyvärr inte att fastställa i efterhand, vilket i sig är ett argument för att aktivera audit-loggning innan nästa CVE-våg, inte efter.

Kan jag automatisera hela den här guiden i en enda pipeline?
Delvis. Patchning, RBAC-manifest, nätverkspolicyer och Kyverno-policyer går utmärkt att lägga i Git och rulla ut via GitOps-verktyg som Argo CD eller Flux. Det som inte går att fullt automatisera är avstämningen med applikationsägarna innan ni växlar en policy till Enforce, eftersom det kräver mänskligt omdöme om vilka undantag som faktiskt behövs.

Relaterad läsning

Fler artiklar om molnsäkerhet, sårbarheter och incidenthantering hittar du på shattered.io:s säkerhetssektion.