Taggat med: Docker

Guide till säkrare containers

Guide till säkrare containers

Senast uppdaterad 2023-09-22

Att containers har blivit en del av många organisationers vardag råder det ingen tvivel om. Med hjälp av populära verktyg såsom Docker, Podman eller Kubernetes (K8s) så realiserar dessa en containerbaserad infrastruktur och applikationsdistribution.

Det är av stor vikt att hålla dessa säkra och nedan följer en guide hur du kan minska risken för eventuella cyberattacker.

Minska attackytan

Först och främst gäller det att minska attackytan. Detta för att minska risken, och att uppnå en 100%-ig säkerhet är så klart helt omöjligt. Men hur gör man för att minska attackytan? Jo det består i flertalet saker:

  • Använd användare med låga behörigheter inne i containern. Kör rootless utanför om möjligt
  • Använd en container till ett syfte. Dvs inte både webbserver och databas, exponera eller installera ej sshd inne i en container
  • Exponera minimalt med kataloger, sockets eller annat mellan containers och mot värden (operativsystemet som kör containers) och vice versa
  • Stäng av sådant som inte behövs, såsom nätverk. Kan stängas av med: –network none
  • Utgå från minimala containers såsom -slim och distroless
  • Skydda API:et eller socketen för att kommunicera med din containermjukvara såsom Podman, Docker osv. Dvs podman.socket och /var/run/docker.sock samt TCP-portarna 2376/2375
  • Håll dockerd, podman etc uppdaterat och även containers
  • Undvik argument såsom : –privileged och –cap-add då dessa öppnar upp för ”container escape” sårbarheter

Attacker via mjukvarukedjan (supply chain)

Ladda inte hem och använd godtyckliga containers, utan utgå ifrån sådana som är signerade och verifierade. Använd verktyg såsom cosign och docker trust för att verifiera. Det har hänt flertalet gånger att containers innehåller bl.a. crypto-miners.

Exempel på hur docker trust inspect kan användas för att validera alpine:latest

dock trust inspect alpine:latest

Och för cosign där jag verifierar distroless python3-debian11:

Även om containers är signerade så är det givetvis ingen garant för att den innehåller bakdörrar.

Loggning och spårbarhet

Det är av stor vikt att logga även sådant som händer i containers. Det vanligaste sättet är att skriva loggarna till stdout och sedan fånga upp detta. Viktigt är att centralt samla in loggarna och analysera dessa ytterligare efter avvikande mönster, kända attacker osv.

Även så finns det verktyg såsom Sysdig Falco eller auditd som kan kontrollera beteendet på dockerd eller inviduella containers. Exempel på hur audit.rules kan se ut för docker:

-w /usr/bin/docker -p wa
-w /var/lib/docker -p wa
-w /etc/docker -p wa
-w /lib/systemd/system/docker.service -p wa
-w /lib/systemd/system/docker.socket -p wa
-w /etc/default/docker -p wa
-w /etc/docker/daemon.json -p wa
-w /usr/bin/docker-containerd -p wa
-w /usr/bin/docker-runc -p wa

Glöm inte heller att logga och analysera nätverkstrafik som går in/ut ur respektive container, använd Suricata, Zeek eller Arkime. Försök att skilja på applikationsloggar, operativsystemsloggar, prestandaloggar etc. Även om alla är viktiga så har alla sina unika mönster för att identifiera intrång. Andra saker som kan skilja är hur länge du vill lagra dessa.

Sårbarhetsskanning

Det finns många bra verktyg för att genomföra sårbarhetsskanning av containers. Dels det inbyggda kommandot docker scout (tidigare docker scan som använde Snyk) och dels tredjepartsverktyg såsom trivy och grype.

Jag tänkte göra en snabb jämförelse mellan dessa tre enligt nedan.

Trivy

Jag använder en test-image vid namn hello-python. Sedan kör jag kommandot:

trivy image hello-python

Då identifierar den tre sårbarheter i python-paket och 47 st i alpine 3.11.5:

trivy container vulnerability scan

Grype

För att skanna av en container med grype kör jag kommandot:

grype hello-python

Och då hittar den enligt nedan. Totalt blir det 118 kända sårbarheter som identifieras, vilket är flest antal av de tre verktyg jag testar. Men dock räknar jag antalet CVE:er och GHSA:s individuellt så blir det 81 st.

grype docker vulnerability scan

Docker Scout

Kör jag med senaste versionen av docker scout, som tyvärr måste laddas hem separat då nyaste versionen ej ingår i Docker Desktop så hittar den 67 sårbarheter i 12 paket.

Även Docker Scout identifierar tre sårbarheter i python-paket (pypi). Kommandot jag använder är:

./docker-scout cves hello-python
docker scout vulnerability scan

Övrigt

Kan även rekommendera att titta på lösningar såsom Kata och Gvisor som tillför ett extra lager med säkerhet i Er container-miljö.

Vissa IT-forensiska utmaningar kan också uppstå i en container-baserad miljö. Se därför till att öva på olika scenarion där en container eller dess host-operativsystem drabbats av intrång, eller möjlighet att söka efter IOC:er (Indicators of Compromise).

