Docker Security

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Koristite Trickest da lako izgradite i automatizujete radne tokove pokretane najnaprednijim alatima zajednice. Dobijte pristup danas:

Osnovna bezbednost Docker Engine-a

Docker engine koristi Linux kernel-ove Namespaces i Cgroups da izoluju kontejnere, pružajući osnovni nivo bezbednosti. Dodatna zaštita se obezbeđuje kroz Capabilities dropping, Seccomp, i SELinux/AppArmor, poboljšavajući izolaciju kontejnera. Auth plugin može dodatno ograničiti korisničke akcije.

Bezbedan pristup Docker Engine-u

Docker engine se može pristupiti lokalno putem Unix soketa ili udaljeno korišćenjem HTTP-a. Za udaljeni pristup, bitno je koristiti HTTPS i TLS kako bi se osigurala poverljivost, integritet i autentifikacija.

Docker engine, po podrazumevanim podešavanjima, osluškuje Unix soket na unix:///var/run/docker.sock. Na Ubuntu sistemima, Docker-ova startna podešavanja se definišu u /etc/default/docker. Da biste omogućili udaljeni pristup Docker API-ju i klijentu, izložite Docker demona preko HTTP soketa dodavanjem sledećih podešavanja:

DOCKER_OPTS="-D -H unix:///var/run/docker.sock -H tcp://192.168.56.101:2376"
sudo service docker restart

Međutim, izlaganje Docker demona preko HTTP-a nije preporučljivo zbog sigurnosnih razloga. Preporučljivo je obezbediti veze korišćenjem HTTPS-a. Postoje dva glavna pristupa obezbeđivanju veze:

  1. Klijent proverava identitet servera.

  2. Klijent i server međusobno autentično proveravaju identitet.

Sertifikati se koriste za potvrdu identiteta servera. Za detaljne primere oba metoda, pogledajte ovaj vodič.

Bezbednost slika kontejnera

Slike kontejnera mogu se čuvati u privatnim ili javnim repozitorijumima. Docker nudi nekoliko opcija za skladištenje slika kontejnera:

  • Docker Hub: Javna usluga registra od strane Dockera.

  • Docker Registry: Projekat otvorenog koda koji korisnicima omogućava da hostuju svoj sopstveni registar.

  • Docker Trusted Registry: Komercijalna ponuda Dockera, sa autentifikacijom korisnika zasnovanom na ulogama i integracijom sa LDAP direktorijumskim servisima.

Skeniranje slika

Kontejneri mogu imati sigurnosne ranjivosti ili zbog osnovne slike ili zbog softvera instaliranog na vrhu osnovne slike. Docker radi na projektu pod nazivom Nautilus koji vrši sigurnosno skeniranje kontejnera i navodi ranjivosti. Nautilus radi tako što upoređuje svaki sloj slike kontejnera sa repozitorijumom ranjivosti kako bi identifikovao sigurnosne propuste.

Za više informacija pročitajte ovo.

  • docker scan

Komanda docker scan omogućava skeniranje postojećih Docker slika korišćenjem imena ili ID-ja slike. Na primer, pokrenite sledeću komandu da skenirate sliku hello-world:

docker scan hello-world

Testing hello-world...

Organization:      docker-desktop-test
Package manager:   linux
Project name:      docker-image|hello-world
Docker image:      hello-world
Licenses:          enabled

 Tested 0 dependencies for known issues, no vulnerable paths found.

Note that we do not currently have vulnerability data for your image.
trivy -q -f json <container_name>:<tag>
snyk container test <image> --json-file-output=<output file> --severity-threshold=high
clair-scanner -w example-alpine.yaml --ip YOUR_LOCAL_IP alpine:3.5

Potpisivanje Docker slike

