Skip to main content

Forfatter: Marieke

Håndtering af sårbarheder i dit Kubernetes-miljø

I en verden drevet af teknologi, er robust sikkerhed i din Kubernetes-infrastruktur ikke en luksus, men en nødvendighed. Hos KvalitetsIT kombinerer vi teknisk ekspertise med en praktisk tilgang for at sikre, at din infrastruktur er beskyttet mod de nyeste trusler, og vi forstår vigtigheden af et sikkert og pålideligt system i din virksomheds drift.

Læsetid: 5 minutter


Udfordringen ved manglende sårbarhedsscanning

Forestil dig en situation, hvor dit Kubernetes-miljø er uden en dybdegående sårbarhedsscanning. Ubeskyttede systemer er som åbne døre for cyberangreb, hvilket ikke kun udgør en trussel mod dine data, men også mod dit omdømme og overholdelse af sikkerhedsstandarder. Manglen på en effektiv sikkerhedsstrategi kan føre til kritiske brister i forsvarsværket, som cyberkriminelle hurtigt kan udnytte.

De tre hovedtyper

  • Sårbarheder på platformen

    Vi holder et skarpt øje med din Kubernetes-platform for at sikre, at den konstant er opdateret og sikret. Vi gennemgår og implementerer hver måned sikkerhedsopdateringer og patches, hvilket er afgørende for at beskytte mod nyopdagede sårbarheder.

  • Sårbarheder i eget software

    Din egen kode kræver også opmærksomhed. Ved hjælp af værktøjer som Trivy, sikrer vi, at din software er fri for skjulte sårbarheder. Vi gennemfører regelmæssige kodegennemgange og sikkerhedsaudits for at identificere og afhjælpe potentielle sikkerhedshuller i din egenudviklede software.

  • Sårbarheder i driftsmiljøet

    Vi udfører regelmæssige penetrationstests, som er kritiske for at sikre dit miljø mod eksterne angreb. Disse tests simulerer reelle angreb og identificerer sårbarheder, der kunne blive udnyttet af angribere, hvilket giver os mulighed for at styrke dine forsvarsstrategier.

Vigtigheden af effektiv sårbarhedsscanning

Vores grundige tilgang til sårbarhedsscanning sikrer, at alt fra din Kubernetes-platform til de applikationer, der kører på den, er skærmet mod potentielle sårbarheder. Vi fokuserer på at være proaktive frem for reaktive, hvilket er afgørende i det moderne digitale landskab. En effektiv sårbarhedsscanning er ikke kun en teknisk proces, men en integreret del af en omfattende sikkerhedsstrategi, der beskytter mod både kendte og ukendte trusler.

  • Konsekvenserne uden sikkerhedsscanning

    • Uopdagede sårbarheder fører til øgede risici for sikkerhedsbrud.
    • Langsomme reaktionstider på sikkerhedstrusler kan have dybtgående konsekvenser for virksomhedens drift og omdømme.
    • Manglende overholdelse af compliance-krav kan have juridiske og økonomiske konsekvenser.
    • Tab af tillid fra brugere, kunder og forretningspartnere kan være skadeligt for virksomhedens langsigtede succes.
  • Fordelene med sikkerhedsscanning

    • Tidlig identifikation og håndtering af sårbarheder reducerer risikoen for data- og sikkerhedsbrud.
    • Overholdelse af sikkerhedsstandarder og lovgivning sikrer, at virksomheden opfylder alle regulatoriske krav.
    • En stærk sikkerhedsprofil forbedrer tilliden blandt brugere og interessenter, hvilket er afgørende for at opretholde et positivt virksomhedsimage.
    • Proaktiv sikkerhed fører til øget driftsstabilitet og forretningskontinuitet.

Vores arbejde

Hos KvalitetsIT har vi en dedikeret tilgang til at beskytte din Kubernetes cloud. Vores team bruger de seneste teknikker og værktøjer til at sikre, at din infrastruktur er robust mod digitale trusler. Vi forstår vigtigheden af at have en skalerbar og fleksibel sikkerhedsstrategi, der kan tilpasses de konstant skiftende trusselslandskaber.

  • Løbende overvågning og opdatering: Vi holder konstant øje med sårbarheder, og sørger for, at din infrastruktur er opdateret med de seneste sikkerhedsrettelser.
  • Skræddersyede løsninger: Vi forstår, at hver virksomhed har unikke behov. Derfor tilbyder vi skræddersyede sikkerhedsløsninger, der er specifikt tilpasset din infrastruktur og forretningsmæssige krav.
  • Ekspertvejledning og support: Vores eksperter tilbyder dybdegående rådgivning og support for at sikre, at din infrastruktur forbliver sikker og stabil. Vi er her for at hjælpe dig med at navigere i de komplekse udfordringer inden for cloud-sikkerhed.

