Docker Security
Last updated
Naučite i vežbajte hakovanje AWS-a:HackTricks Obuka AWS Crveni Tim Stručnjak (ARTE) Naučite i vežbajte hakovanje GCP-a: HackTricks Obuka GCP Crveni Tim Stručnjak (GRTE)
Koristite Trickest da lako izgradite i automatizujete radne tokove pokretane najnaprednijim alatima zajednice. Dobijte pristup danas:
Docker engine koristi Linux kernel-ove Namespaces i Cgroups da izoluju kontejnere, pružajući osnovni sloj 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.
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 daemon preko HTTP soketa dodavanjem sledećih podešavanja:
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:
Klijent proverava identitet servera.
Klijent i server međusobno autentično proveravaju identitet.
Sertifikati se koriste za potvrdu identiteta servera. Za detaljne primere oba metoda, pogledajte ovaj vodič.
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, koja uključuje autentikaciju korisnika zasnovanu na ulogama i integraciju sa LDAP direktorijumskim servisima.
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 vam skeniranje postojećih Docker slika koristeći ime ili ID slike. Na primer, pokrenite sledeću komandu da skenirate sliku hello-world:
Potpisivanje Docker slike osigurava sigurnost i integritet slika korišćenih u kontejnerima. Evo sažetog objašnjenja:
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:
Kada prebacujete Docker domaćine, neophodno je premestiti root i repozitorijum ključeve kako biste održali operacije.
Koristite Trickest da lako izgradite i automatizujete radne tokove pokretane najnaprednijim alatima zajednice na svetu. Pristupite danas:
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:
NamespacesLinux 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 zauzeti 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 pogledajte:
CGroupsMoguć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 obavlja osetljive radnje i pobegne:
Linux CapabilitiesOvo je sigurnosna funkcija koja omogućava Docker-u da ograniči syscalls koji se mogu koristiti unutar kontejnera:
SeccompAppArmor je poboljšanje jezgra za ograničavanje kontejnera 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 politike: Sprovodi sigurnosne politike koje definišu koje radnje oznaka procesa može obavljati 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.
SELinuxU 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.
AuthZ& AuthN - Docker Access Authorization PluginAko pravilno ne ograničavate resurse koje kontejner može koristiti, kompromitovan kontejner može DoS-ovati host na kojem se izvršava.
CPU DoS
Napad na propusnost (Bandwidth DoS)
Na sledećoj stranici možete saznati šta podrazumeva zastavica --privileged
:
Ako pokrećete kontejner gde napadač uspe da dobije pristup 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.
Za više --security-opt
opcija proverite: https://docs.docker.com/engine/reference/run/#security-configuration
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 instance koje 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:
Putem okružne promenljive: export DOCKER_BUILDKIT=1
Dodavanjem prefiksa komandama: DOCKER_BUILDKIT=1 docker build .
Omogućavanjem kao podrazumevano u Docker konfiguraciji: { "features": { "buildkit": true } }
, praćeno restartovanjem Docker-a.
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:
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
:
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 je aplikaciono jezgro napisano u Go-u, koje implementira značajan deo Linux sistemskog interfejsa. Uključuje Open Container Initiative (OCI) pokretač zvani runsc
koji pruža izolacionu granicu između aplikacije i host jezgra. Pokretač runsc
se integriše sa Dockerom i Kubernetes-om, čime se olakšava pokretanje kontejnera u pesku.
Kata Containers je zajednica otvorenog koda koja radi na izgradnji sigurnog pokretač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.
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 hostom, 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 hostu osim ako nije preusmeren pomoću user namespaces-a. On je samo delimično ograničen, pretežno, 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 istih povećava obim potencijalnog napada.
Koristite opciju bez novih privilegija 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.
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 hostu i slikama.
Mudro upravljajte svojim tajnama kako bi bilo 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-servis
Ne stavljajte ssh unutar kontejnera, "docker exec" se može koristiti za ssh na kontejner.
Imajte manje slike kontejnera
Ako ste unutar Docker kontejnera ili imate pristup korisniku u docker grupi, možete pokušati pobegnuti i eskalirati privilegije:
Docker Breakout / Privilege EscalationAko imate pristup Docker socket-u ili imate pristup korisniku u docker grupi ali vaše akcije su ograničene Docker autentifikacionim dodatkom, proverite da li ga možete bajpasovati:
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 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-u: https://github.com/docker/docker-bench-security.
Koristite Trickest da lako izgradite i automatizujete radne tokove pokretane najnaprednijim alatima zajednice. Pristupite danas:
Naučite i vežbajte hakovanje AWS-a: HackTricks Training AWS Red Team Expert (ARTE) Naučite i vežbajte hakovanje GCP-a: HackTricks Training GCP Red Team Expert (GRTE)