Potpisivanje Docker slike osigurava sigurnost i integritet slika korišćenih u kontejnerima. Evo sažetog objašnjenja:

  • Docker Content Trust koristi Notary projekat, zasnovan na The Update Framework (TUF), za upravljanje potpisivanjem slika. Za više informacija, pogledajte Notary i TUF.

  • Da biste aktivirali Docker content trust, postavite export DOCKER_CONTENT_TRUST=1. Ova funkcija je isključena po podrazumevanju u Docker verziji 1.10 i kasnijim verzijama.

  • Sa ovom funkcijom omogućenom, mogu se preuzimati samo potpisane slike. Početni unos slike zahteva postavljanje lozinki za korenske i oznake ključeva, pri čemu Docker takođe podržava Yubikey za unapređenu sigurnost. Više detalja možete pronaći ovde.

  • Pokušaj preuzimanja nepotpisane slike sa omogućenim content trust-om rezultira greškom "No trust data for latest".

  • Za unos slika nakon prvog, Docker traži lozinku ključa repozitorijuma za potpisivanje slike.

Za bekapovanje vaših privatnih ključeva, koristite komandu:

tar -zcvf private_keys_backup.tar.gz ~/.docker/trust/private

Kada prebacujete Docker hostove, neophodno je premestiti root i repozitorijumske ključeve kako biste održali operacije.


Koristite Trickest da biste lako izgradili i automatizovali radne tokove pokretane najnaprednijim alatima zajednice na svetu. Pristupite danas:

Funkcije Sigurnosti Kontejnera

Rezime Funkcija Sigurnosti Kontejnera

Glavne Funkcije Izolacije Glavnog Procesa

U kontejnerizovanim okruženjima, izolacija projekata i njihovih procesa je od suštinskog značaja za sigurnost i upravljanje resursima. Evo pojednostavljenog objašnjenja ključnih koncepata:

Prostori Imena (Namespaces)

  • Svrha: Osigurati izolaciju resursa poput procesa, mreže i fajl sistema. Posebno u Docker-u, prostori imena čuvaju procese kontejnera odvojene od domaćina i drugih kontejnera.

  • Korišćenje unshare: Komanda unshare (ili odgovarajući sistemski poziv) se koristi za kreiranje novih prostora imena, pružajući dodatni sloj izolacije. Međutim, iako Kubernetes inherentno ne blokira ovo, Docker to čini.

  • Ograničenje: Kreiranje novih prostora imena ne dozvoljava procesu da se vrati na podrazumevane prostore imena domaćina. Da bi prodro u prostore imena domaćina, obično bi bio potreban pristup direktorijumu /proc domaćina, koristeći nsenter za ulaz.

Grupa Kontrola (CGroups)

  • Funkcija: Prvenstveno se koristi za dodelu resursa među procesima.

  • Aspekt Sigurnosti: Same CGroups ne nude sigurnosnu izolaciju, osim funkcije release_agent, koja, ako nije ispravno konfigurisana, potencijalno može biti iskorišćena za neovlašćeni pristup.

Odbacivanje Mogućnosti (Capability Drop)

  • Značaj: To je ključna sigurnosna funkcija za izolaciju procesa.

  • Funkcionalnost: Ona ograničava akcije koje root proces može izvršiti odbacivanjem određenih mogućnosti. Čak i ako proces radi sa privilegijama root-a, nedostatak neophodnih mogućnosti sprečava ga da izvršava privilegovane akcije, jer će sistemski pozivi propasti zbog nedovoljnih dozvola.

Ovo su preostale mogućnosti nakon što proces odbaci ostale:

Current: cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=ep

Seccomp

Podrazumevano je omogućeno u Dockeru. Pomaže da se još više ograniče syscalls koje proces može pozvati. Podrazumevani Docker Seccomp profil može se pronaći na https://github.com/moby/moby/blob/master/profiles/seccomp/default.json

AppArmor

Docker ima predložak koji možete aktivirati: https://github.com/moby/moby/tree/master/profiles/apparmor

Ovo će omogućiti smanjenje mogućnosti, syscalls, pristup fajlovima i fasciklama...

Namespaces

Namespaces su funkcija Linux kernela koja deli resurse kernela tako da jedan skup procesa vidi jedan skup resursa dok drugi skup procesa vidi drugi skup resursa. Ova funkcija radi tako što ima isti namespace za skup resursa i procesa, ali ti namespace-ovi se odnose na različite resurse. Resursi mogu postojati u više prostora.

Docker koristi sledeće Linux kernel Namespaces za postizanje izolacije kontejnera:

  • pid namespace

  • mount namespace

  • network namespace

  • ipc namespace

  • UTS namespace

Za više informacija o namespace-ovima pogledajte sledeću stranicu:

pageNamespaces

cgroups

Linux kernel funkcija cgroups omogućava mogućnost da se ograniče resursi poput cpu, memorije, io, propusnosti mreže među skupom procesa. Docker omogućava kreiranje kontejnera koristeći cgroup funkciju koja omogućava kontrolu resursa za određeni kontejner. Sledeći je kontejner kreiran sa ograničenjem memorije korisničkog prostora na 500m, ograničenjem kernel memorije na 50m, deljenjem CPU-a na 512, blkioweight na 400. Deljenje CPU-a je odnos koji kontroliše upotrebu CPU-a kontejnera. Ima podrazumevanu vrednost od 1024 i opseg između 0 i 1024. Ako tri kontejnera imaju isto deljenje CPU-a od 1024, svaki kontejner može koristiti do 33% CPU-a u slučaju sukoba resursa CPU-a. blkio-weight je odnos koji kontroliše IO kontejnera. Ima podrazumevanu vrednost od 500 i opseg između 10 i 1000.

docker run -it -m 500M --kernel-memory 50M --cpu-shares 512 --blkio-weight 400 --name ubuntu1 ubuntu bash

Da biste dobili cgroup kontejnera, možete uraditi:

docker run -dt --rm denial sleep 1234 #Run a large sleep inside a Debian container
ps -ef | grep 1234 #Get info about the sleep process
ls -l /proc/<PID>/ns #Get the Group and the namespaces (some may be uniq to the hosts and some may be shred with it)

Za više informacija pogledajte:

pageCGroups

Mogućnosti

Mogućnosti omogućavaju finiju kontrolu mogućnosti koje se mogu dozvoliti za korisnika root. Docker koristi mogućnost funkcije jezgra Linux-a da ograniči operacije koje se mogu obaviti unutar kontejnera bez obzira na vrstu korisnika.

Kada se pokrene docker kontejner, proces odbacuje osetljive mogućnosti koje bi proces mogao koristiti da pobegne iz izolacije. Ovo pokušava da osigura da proces neće moći da izvrši osetljive radnje i pobegne:

pageLinux Capabilities

Seccomp u Docker-u

Ovo je sigurnosna funkcija koja omogućava Docker-u da ograniči syscalls koji se mogu koristiti unutar kontejnera:

pageSeccomp

AppArmor u Docker-u

AppArmor je poboljšanje jezgra za ograničavanje kontejnera na ograničen skup resursa sa profilima po programu.:

pageAppArmor

SELinux u Docker-u

  • Sistem označavanja: SELinux dodeljuje jedinstvenu oznaku svakom procesu i objektu datotečnog sistema.

  • Sprovođenje politike: Sprovodi sigurnosne politike koje definišu koje radnje oznaka procesa može izvršiti na drugim oznakama unutar sistema.

  • Oznake procesa kontejnera: Kada motori kontejnera pokrenu procese kontejnera, obično im se dodeljuje ograničena SELinux oznaka, obično container_t.

  • Označavanje datoteka unutar kontejnera: Datoteke unutar kontejnera obično su označene kao container_file_t.

  • Pravila politike: SELinux politika pretežno osigurava da procesi sa oznakom container_t mogu samo da interaguju (čitaju, pišu, izvršavaju) sa datotekama označenim kao container_file_t.

Ovaj mehanizam osigurava da čak i ako je proces unutar kontejnera kompromitovan, ograničen je na interakciju samo sa objektima koji imaju odgovarajuće oznake, značajno ograničavajući potencijalnu štetu od takvih kompromitovanja.

pageSELinux

AuthZ & AuthN

U Docker-u, autorizacioni dodatak igra ključnu ulogu u sigurnosti odlučujući da li da dozvoli ili blokira zahteve ka Docker demonu. Ova odluka se donosi ispitivanjem dva ključna konteksta:

  • Kontekst autentifikacije: Ovo uključuje sveobuhvatne informacije o korisniku, kao što su ko su i kako su se autentifikovali.

  • Kontekst komande: Ovo obuhvata sve relevantne podatke vezane za zahtev koji se pravi.

Ovi konteksti pomažu da se osigura da se obrađuju samo legitimni zahtevi od autentifikovanih korisnika, poboljšavajući sigurnost Docker operacija.