En partner i kampen mod teknologiske trusler

I en tid, hvor teknologiske trusler er i konstant udvikling, er det vigtigt at have en stærk partner ved din side. Hos KvalitetsIT er vi forpligtet til at beskytte din Kubernetes cloud med de nyeste sikkerhedspraksisser. Kontakt os for at styrke din infrastrukturs sikkerhed og sikre din virksomheds digitale fremtid.

3 gode grunde til at holde din Kubernetes-platform opdateret

Læs også:

Forfatter

Læs videre

En ren og visuelt tiltalende illustration i blå toner, der repræsenterer konceptet med at bygge og køre en Docker-baseret Python-applikation. Billedet har et moderne, minimalistisk design med Docker og Python logoer, samt subtile elementer som en forenklet kodebit og et terminalvindue, der fremhæver proces uden tekniske detaljer.

Guide: Byg og kør din første dockerbaserede applikation

Læsetid: 7 minutter


Denne artikel er en dansk genudgivelse af Docker101 -> 01-intro-yourfirstimage.

Byg dit første billede

Lad os lave et simpelt Docker-billede.

Vi laver en Dockerfil til at definere vores billede. Som et basisbillede bruger vi python:3.11.0-alpine3.15.

Alpine er et letvægts-Linux-distribution, og vi vil lave en simpel python applikation for at lære om Docker-billeder og containere.

FROM python:3.11.0-alpine3.15

# Installing exta dependencies needed in our application
RUN apk update && apk add libcap
RUN pip install flask flask_bootstrap requests

# Settings some defaults
ENV GREETER DefaultGreeter

# Installing our app
WORKDIR /usr/src/app
ENV GREETER DefaultGreeter
ENV FLASK_APP app
COPY app.py app.py
COPY greetings/hello/greeting.txt /data/hello/greeting.txt

# Executed during build but really has no effect on the image (or on the running containers for that matter)
RUN echo Hello, $GREETER

# Defines what happens when the container starts
CMD { echo $GREETER; flask run --host=0.0.0.0; }

Du kan finde forskellige instruktioner på https://docs.docker.com/engine/reference/builder/ for at se detaljer og udforske flere muligheder.

Lad os bygge billedet og se resultatet af byggeprocessen:

$ docker build -t my/first:1 .
Sending build context to Docker daemon  10.75kB
Step 1/11 : FROM python:3.11.0-alpine3.15
 ---> c692f3b79c36
Step 2/11 : RUN apk update && apk add libcap
 ---> Running in 1ed0eb83cefa
fetch https://dl-cdn.alpinelinux.org/alpine/v3.15/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.15/community/x86_64/APKINDEX.tar.gz

... a lot of loglines related to the installation of libraries - we will ignore these for now ...

Removing intermediate container e2a85e50d99c
 ---> b22b618ca631
Step 4/11 : ENV GREETER DefaultGreeter
 ---> Running in f47db2adc718
Removing intermediate container f47db2adc718
 ---> ab16c159d28d
Step 5/11 : WORKDIR /usr/src/app
 ---> Running in 0b28af7c2c02
Removing intermediate container 0b28af7c2c02
 ---> fc5530f8fbb7
Step 6/11 : ENV GREETER DefaultGreeter
 ---> Running in 9702ab00d747
Removing intermediate container 9702ab00d747
 ---> 28de3cce1118
Step 7/11 : ENV FLASK_APP app
 ---> Running in 5eb616aa1d98
Removing intermediate container 5eb616aa1d98
 ---> d9fefb5eaa92
Step 8/11 : COPY app.py app.py
 ---> d9d6e4383100
Step 9/11 : COPY greetings/hello/greeting.txt /data/hello/greeting.txt
 ---> 91c8cf9ca83c
Step 10/11 : RUN echo Hello, $GREETER
 ---> Running in 3540464c93ae
Hello, DefaultGreeter
Removing intermediate container 3540464c93ae
 ---> 18a70c54715c
Step 11/11 : CMD { echo $GREETER; flask run --host=0.0.0.0; }
 ---> Running in 3866861588b7
Removing intermediate container 3866861588b7
 ---> 0045bdbc0751
Successfully built 0045bdbc0751
Successfully tagged my/first:1

Hver instruktionslinje i Dockerfilen tilføjer et ‘lag’ i filsystemet på det færdige billede. Resultatet af ‘Hello, DefaultGreeter’ viser, hvordan udførelsen af ‘echo’-kommandoen er en del af byggefasen. Det vil ikke have effekt på det færdige billede, eftersom det ikke tilføjer/fjerner noget i lagene.

