Блог

Ojačavanje Docker kontejnera za hosting sa više korisnika: Vodič za izolaciju korak po korak

Naučite kako da zaštitite Docker kontejnere za okruženja sa više korisnika praktičnim sigurnosnim merama poput ne-root korisnika, uklonjenih mogućnosti, sistema datoteka samo za čitanje i mrežne izolacije.

Sažetak

Pokretanje platforme za Docker hosting sa više zakupaca zahteva hermetičnu izolaciju kontejnera kako bi se sprečilo da zakupci ometaju jedni druge ili pobegnu na host. Ovaj vodič pruža konkretan, korak-po-korak proces ojačavanja koji možete primeniti danas. Naučićete da konfigurišete ne-root korisnike, uklonite nepotrebne Linux mogućnosti, montirate sisteme datoteka samo za čitanje, nametnete ograničenja resursa putem cgroups, segmentirate mreže i primenite seccomp ili AppArmor profile. Takođe ćemo obraditi kada treba dopuniti kontejnere virtuelnim mašinama za maksimalnu sigurnost. Na kraju ćete imati kontrolnu listu za sistematsko uklanjanje uobičajenih vektora bekstva iz kontejnera i održavanje vaše infrastrukture sa više zakupaca istinski izolovanom.

Stvarni problem sa kontejnerima za više zakupaca

Docker kontejneri dele kernel hosta, a ako je izolacija pogrešno konfigurisana, jedan zakupac teoretski može pristupiti podacima drugog, potrošiti svu CPU snagu ili čak pobeći na host. Kao pružalac hosting usluga, potrebne su vam hermetične granice bez žrtvovanja performansi koje kontejneri pružaju. Mnogi timovi počinju sa podrazumevanim Docker podešavanjima, koja su dizajnirana za razvoj, a ne za produkciju sa više zakupaca. Dobra vest: uz sistematsku kontrolnu listu ojačavanja, možete zaključati svaki kontejner na nivo izolacije blizak VM, uz zadržavanje Dockerove brzine.

Ovaj članak vas vodi kroz svaki korak ojačavanja sa praktičnim primerima i napomenama. Na kraju ćete imati ponovljiv proces za bezbedno pokretanje kontejnera sa više zakupaca.

Korak 1: Pokrenite kontejnere kao ne-root

Podrazumevano, Docker kontejneri se pokreću kao root. Ako je kontejner kompromitovan, napadač dobija root privilegije unutar kontejnera i može pokušati bekstvo. Prvo, kreirajte namenskog korisnika u Dockerfile-u i pređite na njega:

FROM ubuntu:22.04
RUN useradd -m appuser
USER appuser

Napomena: Neki procesi (npr. vezivanje za portove < 1024) zahtevaju root. U tim slučajevima, koristite --cap-add zastavicu da biste dodelili samo potrebnu mogućnost, kao --cap-add=NET_BIND_SERVICE, i dalje pokrenite proces pod ne-root korisnikom.

Za više informacija o osnovnoj izolaciji, pogledajte naš vodič o postizanju istinske izolacije sa više zakupaca u Dockeru.

Korak 2: Uklonite sve Linux mogućnosti i dodajte nazad samo ono što vam treba

Linux mogućnosti razbijaju root privilegije u male jedinice. Docker kontejneri dolaze sa podrazumevanim skupom mogućnosti koje su previše permisivne za hosting sa više zakupaca. Uklonite sve i dodajte nazad samo ono što vaša aplikacija zahteva:

docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE my-app

Uobičajene mogućnosti koje treba izbegavati: SYS_ADMIN (bekstvo iz kontejnera), NET_RAW (presretanje paketa), SYS_PTRACE (debugovanje procesa). Koristite docker run sa --security-opt no-new-privileges da sprečite eskalaciju privilegija putem setuid binarnih datoteka.

Korak 3: Montirajte root sistem datoteka kao samo za čitanje

Napadači često pišu zlonamerne skripte u sistem datoteka kontejnera. Postavljanjem root sistema datoteka samo za čitanje to sprečavate:

docker run --read-only --tmpfs /tmp:rw,noexec,nosuid,size=64m my-app

--tmpfs kreira privremeni zapisivi mont za direktorijume poput /tmp i /var/run. noexec zastavica sprečava izvršavanje sa tog monta. Ovaj pristup primorava napadače da se preusmere kroz zapisive direktorijume, koje možete nadgledati.

