Docker Security
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Use Trickest to easily build and automate workflows powered by the world's most advanced community tools. Get Access Today:
Docker engine koristi Namespaces i Cgroups Linux kernela za izolaciju kontejnera, pružajući osnovni sloj sigurnosti. 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 akcije korisnika.
Docker engine može se pristupiti lokalno putem Unix soketa ili daljinski koristeći HTTP. Za daljinski pristup, neophodno je koristiti HTTPS i TLS kako bi se obezbedila poverljivost, integritet i autentifikacija.
Docker engine, po defaultu, sluša na Unix soketu na unix:///var/run/docker.sock
. Na Ubuntu sistemima, opcije pokretanja Dockera su definisane u /etc/default/docker
. Da biste omogućili daljinski pristup Docker API-ju i klijentu, izložite Docker demon preko HTTP soketa dodavanjem sledećih podešavanja:
Međutim, izlaganje Docker demona preko HTTP-a nije preporučljivo zbog bezbednosnih problema. Preporučuje se osiguranje veza korišćenjem HTTPS-a. Postoje dva glavna pristupa za osiguranje veze:
Klijent verifikuje identitet servera.
I klijent i server međusobno autentifikuju identitet jedan drugog.
Sertifikati se koriste za potvrdu identiteta servera. Za detaljne primere oba metoda, pogledajte ovaj vodič.
Slike kontejnera mogu biti smeštene u privatnim ili javnim repozitorijumima. Docker nudi nekoliko opcija za skladištenje slika kontejnera:
Docker Hub: Javni registar usluga od Docker-a.
Docker Registry: Open-source projekat koji omogućava korisnicima da hostuju svoj registar.
Docker Trusted Registry: Komercijalna ponuda Docker-ovog registra, koja sadrži autentifikaciju korisnika zasnovanu na rolama i integraciju sa LDAP servisima.
Kontejneri mogu imati bezbednosne ranjivosti ili zbog osnovne slike ili zbog softvera instaliranog na osnovnoj slici. Docker radi na projektu pod nazivom Nautilus koji vrši bezbednosno skeniranje kontejnera i navodi ranjivosti. Nautilus funkcioniše tako što upoređuje svaku sloj slike kontejnera sa repozitorijumom ranjivosti kako bi identifikovao bezbednosne rupe.
Za više informacija pročitajte ovo.
docker scan
Komanda docker scan
vam omogućava da skenirate postojeće Docker slike koristeći ime ili ID slike. Na primer, pokrenite sledeću komandu da skenirate hello-world sliku:
Docker image signing osigurava sigurnost i integritet slika korišćenih u kontejnerima. Evo sažetka:
Da aktivirate Docker content trust, postavite export DOCKER_CONTENT_TRUST=1
. Ova funkcija je isključena po defaultu u Docker verziji 1.10 i novijim.
Sa ovom funkcijom aktiviranom, samo potpisane slike mogu biti preuzete. Prvo slanje slike zahteva postavljanje lozinki za root i tagging ključeve, pri čemu Docker takođe podržava Yubikey za poboljšanu sigurnost. Više detalja možete pronaći ovde.
Pokušaj preuzimanja nepodpisane slike sa aktiviranim content trust rezultira greškom "No trust data for latest".
Za slanja slika nakon prvog, Docker traži lozinku repozitorijumskog ključa za potpisivanje slike.
Da biste napravili rezervnu kopiju svojih privatnih ključeva, koristite komandu:
Kada se prebacujete između Docker hostova, neophodno je premestiti root i repozitorijum ključeve kako bi se održale operacije.
Koristite Trickest za lako kreiranje i automatizaciju radnih tokova pokretanih najnaprednijim alatima zajednice. Pribavite pristup danas:
Namespaces su funkcija Linux kernela koja particionira kernel resurse tako da jedan skup procesa vidi jedan skup resursa dok drugi skup procesa vidi drugi skup resursa. 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 namespaces proverite sledeću stranicu:
NamespacesFunkcija Linux kernela cgroups pruža mogućnost da ograniči resurse kao što su cpu, memorija, io, propusnost mreže među skupom procesa. Docker omogućava kreiranje kontejnera koristeći cgroup funkciju koja omogućava kontrolu resursa za specifični kontejner. Sledeći je kontejner kreiran sa memorijom korisničkog prostora ograničenom na 500m, memorijom kernela ograničenom na 50m, deljenjem cpu na 512, blkioweight na 400. Deljenje CPU-a je odnos koji kontroliše korišćenje 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 uzeti 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.
Da biste dobili cgroup kontejnera, možete uraditi:
Za više informacija proverite:
CGroupsKapaciteti omogućavaju finer control za kapacitete koji mogu biti dozvoljeni za root korisnika. Docker koristi funkciju kapaciteta Linux kernela da ograniči operacije koje se mogu izvesti unutar kontejnera bez obzira na tip korisnika.
Kada se docker kontejner pokrene, proces odbacuje osetljive kapacitete 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:
Linux CapabilitiesOvo je bezbednosna funkcija koja omogućava Dockeru da ograniči syscalls koji se mogu koristiti unutar kontejnera:
SeccompAppArmor je poboljšanje kernela koje ograničava kontejnere na ograničen skup resursa sa profilima po programu.:
AppArmorSistem označavanja: SELinux dodeljuje jedinstvenu oznaku svakom procesu i objektu datotečnog sistema.
Sprovođenje politika: Sprovodi bezbednosne politike koje definišu koje radnje oznaka procesa može izvesti na drugim oznakama unutar sistema.
Oznake procesa kontejnera: Kada motori kontejnera pokreću 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 prvenstveno osigurava da procesi sa oznakom container_t
mogu da interaguju (čitaju, pišu, izvršavaju) samo sa datotekama označenim kao container_file_t
.
Ovaj mehanizam osigurava da čak i ako je proces unutar kontejnera kompromitovan, on je ograničen na interakciju samo sa objektima koji imaju odgovarajuće oznake, značajno ograničavajući potencijalnu štetu od takvih kompromitovanja.
SELinuxU Dockeru, autorizacioni dodatak igra ključnu ulogu u bezbednosti odlučujući da li da dozvoli ili blokira zahteve ka Docker demon-u. 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 podnosi.
Ovi konteksti pomažu da se osigura da se obrađuju samo legitimni zahtevi od autentifikovanih korisnika, poboljšavajući bezbednost Docker operacija.
AuthZ& AuthN - Docker Access Authorization PluginAko ne ograničavate pravilno resurse koje kontejner može koristiti, kompromitovani kontejner bi mogao izazvati DoS na hostu na kojem se pokreće.
CPU DoS
Bandwidth DoS
Na sledećoj stranici možete saznati šta podrazumeva --privileged
zastavica:
Ako pokrećete kontejner u kojem napadač uspe da dobije pristup kao korisnik sa niskim privilegijama. Ako imate loše konfigurisanu suid binarnu datoteku, napadač može da je zloupotrebi i eskalira privilegije unutar kontejnera. Što mu može omogućiti da pobegne iz njega.
Pokretanje kontejnera sa no-new-privileges
opcijom omogućenom će sprečiti ovu vrstu eskalacije privilegija.
For more --security-opt
options check: https://docs.docker.com/engine/reference/run/#security-configuration
Važno je izbegavati ugrađivanje tajni direktno u Docker slike ili korišćenje promenljivih okruženja, jer ove metode izlažu vaše osetljive informacije svima koji imaju pristup kontejneru putem komandi kao što su 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 root privilegijama i oni sa exec
pristupom kontejneru i dalje mogu pristupiti tajnama.
Docker tajne nude još sigurniju metodu za rukovanje osetljivim informacijama. Za instance koje zahtevaju tajne tokom faze izgradnje slike, BuildKit predstavlja efikasno rešenje sa podrškom za tajne u vreme izgradnje, poboljšavajući brzinu izgradnje i pružajući dodatne funkcije.
Da biste iskoristili BuildKit, može se aktivirati na tri načina:
Kroz promenljivu okruženja: export DOCKER_BUILDKIT=1
Prefiksiranjem komandi: DOCKER_BUILDKIT=1 docker build .
Omogućavanjem po defaultu u Docker konfiguraciji: { "features": { "buildkit": true } }
, nakon čega sledi restart Dockera.
BuildKit omogućava korišćenje tajni u vreme izgradnje sa opcijom --secret
, osiguravajući da ove tajne nisu uključene u keš izgradnje slike ili konačnu sliku, koristeći komandu kao:
Za tajne potrebne u pokrenutom kontejneru, Docker Compose i Kubernetes nude robusna rešenja. Docker Compose koristi secrets
ključ u definiciji usluge za specificiranje tajnih datoteka, kao što je prikazano u docker-compose.yml
primeru:
Ova konfiguracija omogućava korišćenje tajni prilikom pokretanja servisa sa Docker Compose.
U Kubernetes okruženjima, tajne su nativno podržane i mogu se dodatno upravljati alatima kao što je Helm-Secrets. Kontrole pristupa zasnovane na rolama (RBAC) u Kubernetes-u poboljšavaju bezbednost upravljanja tajnama, slično kao u Docker Enterprise.
gVisor je aplikacioni kernel, napisan u Go, koji implementira značajan deo Linux sistemske površine. Uključuje Open Container Initiative (OCI) runtime pod nazivom runsc
koji pruža granicu izolacije između aplikacije i host kernela. runsc
runtime se integriše sa Docker-om i Kubernetes-om, što olakšava pokretanje sandboxed kontejnera.
Kata Containers je zajednica otvorenog koda koja radi na izgradnji sigurnog kontejnerskog runtime-a sa laganim virtuelnim mašinama koje se ponašaju i performiraju kao kontejneri, ali pružaju jaču izolaciju radnog opterećenja koristeći tehnologiju hardverske virtualizacije kao drugu liniju odbrane.
Ne koristite --privileged
flag ili montirajte Docker socket unutar kontejnera. Docker socket omogućava pokretanje kontejnera, tako da je to lak način da preuzmete potpunu kontrolu nad hostom, na primer, pokretanjem drugog kontejnera sa --privileged
flag-om.
Ne pokrećite kao root unutar kontejnera. Koristite drugog korisnika i user namespaces. Root u kontejneru je isti kao na hostu osim ako nije premapiran sa user namespaces. Samo je blago ograničen, prvenstveno, Linux namespaces, sposobnostima i cgroups.
Uklonite sve sposobnosti (--cap-drop=all
) i omogućite samo one koje su potrebne (--cap-add=...
). Mnoge radne opterećenja ne zahtevaju nikakve sposobnosti i njihovo dodavanje povećava opseg potencijalnog napada.
Koristite opciju bez novih privilegija da sprečite procese da dobiju više privilegija, na primer kroz suid binarne datoteke.
Ograničite resurse dostupne kontejneru. Ograničenja resursa mogu zaštititi mašinu od napada uskraćivanja usluga.
Koristite službene docker slike i zahtevajte potpise ili izgradite svoje na osnovu njih. Ne nasleđujte ili koristite backdoored slike. Takođe, čuvajte root ključeve, lozinke na sigurnom mestu. Docker planira da upravlja ključevima sa UCP.
Redovno ponovo izgradite svoje slike da primenite bezbednosne zakrpe na host i slike.
Pametno upravljajte svojim tajnama kako bi napadaču bilo teško da im pristupi.
Ako izlažete docker daemon koristite HTTPS sa autentifikacijom klijenta i servera.
U vašem Dockerfile-u, favorizujte COPY umesto ADD. ADD automatski ekstraktuje zipovane datoteke i može kopirati datoteke sa URL-ova. COPY nema te mogućnosti. Kada god je to moguće, izbegavajte korišćenje ADD kako ne biste bili podložni napadima putem udaljenih URL-ova i zip datoteka.
Imate odvojene kontejnere za svaku mikro-službu.
Ne stavljajte ssh unutar kontejnera, “docker exec” se može koristiti za ssh u kontejner.
Imate manje slike kontejnera.
Ako ste unutar docker kontejnera ili imate pristup korisniku u docker grupi, možete pokušati da pobegnete i eskalirate privilegije:
Docker Breakout / Privilege EscalationAko imate pristup docker socket-u ili imate pristup korisniku u docker grupi, ali su vaše akcije ograničene docker auth plugin-om, proverite da li možete da ga zaobiđete:
AuthZ& AuthN - Docker Access Authorization PluginAlat docker-bench-security je skripta koja proverava desetine uobičajenih najboljih praksi oko implementacije Docker kontejnera u produkciji. Testovi su svi automatizovani i zasnovani su na CIS Docker Benchmark v1.3.1. Morate pokrenuti alat sa hosta koji pokreće docker ili iz kontejnera sa dovoljno privilegija. Saznajte kako ga pokrenuti u README: https://github.com/docker/docker-bench-security.
Koristite Trickest da lako izgradite i automatizujete radne tokove pokretane od strane najnaprednijih alata zajednice. Pribavite pristup danas:
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)