Kør billedet

Lad os prøve at køre billedet:

$ docker run my/first:1
DefaultGreeter
 * Serving Flask app 'app'
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:5000
 * Running on http://172.17.0.2:5000
Press CTRL+C to quit

Nu kører containeren. Du kan se alle dine kørende containere:

$ docker ps
CONTAINER ID   IMAGE        COMMAND                  CREATED         STATUS         PORTS     NAMES
7a13fa1e44be   my/first:1   "/bin/sh -c '{ echo …"   5 seconds ago   Up 4 seconds             fervent_murdock

Dockermotoren definerer et Docker-netværk. Hver container får en IP-adresse i dette netværk.

Vi kan ikke nå slutpunktet for den kørende container fra vores værtsmaskine uden at definere en portmapping.

Lad os køre med en portmapping:

$ docker run -p 5000:5000 my/first:1
DefaultGreeter
 * Serving Flask app 'app'
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:5000
 * Running on http://172.17.0.2:5000
Press CTRL+C to quit


$ docker ps
CONTAINER ID   IMAGE        COMMAND                  CREATED         STATUS         PORTS                                       NAMES
94cfbde47286   my/first:1   "/bin/sh -c '{ echo …"   8 seconds ago   Up 7 seconds   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   competent_lamport

Læg mærke til, at vi nu har en mapping over port 5000 på værtsmaskinen til port 5000 på den kørende docker container.
Vi kan nu nå vores applikation fra vores værtsmaskine.

$ curl http://localhost:5000/hello 
Hi - From DefaultGreeter

Vi kan levere konfiguration ved kørsel ved at bruge miljøvariabler:

$ docker run -e GREETER=RunningGreeter -p 5000:5000 -t my/first:1
RunningGreeter
 * Serving Flask app 'app'
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on all addresses (0.0.0.0)
 * Running on <a href="http://127.0.0.1:5000" target="_blank" rel="noopener">http://127.0.0.1:5000</a>
 * Running on <a href="http://172.17.0.2:5000" target="_blank" rel="noopener">http://172.17.0.2:5000</a>
Press CTRL+C to quit

$ curl http://localhost:5000/hello
Hi - From RunningGreeter

$ curl http://localhost:5000/birthday
&lt;!doctype html&gt;
&lt;html lang=en&gt;
&lt;title&gt;500 Internal Server Error&lt;/title&gt;
&lt;h1&gt;Internal Server Error&lt;/h1&gt;
&lt;p&gt;The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.&lt;/p&gt;

Bemærk hvordan greeter-navnet er ændret med vores nye definition af miljøvariablen GREETER. Hvis vi prøver at få adgang til fødselsdags-URL’en, vil applikationen give os en fejl.

Vi kan også levere konfiguration ved kørsel ved at bruge volumen-mounts (montere filer i filsystemet på den kørende container):

$ docker run -e GREETER=RunningGreeter -p 5000:5000 -v $(pwd)/greetings/birthday:/data/birthday my/first:1
RunningGreeter
 * Serving Flask app 'app'
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:5000
 * Running on http://172.17.0.2:5000
Press CTRL+C to quit

$ curl http://localhost:5000/birthday
Happy Birthday - From RunningGreeter

Vores Python-applikation tillader konfiguration af forskellige hilsner ved brug af volumen-mounts.

Den er faktisk også sårbar over for et alvorligt problem – kan du se hvordan?

Hint: URL-kod ‘hello; echo Shell Injections are nasty; cat /data/hello’

Hvis du vil læse mere som dette, kan der findes flere tekster på https://github.com/KvalitetsIT.

Forfatter

Læs videre

Ridderborg

Zero trust: Din nøgle til en sikre fremtiden i en Kubernetes-verden samt andre steder

Tænk et øjeblik over dit Kubernetes cluster. Forestil dig, at en ubuden gæst finder vej ind. Ved du præcis, hvad de kan tilgå? Eller endnu værre, hvis de har sneget sig ind i en af dine containere, hvad er så risikoen? Denne bekymring er ikke kun teoretisk; virkeligheden viser, at trusler mod vores digitale “ridderborge” vokser i takt med, at flere virksomheder flytter deres operationer online.

Læsetid: 7 minutter