Korak 4: Nametnite ograničenja resursa putem cgroups

Neograničeni kontejneri mogu izvršiti napade uskraćivanjem usluge iscrpljivanjem memorije ili CPU hosta. Koristite Dockerova izvršna ograničenja:

docker run --memory=512m --memory-swap=512m --cpus=0.5 --pids-limit=100 my-app
  • --memory i --memory-swap postavljaju čvrsta ograničenja (bez swap).
  • --cpus ograničava CPU.
  • --pids-limit sprečava fork bombe ograničavanjem broja procesa.

Napomena: Ograničenja resursa se sprovode putem cgroups, ali ne sprečavaju izvlačenje podataka putem mreže. Kombinujte sa mrežnom izolacijom (sledeći korak).

Korak 5: Segmentirajte mreže pomoću Docker prilagođenih mreža

Podrazumevano, Docker kontejneri dele mostnu mrežu. U postavci sa više zakupaca, morate izolovati mrežni stek svakog zakupca. Kreirajte namensku mrežu po zakupcu:

docker network create tenant-alpha --internal
docker run --network tenant-alpha my-app

Koristite --internal zastavicu da blokirate izlazni internet pristup, a zatim izložite samo potrebne portove putem -p. Za napredniju mrežnu segmentaciju, razmotrite osiguranje web aplikacija Docker izolacijom.

Napomena: Unutrašnje mreže sprečavaju direktnu komunikaciju kontejnera između zakupaca, ali curenje DNS-a i dalje može nastati ako koristite host mrežu. Držite se mostnih ili overlay mreža.

Korak 6: Primenite seccomp i AppArmor profile

Seccomp filtrira sistemske pozive, a AppArmor (ili SELinux) sprovodi obaveznu kontrolu pristupa. Docker pruža podrazumevani seccomp profil koji blokira opasne sistemske pozive poput clone sa određenim zastavicama. Za strožiju izolaciju, kreirajte prilagođeni profil:

docker run --security-opt seccomp=./custom.json --security-opt apparmor=docker-default my-app

Možete generisati osnovni profil sa docker run --rm -it --security-opt seccomp=unconfined my-app strace -c -S time i zatim ga smanjiti. Napomena: Previše restriktivni profili mogu pokvariti legitimnu funkcionalnost. Testirajte temeljno u staging okruženju.

Korak 7: Razmotrite hibridnu izolaciju sa virtuelnim mašinama

Ako vaši zakupci zahtevaju apsolutnu izolaciju (npr. regulisana industrija), pokrenite kontejnere unutar lake VM. Alati poput Sysbox ili Kata Containers pružaju hardversku separaciju bez žrtvovanja brzine kontejnera. Ovo je pristup koji koristi Docker Enhanced Container Isolation (ECI). Iako je režijski trošak veći od golih kontejnera, daleko je niži od punih VM po radnom opterećenju.

Za više informacija o odabiru pravog nivoa izolacije, pročitajte dizajniranje Docker arhitekture sa više zakupaca.

Sve zajedno: Kontrolna lista za ojačavanje

  1. Izgradite kontejnere sa ne-root korisnikom.
  2. Uklonite sve mogućnosti, dodajte samo potrebne.
  3. Montirajte sistem datoteka samo za čitanje sa privremenim zapisivim montovima.
  4. Postavite ograničenja memorije, CPU i PID-ova.
  5. Kreirajte izolovane Docker mreže po zakupcu.
  6. Primenite prilagođene seccomp i AppArmor profile.
  7. Procenite hibridne VM kontejnere za visoke sigurnosne potrebe.

Zaključak

Ojačavanje kontejnera nije jednokratni zadatak – to je stalna disciplina. Gornji koraci čine sigurnosnu osnovu za hosting sa više zakupaca. Zapamtite da nijedna pojedinačna mera ne garantuje sigurnost; odbrana u dubini je ključna. Počnite sa osnovama: ne-root korisnici i uklonjene mogućnosti. Zatim dodajte ograničenja resursa i mrežnu segmentaciju. Za najosetljivija radna opterećenja, kombinujte kontejnere sa VM. Uz ovaj vodič, možete samouvereno pokrenuti Docker okruženja sa više zakupaca koja su i efikasna i sigurna.

Sources (5)