Fick tips om att UFW ej fungerar tillsammans med Docker. Även en rekommendation om att skapa upp SBOM:s för alla dina containers, som jag bloggat tidigare om.

Se även över om ni kan upprätta ett eget container-index och således få en bättre överblick över vilka containers om används inom organisationen.

Bild skapad med Midjourney

Docker SBOM

Docker har precis släppt en ny funktion som gör det möjligt att skapa en Software Bill Of Materials (SBOM) på en docker-image. Förutom att det är ett krav på amerikanska myndigheter att upprätta en SBOM så är det säkerhetsmässigt mycket bra att veta exakt vilka beroenden som återfinnes i ett IT-system eller mjukvara. Vid sårbarheter såsom den i log4j går det snabbare och enklare att identifiera var sårbara bibliotek återfinnes.

syft

Dockers sbom-funktion bygger på open-source projektet Syft. Och följande paket stödjer docker sbom/syft att identifiera i containers:

  • Alpine (apk)
  • Dart (pubs)
  • Debian (dpkg)
  • Go (go.mod, Go binaries)
  • Java (jar, ear, war, par, sar)
  • JavaScript (npm, yarn)
  • Jenkins Plugins (jpi, hpi)
  • PHP (composer)
  • Python (wheel, egg, poetry, requirements.txt)
  • Red Hat (rpm)
  • Ruby (gem)
  • Rust (cargo.lock)

Och för att skapa själva rapporten så finns ett antal olika SBOM-format såsom spdx, cyclonedx, json och text. Jag testade att snabbt jämföra debian med alpine utan några extra paket och då såg det ut så här:

  • Alpine – 14 paket (apk)
  • Debian – 96 paket (deb)
  • Alma Linux – 153 paket (rpm)
  • Rocky Linux – 151 paket (rpm)

Och tittar vi på hur en text-rapport från alpine:latest ser ut som är skapad med hjälp av kommandot docker sbom alpine:latest

Syft v0.43.0
 ✔ Loaded image
 ✔ Parsed imag
 ✔ Cataloged packages      [14 packages]

NAME                    VERSION      TYPE
alpine-baselayout       3.2.0-r18    apk
alpine-keys             2.4-r1       apk
apk-tools               2.12.7-r3    apk
busybox                 1.34.1-r5    apk
ca-certificates-bundle  20211220-r0  apk
libc-utils              0.7.2-r3     apk
libcrypto1.1            1.1.1n-r0    apk
libretls                3.3.4-r3     apk
libssl1.1               1.1.1n-r0    apk
musl                    1.2.2-r7     apk
musl-utils              1.2.2-r7     apk
scanelf                 1.3.3-r0     apk
ssl_client              1.34.1-r5    apk
zlib                    1.2.12-r0    apk

Hjälptext för docker sbom:

Observera att docker sbom bara finns i Docker Desktop från version 4.7.0 än så länge. Men givetvis går syft att ladda hem och köra separat.

Två nya Linux-sårbarheter

Det är ingen bra vecka för Linux-baserade operativsystem såsom Debian, Ubuntu, Fedora och CentOS. Minst två olika sårbarheter har upptäckts och program för att nyttja dessa sårbarheter finns publicerade.

De två sårbarheterna som är aktuella just nu är en som går under namnet PwnKit och utnyttjar en brist i pkexec som är en del av Polkit, CVE-2021-4034. Den andra buggen är en kernel-bugg som kan användas för att göra Docker/container samt escapes från Kubernetes. För denna sista bugg så betalade Google ut en Bug Bounty på hela $31337 vilket är ungefär 300,000 svenska kronor.

Video där Qualys som identifierade sårbarheten visar hur polkit-buggen utnyttjas på Debian Bullseye:

Den andra Linux-kernelbuggen identifierades av CTF-teamet Crusaders of Rust där bl.a. William Liu och Jamie Hill-Daniel ingår, den har CVE-2022-0185.

För att buggen ska fungera på Docker så måste –privileged användas samt så hjälper den standard-seccomp profil som följer med. Men tyvärr är det inte allt för ofta som seccomp används för containers.

Det finns en exploit här och jag kan verkligen rekommendera deras utförliga write-up här:

Uppdatering: Amazon Linux 2 har inte polkit installerat som standard. Men om du installerar polkit så är det nuvarande paketet sårbart.

Docker Hub hackade

Inatt så hackades tjänsten Docker Hub. Enligt många var det bara en tidsfråga innan just Docker Hub skulle hackas. Det är nämligen så att de templates för operativsystem som den populära mjukvaran Docker använder hämtas hem från Docker hub. Sedan några år är Alpine Linux den standard Linux-dist som används av Docker.

Om en bakdörr skulle läggas in i något av de mer populära avbildningsfilerna såsom Alpine på Docker Hub så skulle troligtvis tusentals installera denna avbildning automatiskt.

I sitt utskick så meddelar Docker att mindre än 5% av kontona kan ha blivit röjda vilket rör sig om ungefär 190 000 konton. Även bör dessa konton återställa sina länkade Bitbucket samt GitHub-konton. Du kan nämligen länka dessa tredjepartstjänster mot ditt Docker Hub-konton via oauth, för automatiska byggen.