pageAuthZ& AuthN - Docker Access Authorization Plugin

DoS iz kontejnera

Ako pravilno ne ograničavate resurse koje kontejner može koristiti, kompromitovan kontejner može DoS-ovati host na kojem se izvršava.

  • CPU DoS

# stress-ng
sudo apt-get install -y stress-ng && stress-ng --vm 1 --vm-bytes 1G --verify -t 5m

# While loop
docker run -d --name malicious-container -c 512 busybox sh -c 'while true; do :; done'
  • DoS napad na propusnost

nc -lvp 4444 >/dev/null & while true; do cat /dev/urandom | nc <target IP> 4444; done

Zanimljive Docker zastavice

--privileged zastavica

Na sledećoj stranici možete saznati šta podrazumeva zastavica --privileged:

pageDocker --privileged

--security-opt

no-new-privileges

Ako pokrećete kontejner gde napadač uspe da pristupi kao korisnik sa niskim privilegijama. Ako imate pogrešno konfigurisan suid binarni fajl, napadač može zloupotrebiti to i povećati privilegije unutar kontejnera. Što mu može omogućiti da pobegne iz njega.

Pokretanje kontejnera sa opcijom no-new-privileges omogućiće sprečavanje ovakvog povećanja privilegija.

docker run -it --security-opt=no-new-privileges:true nonewpriv

Ostalo

#You can manually add/drop capabilities with
--cap-add
--cap-drop

# You can manually disable seccomp in docker with
--security-opt seccomp=unconfined

# You can manually disable seccomp in docker with
--security-opt apparmor=unconfined

# You can manually disable selinux in docker with
--security-opt label:disable

Za više --security-opt opcija proverite: https://docs.docker.com/engine/reference/run/#security-configuration

Ostale bezbednosne razmatranja

Upravljanje Tajnama: Najbolje Prakse

Važno je izbegavati ugradnju tajni direktno u Docker slike ili korišćenje okružnih promenljivih, jer ovi metodi izlažu vaše osetljive informacije svakome ko ima pristup kontejneru putem komandi poput docker inspect ili exec.

Docker volumeni su sigurnija alternativa, preporučena za pristup osetljivim informacijama. Mogu se koristiti kao privremeni fajl sistem u memoriji, smanjujući rizike povezane sa docker inspect i logovanjem. Međutim, korisnici sa administratorskim pravima i oni sa exec pristupom kontejneru i dalje mogu pristupiti tajnama.

Docker tajne nude još sigurniji metod za rukovanje osetljivim informacijama. Za slučajeve koji zahtevaju tajne tokom faze izgradnje slike, BuildKit predstavlja efikasno rešenje sa podrškom za tajne tokom izgradnje, poboljšavajući brzinu izgradnje i pružajući dodatne funkcije.

Da biste iskoristili BuildKit, može se aktivirati na tri načina:

  1. Putem okružne promenljive: export DOCKER_BUILDKIT=1

  2. Dodavanjem prefiksa komandama: DOCKER_BUILDKIT=1 docker build .

  3. Omogućavanjem kao podrazumevano u Docker konfiguraciji: { "features": { "buildkit": true } }, praćeno restartovanjem Dockera.

BuildKit omogućava korišćenje tajni tokom izgradnje sa opcijom --secret, obezbeđujući da ove tajne nisu uključene u keš izgradnje slike ili konačnu sliku, korišćenjem komande poput:

docker build --secret my_key=my_value ,src=path/to/my_secret_file .

Za tajne potrebne u pokrenutom kontejneru, Docker Compose i Kubernetes nude robustna rešenja. Docker Compose koristi ključ secrets u definiciji servisa za specificiranje tajnih fajlova, kako je prikazano u primeru docker-compose.yml:

version: "3.7"
services:
my_service:
image: centos:7
entrypoint: "cat /run/secrets/my_secret"
secrets:
- my_secret
secrets:
my_secret:
file: ./my_secret_file.txt

Ova konfiguracija omogućava korišćenje tajni prilikom pokretanja usluga pomoću Docker Compose-a.

U Kubernetes okruženjima, tajne su podržane na nivou platforme i mogu se dalje upravljati alatima poput Helm-Secrets. Upravljanje tajnama u Kubernetes-u putem Role Based Access Controls (RBAC) poboljšava sigurnost upravljanja tajnama, slično kao u Docker Enterprise-u.