Forskning afslører en voksende tendens: Flere virksomheder ser behovet for zero trust. Alligevel står mange over for betydelige udfordringer i implementeringen – næsten halvdelen af alle virksomheder ser det som en stor hurdle. Traditionelt har en solid ydre firewall været et tilstrækkeligt forsvar. En enkelt mur, en nøgle, en barriere – det var alt, vi troede, der skulle til for at holde fjenden ude. Men tiderne ændrer sig, og denne strategi holder ikke vand i længden. Vi hører oftere om virksomheder, der mister data eller bliver ramt af ransomware, fordi de indre forsvarslinjer simpelthen er for svage.

Den digitale borg

Analogien med en gammeldags ridderborg er ganske passende. Forestil dig en borg med en enkelt bro over voldgraven. Med soldater til at inspicere enhver, der krydser broen, føler man sig sikker – indtil en fjende finder vej ind. Pludselig er intet sikkert; fjenden kan frit bevæge sig rundt og plyndre alt fra små tyvekoster til kongerigets kronjuveler.
Det er her, zero trust-strategien kommer ind i billedet, en moderne tilgang, der beskytter din digitale borg langt mere effektivt. Med zero trust antager vi, at fjenden allerede kan være inden for murene. I stedet for at fokusere al sikkerhed ved porten, sikrer zero trust, at hver eneste bevægelse inden for borgen kræver ny godkendelse – ingen får lov til at bevæge sig frit uden den rette tilladelse.

Zero Trust elementer

Så hvad er zero trust egentlig?

Zero trust går ud på, at vi antager, at “nogen” altid kan finde en vej ind forbi vores digitale mure – vores firewalls. Fra dette udgangspunkt tager vi vores forholdsregler, så vi præcist ved, hvad der skal gøres, hvis en ubuden gæst alligevel skulle finde vej ind. Dette princip kaldes ofte for “assume breach”, hvilket betyder, at vi opererer under antagelsen om, at vores forsvar allerede er blevet brudt.

I en zero trust-model låses alt ned, og hver eneste adgangsforsøg kræver verifikation. Dette indebærer en nøje gennemgang af brugere og deres rettigheder, hvor kun de mest nødvendige privilegier tildeles. Det sikrer, at kun de rigtige personer, under de rigtige omstændigheder, får adgang til de rigtige data – intet mere, intet mindre.

Ridderborgen genopfundet

Lad os vende tilbage til vores ridderborg-analogi. Med zero trust ville vi opdele borgen i flere mindre sektioner, hver med sin egen låste dør. Kun dem med et ægte ærinde (og de nødvendige rettigheder) kan bevæge sig fra det ene område til det andet. Dette tilføjer et ekstra lag af sikkerhed, da en indtrænger ikke længere frit kan bevæge sig rundt og udnytte systemets ressourcer.

Heldigvis er implementeringen af zero trust-princippet langt mindre komplekst i IT-verdenen, end det ville være i en fysisk ridderborg. Ved at anvende moderne teknologier og strategier kan vi opbygge en digital infrastruktur, hvor sikkerheden er indbygget på hvert niveau, og hvor hver handling kræver bekræftelse af identitet og rettigheder.

  • Uden zero trust sikkerhed

    • Tillid gives ofte implicit, baseret på brugernes placering og netværkskontekst
    • Fokus på stærk ydre grænse med mindre fokus på intern segmentering
    • Bruger ofte enkeltfaktor-autentificering og tildeler brede adgangsrettigheder baseret på roller
    • Adgangsrettigheder er ofte foruddefinerede og kan være bredere end nødvendigt
    • Mindre intens overvågning, primært fokuseret på eksterne trusler
    • Adgang baseret på brugernes rolle og placering uden nøje kontekstuel evaluering
    • Kryptering implementeres måske ikke konsekvent, hvilket kan udsætte data for risiko
  • Med zero trust sikkerhed

    • Alle brugere og enheder anses som potentielle trusler, og adgang kræver kontekstuel autentificering
    • Mikrosegmentering isolerer og begrænser bevægelsen af trusler
    • Kræver multifaktor-autentificering som standard
    • Adgangsrettigheder er granulære og tilpasses efter mindste privilegiumsprincippet
    • Konstant overvågning af brugeradfærd og netværkstrafik for mistænkelig aktivitet
    • Adgang baseret på kontekstuelle faktorer som brugeradfærd, enhedstilstand og placering
    • Anvender kryptering for at beskytte data under overførsel og hvile

Sikkerhed

Det handler ikke kun om, hvordan man kommer ind, men hvad der sker, når man er kommet ind. Med zero trust sættes der firewall på alt, så det kun åbner for præcist det, der er brug for.

Generelt er sikkerhed blevet meget komplekst, og zero trust hjælper med at simplificere sikkerhed med en strategisk proces og automatiserede værktøjer, der verificerer alle aktiviteter, arbejder med kun at give adgang til det nødvendige og benytter avanceret undersøgelse og reaktion på trusler.

