Blog

Vodič korak po korak za višekorisničku (multi-tenant) Docker izolaciju

Izolirajte višekorisnička radna opterećenja u Dockeru uz kontrolu troškova hostinga. Naučite kako konfigurirati imenske prostore (namespaces), cgroups, mrežne politike i ojačavanje runtime okruženja.

Sažetak

Upravljanje zajedničkom infrastrukturom za kampanje više klijenata ili interne web stranice često izaziva nesuglasice s rukovodstvom oko troškova hostinga i sigurnosti podataka. Docker kontejneri pružaju laganu alternativu namjenskim virtuelnim mašinama, ali zadane postavke ostavljaju ozbiljne sigurnosne propuste u izolaciji. Prava višekorisnička arhitektura (multi-tenancy) zahtijeva promišljene granice na nivou kernela, procesa, mreže i pohrane. Ovaj vodič donosi praktičan okvir u pet koraka za osiguravanje višekorisničkih Docker implementacija korištenjem izvornih Linux primitivnih mehanizama izolacije. Naučit ćete kako nametnuti kvote resursa, ograničiti privilegije procesa, segmentirati mreže kontejnera i odabrati pravi nivo izolacije. Prateći ovaj plan, možete zaštititi okruženja klijenata i opravdati budžete za infrastrukturu pred netehničkim dioničarima.

Vaš netehnički menadžer ulazi u vaš radni prostor s ispisom računa za cloud hosting iz prošlog mjeseca. Troškovi su porasli, a nekoliko odredišnih stranica (landing pages) visokog prioriteta imalo je skokove u latenciji tokom istovremenog lansiranja proizvoda. Od vas se traži da objasnite zašto marketinški resursi dijele servere, jesu li podaci klijenata izloženi i zašto tim ne može pokrenuti skupu namjensku virtuelnu mašinu za svaku pojedinačnu kampanju.

Dodjeljivanje vlastite virtuelne mašine (VM) svakom digitalnom resursu eliminiše problem "bučnih susjeda" (noisy neighbors), ali brzo troši vaš operativni budžet. Standardne Docker implementacije rješavaju problem troškova pokretanjem više stranica na jednom kernelu operativnog sistema, ali zadane konfiguracije ostavljaju opasne propuste u izolaciji. Ako aplikacija jednog korisnika naiđe na nekontrolisanu skriptu ili doživi zlonamjerni upad, svaka druga aplikacija na tom zajedničkom hostu je u opasnosti.

Iskoristite ovaj tehnički plan korak po korak za konfiguraciju rigorozne višekorisničke izolacije u Dockeru. Primijenite ovih pet operativnih koraka kako biste zaštitili stabilnost sistema, izolirali podatke korisnika i preveli tehničke infrastrukturne odluke u jasnu poslovnu vrijednost za vaše rukovodstvo.


1. Nametnite stroge kvote resursa koristeći kontrolne grupe (cgroups)

Odmah postavite eksplicitna ograničenja za CPU, memoriju i I/O diska na svakom kontejneru. Kada više korisnika dijeli isti host, neograničeni kontejneri se takmiče za sistemske resurse. Jedan nekontrolisani upit bazi podataka ili kampanja s velikim prometom mogu potrošiti cjelokupnu memoriju hosta, što dovodi do toga da Linux Out-Of-Memory (OOM) killer nasumično gasi sistemske procese.

Linux kontrolne grupe (cgroups) upravljaju time koliko računarskog kapaciteta bilo koji kontejner može potrošiti. Primijenite ove granice direktno u vašim definicijama implementacije:

services:
  tenant_app:
    image: nginx:alpine
    deploy:
      resources:
        limits:
          cpus: '0.75'
          memory: 512M
        reservations:
          cpus: '0.25'
          memory: 256M
  • Ograničenja memorije (limits.memory): Uspostavljaju fiksni gornji limit. Ako kontejner pređe 512 megabajta, kernel gasi procese unutar tog kontejnera bez utjecaja na susjedne korisnike.
  • Rezervacije memorije (reservations.memory): Garantuju osnovnu alokaciju memorije kako bi aplikacije s niskim prometom ostale responzivne.
  • Ograničenja CPU-a (limits.cpus): Ograničavaju kontejner na maksimalni dio dostupnih CPU jezgri, sprečavajući da jedan korisnik zauzme sav CPU.