gVisor

gVisor je jezgro aplikacije, napisano u Go-u, koje implementira značajan deo Linux sistemskog površinskog sloja. Uključuje Open Container Initiative (OCI) runtime nazvan runsc koji pruža izolacionu granicu između aplikacije i jezgra domaćina. Runtime runsc se integriše sa Dockerom i Kubernetesom, čime se olakšava pokretanje kontejnera u pesku.

Kata kontejneri

Kata kontejneri su zajednica otvorenog koda koja radi na izgradnji sigurnog runtime-a kontejnera sa lakim virtuelnim mašinama koje se ponašaju i izvode kao kontejneri, ali pružaju jaču izolaciju radnog opterećenja korišćenjem tehnologije hardverske virtualizacije kao drugog sloja odbrane.

Saveti za rezime

  • Ne koristite --privileged zastavicu ili montirajte Docker socket unutar kontejnera. Docker socket omogućava pokretanje kontejnera, pa je to jednostavan način da se preuzme potpuna kontrola nad domaćinom, na primer, pokretanjem drugog kontejnera sa --privileged zastavicom.

  • Ne pokrećite kao root unutar kontejnera. Koristite različitog korisnika i user namespaces. Root u kontejneru je isti kao na domaćinu osim ako nije preusmeren pomoću user namespaces-a. On je samo delimično ograničen, pre svega, Linux namespaces-ima, mogućnostima i cgroups-ima.

  • Odbacite sve mogućnosti (--cap-drop=all) i omogućite samo one koje su potrebne (--cap-add=...). Mnogi radni opterećenja ne zahtevaju nikakve mogućnosti, a dodavanje njih povećava opseg potencijalnog napada.

  • Koristite sigurnosnu opciju “no-new-privileges” da sprečite procese da steknu više privilegija, na primer putem suid binarnih fajlova.

  • Ograničite resurse dostupne kontejneru. Ograničenja resursa mogu zaštititi mašinu od napada uskraćivanjem usluge.

  • Prilagodite seccomp, AppArmor (ili SELinux) profile da ograničite radnje i sistemske pozive dostupne kontejneru na minimum potreban.

  • Koristite zvanične Docker slike i zahtevajte potpise ili izgradite svoje zasnovane na njima. Ne nasleđujte ili ne koristite zaražene slike. Takođe čuvajte root ključeve, lozinke na sigurnom mestu. Docker ima planove za upravljanje ključevima sa UCP-om.

  • Redovno ponovo izgradite svoje slike da primenite sigurnosne zakrpe na domaćinu i slikama.

  • Mudro upravljajte svojim tajnama tako da je teško napadaču da im pristupi.

  • Ako izlažete docker demon koristite HTTPS sa autentifikacijom klijenta i servera.

  • U svom Dockerfile-u, favorizujte KOPY umesto DODAJ. DODAJ automatski izvlači zipovane fajlove i može kopirati fajlove sa URL-ova. KOPY nema ove mogućnosti. Kad god je moguće, izbegavajte korišćenje DODAJ kako ne biste bili podložni napadima putem udaljenih URL-ova i Zip fajlova.

  • Imajte posebne kontejnere za svaku mikro-servisu

  • Ne stavljajte ssh unutar kontejnera, “docker exec” se može koristiti za ssh na kontejner.

  • Imajte manje slike kontejnera

Bekstvo iz Docker-a / Eskalacija privilegija

Ako ste unutar Docker kontejnera ili imate pristup korisniku u docker grupi, možete pokušati pobegnuti i eskalirati privilegije:

pageDocker Breakout / Privilege Escalation

Bajpasovanje Docker autentifikacionog dodatka

Ako imate pristup docker socket-u ili pristup korisniku u docker grupi ali vaše akcije su ograničene autentifikacionim dodatkom za docker, proverite da li ga možete bajpasovati:

pageAuthZ& AuthN - Docker Access Authorization Plugin

Ojačavanje Docker-a

Reference

Koristite Trickest da lako izgradite i automatizujete radne tokove pokretane najnaprednijim alatima zajednice na svetu. Pristupite danas:

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Last updated