KvalitetsIT’s arbejde

I stedet for at man selv skal ændre alle individuelle steder via en brugergrænseflade, benytter vi en konfigurationsfil (Configuration-as-Code (CaC)), der automatisk bliver rullet ud og gør sig gældende alle de rigtige steder.

Typisk etablerer vi lidt a la nedenstående:

  • Firewall mellem alle services, så man eksplicit skal åbne for adgang.
  • Auth mellem alle services, så vi kun giver adgang til de rigtige brugere med de rigtige roller.
  • TLS internt til f.eks. Kafka og Postgres, så kommunikationen til køer og databaser også er sikret.
  • TLSv1.3 fra www til public services (vi tillader også TLSv1.2, det kommer dog an på kunden).
  • Wireguard kryptering af netværk mellem alle VMer.
  • Kryptering af data på disk.

Som det fremgår, så er der faktisk mange lag af låse i forhold til eksemplet med borgen.

Endnu mere konkret, så gør KvalitetsIT typisk som følger:

  • Vi installerer og konfigurerer en firewall mellem alle services. Default er, at intet er åbent. Typisk er det Calico vi bruger til dette.
  • Vi åbner for services og ikke porte.
  • Vi autentificerer alle kald af services. Det kan være på roller eller endnu mere fingranuleret, hvis der er brug for det. Typisk anvender vi Keycloak og OIDC til dette.
  • Alt kommunikation er TLS v1.3 beskyttet – også den interne, hvor det er muligt.
  • Alt netværkstrafik mellem VM’er er krypteret med Wireguard.
  • Data på diske er krypteret, hvis det er relevant.
  • Automatisering af hele opsætningen af alt det ovenstående er nøglen til at få det til at fungere i praksis, så det hele ligger i konfigurationsstyringen og er under versionskontrol. Typisk Github.

Network policy

Et eksempel på en konfiguration, som vi sidder med, er konfigurationen af firewall (network policy). Den beskriver, at der må komme trafik ind fra internettet (ingress-nginx) og infrastrukturer til opsamlingen af metrics, og trafik ud til at lave DNS-opslag og beskedkø (Kafka). Resten er der ikke åbnet for.

netpol:
    ingress:
      ingress-nginx:
        namespaceSelector:
          kubernetes.io/metadata.name: kube-system
        podSelector:
          app.kubernetes.io/instance: rke2-ingress-nginx
        ports:
          8080: TCP
      metrics:
        namespaceSelector:
          kubernetes.io/metadata.name: infrastructure
        ports:
          8081: TCP
    egress:
      dns:
        ipBlock: 10.43.0.10/32
        ports:
          53: UDP
      kafka:
        namespaceSelector:
          kubernetes.io/metadata.name: message-streaming-services
        podSelector:
          strimzi.io/cluster: test2
          strimzi.io/kind: Kafka
        ports:
          9093: TCP

Når man ser på ovenstående eksempel, er det klart, at automatiseringen ikke må undervurderes. Der er rigtig mange komponenter, der hver især skal åbnes for, for at det samlede system fungerer. Hvis man skal gøre det i hånden og ikke mindst vedligeholde det i hånden, så bliver det en kæmpestor opgave og risikoen for manuelle fejl er høj. Og laver man en fejl, er det faktisk rigtig rart blot at kunne gå tilbage til den tidligere version med et klik, frem for at skulle rode med Word-dokumenter og backup filer for at genskabe en tidligere version. Man kan gå tilbage til den tidligere version på et par minutter, frem for timer.

Vi implementerer zero trust med Kubernetes, der bruger container-baserede applikationer, der gør det nemmere at styre og overvåge.

Vi har sat Zero trust op for kommuner, regioner, små og store private virksomheder, og vi har sat det op inden for forskellige brancher herunder blandt andet healthcare.

Det er ikke nemt at holde styr på sikkerheden, og nogle gange kan man tage sig selv i at gøre alt arbejdet manuelt, fordi det virker mindre kompliceret end at lave et system, der gør det for dig. Derfor kan du overlade den generelle opsætning til os, mens du selv fokuserer på det forretningsnære.

Er du klar til at tage sikkerheden til det næste niveau og sikre dit Kubernetes cluster mod ubudne gæster? Kontakt KvalitetsIT på telefon 51148767 for en uforpligtende snak om, hvordan vi kan implementere en zero trust-arkitektur i din organisation. Sikkerhed er en rejse, ikke en destination, og med zero trust er du et skridt foran truslerne.

Forfatter

Læs videre