Kada ovu arhitekturu pravdate netehničkim rukovodiocima, objasnite cgroups kao automatizirana digitalna podbrojila. Baš kao što zakupci u poslovnoj zgradi plaćaju svoju individualnu potrošnju struje umjesto da preopterete glavni osigurač, cgroups osiguravaju da jedna odredišna stranica s velikim prometom nikada ne sruši portal za generisanje potencijalnih klijenata drugog klijenta. Za detaljniji uvid u arhitektonske kompromise, pogledajte naš vodič o dizajniranju višekorisničke Docker arhitekture i nivoa izolacije.


2. Segmentirajte procese korisnika pomoću imenskih prostora (namespaces) i ne-root korisnika

Nikada nemojte pokretati procese u kontejneru kao zadani root korisnik. U standardnim Linux kontejnerskim okruženjima, root unutar kontejnera odgovara rootu na kernelu hosta, osim ako nije eksplicitno remapiran. Ako napadač kompromituje web aplikaciju koja radi kao root, dobija povišene privilegije nad zajedničkim hostom.

Nametnite izolaciju procesa putem korisničkih imenskih prostora (user namespaces) i eksplicitnog izvršavanja bez root ovlaštenja:

  1. Definišite neprivilegovane runtime korisnike: Kreirajte namjenske servisne korisnike s niskim privilegijama unutar vaših Dockerfile-ova.
    FROM php:8.2-fpm-alpine
    RUN addgroup -g 10001 tenantgroup && \n       adduser -u 10001 -D -G tenantgroup tenantuser
    USER tenantuser
    
  2. Omogućite korisničke imenske prostore (userns-remap): Konfigurišite Docker daemon (/etc/docker/daemon.json) za remapiranje korisničkih ID-eva kontejnera na neprivilegovani raspon na hostu.
    {
      "userns-remap": "default"
    }
    

Linux imenski prostori (namespaces) dijele vidljivost sistema. Imenski prostor ID-eva procesa (PID) osigurava da Korisnik A ne može vidjeti, slati signale ili gasiti procese koji pripadaju Korisniku B. Mount (MNT) imenski prostor daje svakom korisniku izolirani prikaz datotečnog sistema, dok IPC imenski prostori blokiraju neovlaštenu komunikaciju među procesima.

Remapiranje korisničkih imenskih prostora neutrališe vektore bijega iz kontejnera: proces koji unutar kontejnera smatra da je root (UID 0) mapira se na neprivilegovani ID (kao što je UID 165536) na host mašini. Ako napadač uspije zaobići barijere kontejnera, dospijeva u neprivilegovani shell i ne može mijenjati konfiguracije hosta niti pristupati direktorijima susjednih korisnika.


3. Uklonite privilegije kernela i nametnite datotečne sisteme samo za čitanje (Read-Only)

Smanjite dostupne Linux mogućnosti (capabilities) i učinite korijenski datotečni sistem kontejnera nepromjenjivim pri pokretanju. Zadana okruženja za izvršavanje kontejnera dodjeljuju oko desetak mogućnosti Linux kernela, od kojih mnoge web aplikacijama nikada nisu potrebne. Višak mogućnosti pruža napadačima alate za manipulaciju mrežnim rutiranjem, izmjenu sata hosta ili zaobilaženje kontrola pristupa datotekama.

Osigurajte kontejnere uklanjanjem svih zadanih mogućnosti i vraćanjem samo osnovnih operativnih zastavica:

services:
  tenant_web:
    image: custom-nginx:latest
    read_only: true
    cap_drop:
      - ALL
    cap_add:
      - NET_BIND_SERVICE
    security_opt:
      - no-new-privileges:true
      - seccomp=default.json
    tmpfs:
      - /tmp:rw,noexec,nosuid,size=64m
      - /var/run:rw,noexec,nosuid,size=16m
  • cap_drop: - ALL: Uklanja svaku mogućnost kernela iz procesa kontejnera.
  • cap_add: - NET_BIND_SERVICE: Eksplicitno dozvoljava vezivanje za privilegovane portove (poput 80 i 443), dok blokira direktnu manipulaciju mrežnim socketima.
  • read_only: true: Montira cijeli korijenski datotečni sistem kontejnera samo za čitanje. Napadači ne mogu preuzimati zlonamjerne binarne datoteke, mijenjati PHP skripte niti preuređivati konfiguracijske datoteke web servera.
  • tmpfs: Alocira privremene direktorije u radnoj memoriji za neophodne radne datoteke (poput /tmp), dok blokira izvršavanje binarnih datoteka (noexec) i eskalaciju privilegija (nosuid).

Primijenite filtere sigurnog računanja (seccomp) i sigurnosne module kao što su AppArmor ili SELinux kako biste presreli i ograničili sistemske pozive upućene zajedničkom kernelu hosta. Ako vaš tim upravlja prilagođenim verzijama web aplikacija, slijedite naše strukturirane korake za učvršćivanje Docker kontejnera za višekorisničku izolaciju kroz vaše razvojne i distribucijske cikluse.


4. Particionirajte mreže između korisničkih okruženja

Onemogućite zadanu bridge mrežu i uspostavite prilagođene, izolirane softverski definirane bridge mreže za svaki korisnički stog. Prema zadanim postavkama, kontejneri postavljeni na standardnu Docker bridge mrežu mogu se međusobno otkrivati i komunicirati putem internih IP adresa. Ranjivost u marketinškom mikroservisu jednog korisnika omogućava lateralno kretanje prema svakoj drugoj internoj bazi podataka i aplikaciji na tom hostu.

Potpuno izolirajte saobraćaj korisnika deklarisanjem nezavisnih mrežnih bridgeva po korisniku:

networks:
  tenant_alpha_net:
    driver: bridge
    internal: true
  tenant_beta_net:
    driver: bridge
    internal: true
  public_gateway_net:
    driver: bridge

services:
  alpha_app:
    image: tenant_a_app:latest
    networks:
      - tenant_alpha_net
      - public_gateway_net

  alpha_db:
    image: mariadb:10.11
    networks:
      - tenant_alpha_net

  beta_app:
    image: tenant_b_app:latest
    networks:
      - tenant_beta_net
      - public_gateway_net

  beta_db:
    image: mariadb:10.11
    networks:
      - tenant_beta_net
  • Korisnička izolacija: alpha_app i alpha_db komuniciraju isključivo putem tenant_alpha_net. beta_app ne može pristupiti alpha_db, čak i ako napadač skenira internu podmrežu.
  • Oznaka Internal (internal: true): Sprečava mreže baza podataka da direktno usmjeravaju saobraćaj prema vanjskom internetu, ograničavajući ulazni i izlazni pristup isključivo na aplikacijske kontejnere.
  • Reverse Proxy Gateway: Samo se ulazni proxy povezuje na public_gateway_net kako bi usmjerio dolazne HTTP/HTTPS zahtjeve prema određenom kontejneru korisnika na osnovu naziva hosta.

Za naprednija okruženja, razmotrite Dockerove načine poboljšane izolacije kontejnera (ECI) ili runtime okruženja poput Sysboxa, koji automatski nameću strože granice korisničkih imenskih prostora i virtuelizirane /proc i /sys datotečne sisteme bez kompleksnog ručnog mrežnog skriptiranja.


5. Uspostavite objektivnu matricu odlučivanja za višekorisničku arhitekturu

Odbacite pretpostavku da svi digitalni resursi zahtijevaju namjenske virtuelne mašine. Marketinški lideri često pretpostavljaju da je izolacija na nivou hardverskih VM-ova jedini prihvatljiv sigurnosni model. U praksi, dodjeljivanje namjenskih VM-ova za jednostavne odredišne stranice ili kratkotrajne kampanje stvara ogromno povećanje troškova i operativnog održavanja bez stvarnog unapređenja sigurnosti web aplikacije.