På HackerNews klagar många på hur just integrationen mot Github fungerar och att det krävs skriv samt läsrättigheter till hela kontot (om man inte använder Github Apps). Även så vore det trevligt om Alpine var ett reproducerbart bygge för att öka transparensen och göra det lättare att upptäcka bakdörrar. Dock finns det inget som tyder på att bakdörrar har lagts in i detta skede.

Meddelanet som skickades ut:

Bakdörrar identifierade på Docker Hub

Ett antal avbilder som återfinnes på populära Docker Hub innehåller bakdörrar. Dessa avbilder med bakdörrar har laddats hem mer än 90000 gånger.  Kontot som laddat upp dessa bakdörrar har namnet docker123321 och bakdörren utnyttjar användarens kapacitet för kryptovaluta-mining.

Det är totalt 14 stycken olika avbilder (images) som innehåller den skadliga koden rapporterar Kromtech Security Center. Totalt har 544.74 Moneros beräknats vilket motsvarar en vinst på ca 791 000 SEK.

Plånboken som tar emot Moneros är:

41e2vPcVux9NNeTfWe8TLK2UWxCXJvNyCQtNb69YEexdNs711jEaDRXWbwaVe4vUMveKAzAiA4j8xgUi29TpKXpm3zKTUYo

Och här är en skärmdump från Github gällande en av bakdörrarna som jack0 upptäckte och rapporterade till Docker:

Exempel på någon som upptäckt att en brandväggs-image innehöll miner den 7:de Augusti 2017:

https://twitter.com/jperras/status/894561761252319232

Jag tror tyvärr att detta är en trend som kommer att öka. I takt med allt fler marknadsplatser såsom Docker Hub och Google Web Store så kommer även antagonisterna att utnyttja detta faktum. För tyvärr är det inte lätt att rapportera skadlig kod och de automatiska testerna som genomförs på sådant som laddas upp är bristfälliga.

Intressant att notera är även att Kromtech står bakom den kontroversiella mjukvaran MacKeeper.

Viktigt: Det vore mycket trevligt om du stödjer Kryptera.se via Patreon >

Unfetter – NSA:s nya verktyg för att upptäcka avancerade cyberattacker

Den amerikanska myndigheten NSA har tillsammans med det icke vinstdrivande företaget Mitre utvecklat ett nytt verktyg vid namn Unfetter. Med hjälp av detta verktyg så kan en organisation effektivare identifiera cyberattacker genom att fokusera på att upptäcka beteendebaserad metodik istället för indikatorer samt inspireras av Mitres tidigare projekt vid namn CAR och ATT&CK.

Verktyget finns tillgängligt som open-source via Github och jag har givetvis testat verktyget.

Först och främst så klonade jag hem repot som innehåller docker-compose.yml vilket används av Docker. Sedan skrev jag docker-compose up i katalogen för att ladda hem och starta upp sex stycken containers:

NSA unfetter Docker composer up

Den container som heter unfetter-discover-gateway ser till att exponera tcp port 80 samt 443 och surfar vi sedan in på https://localhost så möts vi (förutom ett certifikatfel) följande bild:

Där jag sedan har möjlighet att navigera vidare till någon av de vyer som finns förinstallerade via Kibana:

  • Threat Dashboard
  • Analytic Exchange
  • Assessments
  • Assessments 3.0
  • Intrusion Set Dashboard
  • Events Dashboard
  • API Explorer
  • STIX

Tanken är alltså att du ska skicka in data från olika klienter och servrar med hjälp av NXlog och sysmon exempelvis.

Följande övergripande arkitekturbild visar hur det hänger ihop:

Givetvis så följer det även med exempelkonfigurationer till både nxlog och sysmon.

Men den kanske mest intressanta frågan är: Hur upptäcks avancerade cyberattacker? Det är genom att koppla ihop olika indikatorer, exempelvis denna:

CAR-2016-04-005: Remote Desktop Logon

Vilket implementerar ungefär (pseudokod) följande regler på inkommande analyserade loggar:

[EventCode] == 4624 and
[AuthenticationPackageName] == 'Negotiate' and
[Severity] == "Information" and
[LogonType] == 10

A remote desktop logon, through RDP, may be typical of a system administrator or IT support, but only from select workstations. Monitoring remote desktop logons and comparing to known/approved originating systems can detect lateral movement of an adversary.

Dessa indikatorer kan sedan kopplas mot Mitres ATT&CK och olika grupperingar såsom Equation Group (EQGRP) och deras modus operandi. Dock verkar det inte gå automatiskt i dagsläget och så här ser Intrusion Set Dashboard ut för Equation:

Equation Group

Vi kan även se att Equation har 2 av 219 attack patterns i det intrusion set som följer med Unfetter. För den som vill se hur logstash är konfigurerad mot sysmon kan kolla in följande konfigg-fil på Github.

NSA framhäver även att Unfetter inte är färdigt för att användas i produktion ännu:

This is not designed for production use