Koristite sljedeću matricu za poređenje kako biste procijenili zahtjeve radnog opterećenja i predstavili racionalnu strategiju implementacije donosiocima odluka:

Nivo izolacijeTehnologija u pozadiniSigurnosna granicaRežijski troškovi resursaNajbolji primjer upotrebe
Kontejneri na zajedničkom stoguNamespaces i Cgroups na jednom OS-uLogička izolacija na nivou OS-aVeoma niskiOdredišne stranice s velikim prometom, interna staging okruženja, privremene stranice kampanja
Ojačani kontejneri (ECI / Sysbox)Korisnički imenski prostori, AppArmor, Read-Only rootNapredni nivo OS-a i virtuelizacijaNiskiAgencijski hosting za više klijenata, autentificirani portali, osjetljivi marketinški obrasci
Namjenske virtuelne mašine (VM)Hardverska virtuelizacija putem hipervizoraStrogo odvajanje hardvera/kernelaVisokiObrada plaćanja, regulisani HIPAA/PCI podaci, izvršavanje nepouzdanog prilagođenog koda
Hibridni model (Kontejneri u namjenskim VM-ovima)Ojačani kontejneri unutar specifičnih VM-ova po korisnikuVišeslojne hardverske i OS graniceUmjereni do visokiKorisnici na nivou velikih preduzeća koji zahtijevaju striktnu ugovornu usklađenost

Procijenite svaki projekat prema strogim kriterijima prije alokacije infrastrukturnog budžeta:

  1. Osjetljivost podataka: Da li projekat pohranjuje regulatorno osjetljive podatke (npr. podatke o kreditnim karticama ili medicinske podatke)? Ako jeste, implementirajte ga na namjenski VM.
  2. Porijeklo koda: Da li implementirate standardizirani kod koji je pregledao tim ili dozvoljavate neprovjerene dodatke trećih strana? Standardni kod pripada ojačanim kontejnerima; neprovjereni kod trećih strana zahtijeva izolaciju putem hipervizora.
  3. Budžet i vijek trajanja: Za sezonske odredišne stranice i glavne web stranice kompanije, višekorisnički rad u ojačanim kontejnerima pruža maksimalne performanse po uloženom novcu.

Kada prezentujete infrastrukturne planove rukovodstvu, konsultujte naš vodič o procjeni kada klijentima trebaju namjenski VM-ovi kako biste svoje preporuke potkrijepili jasnim argumentima zasnovanim na nivoima izolacije.


Zaključak: Prevođenje sigurnosnih kontrola u poslovni ROI

Osiguravanje višekorisničkog Docker okruženja ne zahtijeva budžet za enterprise cloud arhitekturu. Ono zahtijeva rigoroznu, disciplinovanu primjenu kontrola operativnog sistema.

Kada pregledate infrastrukturu s netehničkim rukovodstvom, uokvirite ove tehničke konfiguracije kroz tri metrike ključne za menadžment:

  • Troškovna efikasnost: Višekorisnički kontejneri omogućavaju timu da hostuje desetine marketinških stranica na djeliću računarskih resursa potrebnih za pojedinačne VM-ove.
  • Zaštita dostupnosti (Uptime): Kontrolne grupe garantuju da skokovi prometa na sezonskoj kampanji neće narušiti performanse ključnih web stranica brenda.
  • Ograničavanje radijusa štete (Blast Radius): Datotečni sistemi samo za čitanje, ukinute mogućnosti i izolirani mrežni bridgevi osiguravaju da propust na jednoj stranici ne može ugroziti baze podataka susjednih klijenata niti kontrole hosta.

Sistematski implementirajte ove zaštitne mehanizme u vaše predloške kontejnera. Isporučit ćete infrastrukturu visokih performansi i isplativosti koja zadovoljava i inženjerske sigurnosne standarde i budžetska ograničenja menadžmenta.

Sources (5)