Blog

Detaljan vodič za višezakupničku Docker izolaciju korak po korak

Izolirajte višezakupnička radna opterećenja u Dockeru uz kontrolu troškova hostinga. Saznajte kako konfigurirati imenske prostore, cgroups, mrežna pravila i očvrsnuti runtime.

Sažetak

Upravljanje dijeljenom infrastrukturom za više klijentskih kampanja ili internih web sjedišta često stvara nesuglasice s upravom oko troškova hostinga i sigurnosti podataka. Docker kontejneri pružaju laganu alternativu namjenskim virtualnim strojevima, no zadane postavke ostavljaju ozbiljne sigurnosne propuste u izolaciji. Prava višezakupnička arhitektura (multi-tenancy) zahtijeva promišljene granice na razini kernela, procesa, mreže i pohrane. Ovaj vodič donosi praktičan okvir u pet koraka za osiguravanje višezakupničkih Docker implementacija pomoću izvornih mehanizama izolacije u Linuxu. Naučit ćete kako nametnuti kvote resursa, ograničiti privilegije procesa, segmentirati mreže kontejnera i odabrati pravu razinu izolacije. Slijedeći ovaj plan, možete zaštititi okruženja zakupaca i opravdati infrastrukturni budžet netehničkim dionicima.

Vaš netehnički menadžer ulazi u ured s ispisanim računom za hosting u oblaku za prošli mjesec. Troškovi su porasli, a nekoliko odredišnih stranica visokog prioriteta zabilježilo je skokove u latenciji tijekom istovremenog lansiranja proizvoda. Od vas se traži objašnjenje zašto marketinški resursi dijele poslužitelje, jesu li podaci klijenata izloženi i zašto tim ne može podići skupi namjenski virtualni stroj za svaku pojedinu kampanju.

Dodjeljivanje zasebnog virtualnog stroja (VM) svakom digitalnom resursu eliminira 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 jednoj jezgri (kernelu) operativnog sustava, ali zadane konfiguracije ostavljaju opasne sigurnosne propuste. Ako aplikacija jednog zakupca naiđe na nekontroliranu skriptu ili pretrpi sigurnosni proboj, sve ostale aplikacije na tom poslužitelju postaju ugrožene.

Iskoristite ovaj detaljni tehnički plan za konfiguriranje stroge višezakupničke izolacije u Dockeru. Primijenite ovih pet operativnih koraka kako biste zaštitili stabilnost sustava, izolirali podatke zakupaca i pretočili tehničke infrastrukturne odluke u jasnu poslovnu vrijednost za upravu.


1. Nametnite stroge kvote resursa pomoću kontrolnih grupa (cgroups)

Odmah postavite eksplicitna ograničenja za procesor (CPU), radnu memoriju i I/O operacije diska na svakom kontejneru. Kada više zakupaca dijeli isti temeljni poslužitelj, neograničeni kontejneri natječu se za sistemske resurse. Jedan nekontrolirani upit bazi podataka ili kampanja s velikim prometom može potrošiti cjelokupnu memoriju poslužitelja, što potiče Linux Out-Of-Memory (OOM) mehanizam da nasumično gasi sistemske procese.

Linux kontrolne grupe (cgroups) upravljaju time koliko računalnog kapaciteta pojedini kontejner može potrošiti. Primijenite ove granice izravno u konfiguraciji svoje implementacije:

services:
  tenant_app:
    image: nginx:alpine
    deploy:
      resources:
        limits:
          cpus: '0.75'
          memory: 512M
        reservations:
          cpus: '0.25'
          memory: 256M
  • Memorijska ograničenja (limits.memory): Postavlja čvrsti gornji limit. Ako kontejner premaši 512 megabajta, kernel gasi procese unutar tog kontejnera bez narušavanja rada susjednih zakupaca.
  • Rezervacije memorije (reservations.memory): Jamči osnovnu alokaciju memorije kako bi aplikacije s manjim prometom ostale responzivne.
  • Ograničenja procesora (limits.cpus): Ograničava kontejner na maksimalni udio dostupnih procesorskih jezgri, sprječavajući da jedan zakupac preoptereti procesor.

Kada ovu arhitekturu opravdavate netehničkom vodstvu, objasnite cgroups kao automatizirana digitalna podbrojila. Baš kao što zakupci u poslovnoj zgradi plaćaju vlastitu potrošnju električne energije umjesto da preopterete glavni osigurač, cgroups osiguravaju da odredišna stranica s velikim prometom nikada ne sruši portal za prikupljanje kontakata drugog klijenta. Za detaljniji uvid u arhitektonske kompromise, pročitajte naš vodič o dizajniranju višezakupničke arhitekture.


2. Segmentirajte procese zakupaca pomoću imenskih prostora i ne-root korisnika

Nikada nemojte pokretati procese u kontejneru kao zadani root korisnik. U standardnim Linux kontejnerskim okruženjima, root unutar kontejnera odgovara root korisniku na temeljnom kernelu poslužitelja, osim ako nije izričito drugačije mapirano. Ako napadač kompromitira web aplikaciju koja se izvodi kao root, stječe povišene privilegije nad cijelim dijeljenim poslužiteljem.

Nametnite izolaciju procesa putem korisničkih imenskih prostora i izričitog pokretanja bez root ovlasti:

  1. Definirajte neprivilegirane korisnike za izvođenje: Stvorite namjenske servisne korisnike s niskim ovlastima unutar svojih Dockerfile datoteka.
    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): Konfigurirajte Docker servis (/etc/docker/daemon.json) za remapiranje ID-jeva korisnika kontejnera u neprivilegirani raspon na poslužitelju.
    {
      "userns-remap": "default"
    }
    

Linux imenski prostori (namespaces) dijele vidljivost sustava. Imenski prostor ID-jeva procesa (PID) osigurava da Zakupac A ne može vidjeti, slati signale ili gasiti procese koji pripadaju Zakupcu B. Imenski prostor točaka montiranja (MNT) svakom zakupcu pruža izoliran pogled na datotečni sustav, dok IPC imenski prostori blokiraju neovlaštenu komunikaciju među procesima.

Remapiranje korisničkih imenskih prostora neutralizira mogućnost bijega iz kontejnera (container escape): proces koji unutar kontejnera funkcionira kao root (UID 0) na poslužitelju se mapira na neprivilegirani ID (kao što je UID 165536). Ako sigurnosni propust zaobiđe barijere kontejnera, napadač dobiva neprivilegiranu ljusku koja ne može mijenjati konfiguraciju poslužitelja niti pristupati direktorijima susjednih zakupaca.


3. Uklonite privilegije kernela i nametnite datotečni sustav samo za čitanje

Smanjite dostupne mogućnosti Linux kernela (capabilities) i učinite korijenski datotečni sustav kontejnera nepromjenjivim pri pokretanju. Zadana kontejnerska okruženja dodjeljuju desetak mogućnosti Linux kernela, od kojih većina web aplikacijama nikada nije potrebna. Prekomjerne ovlasti napadačima pružaju alate za manipulaciju mrežnim usmjeravanjem, promjenu sata poslužitelja ili zaobilaženje kontrola pristupa datotekama.

Osigurajte kontejnere uklanjanjem svih zadanih ovlasti i vraćanjem samo onih koje su nužne za rad:

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 sve ovlasti kernela s procesa u kontejneru.
  • cap_add: - NET_BIND_SERVICE: Izričito dopušta vezanje na privilegirane priključke (poput 80 i 443), dok blokira izravnu manipulaciju sirovim mrežnim utičnicama (raw sockets).
  • read_only: true: Montira cijeli korijenski datotečni sustav kontejnera u načinu samo za čitanje (read-only). Napadači ne mogu preuzeti zlonamjerne binarne datoteke, mijenjati PHP skripte ili prepravljati konfiguracijske datoteke web poslužitelja.
  • tmpfs: Dodjeljuje privremene direktorije u radnoj memoriji za nužne prolazne datoteke (poput /tmp), uz blokiranje izvršavanja binarnih datoteka (noexec) i eskalacije privilegija (nosuid).

Primijenite filtre načina sigurnog računanja (seccomp) i sigurnosne module poput AppArmora ili SELinuxa kako biste presreli i ograničili sistemske pozive upućene dijeljenom kernelu poslužitelja. Ako vaš tim izrađuje prilagođene web aplikacije, slijedite naše strukturirane korake za očvršćivanje Docker kontejnera u vašim procesima isporuke.


4. Particionirajte mreže između okruženja zakupaca

Onemogućite zadanu premošćenu mrežu (bridge) i uspostavite prilagođene, izolirane softverski definirane bridge mreže za stog svakog zakupca. Prema zadanim postavkama, kontejneri postavljeni na standardnu Docker bridge mrežu mogu se međusobno otkrivati i komunicirati putem internih IP adresa. Sigurnosni propust u marketinškom mikroservisu jednog zakupca omogućuje bočno kretanje (lateral movement) prema svakoj drugoj internoj bazi podataka i aplikaciji na tom poslužitelju.

Potpuno izolirajte promet zakupaca definiranjem neovisnih mrežnih mostova po zakupcu:

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
  • Izolacija zakupaca: 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.
  • Interna oznaka (internal: true): Sprječava mreže baza podataka u usmjeravanju prometa izravno na vanjski internet, ograničavajući ulazni i izlazni pristup isključivo na aplikacijske kontejnere.
  • Ulazni poslužitelj (Reverse Proxy): Samo se ulazni proxy povezuje na public_gateway_net kako bi usmjerio dolazne HTTP/HTTPS zahtjeve prema odgovarajućem kontejneru zakupca na temelju naziva hosta.

Za naprednija okruženja razmotrite Dockerove načine rada s poboljšanom izolacijom kontejnera (ECI) ili runtime okruženja poput Sysboxa, koja automatski nameću strože granice korisničkih imenskih prostora te virtualizirane /proc i /sys datotečne sustave bez složenog ručnog pisanja mrežnih skripti.


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

Odbacite pretpostavku da svi digitalni resursi zahtijevaju namjenske virtualne strojeve. Marketinški voditelji često pretpostavljaju da je izolacija na razini hardvera putem VM-ova jedini siguran model. U praksi, dodjela namjenskih VM-ova za jednostavne odredišne stranice ili kratkotrajna sjedišta kampanja stvara ogroman rast troškova i operativnog održavanja, bez stvarnog poboljšanja sigurnosti web aplikacija.

Upotrijebite sljedeću matricu usporedbe za procjenu zahtjeva radnog opterećenja i predstavljanje racionalne strategije implementacije donositeljima odluka:

Razina izolacijeTemeljna tehnologijaSigurnosna granicaUtrošak resursaNajbolji slučaj upotrebe
Kontejneri na dijeljenom stoguImenski prostori i cgroups na jednom OS-uLogička izolacija na razini OS-aVrlo nizakOdredišne stranice s velikim prometom, interna razvojna okruženja, privremena sjedišta kampanja
Očvrsnuti kontejneri (ECI / Sysbox)Korisnički imenski prostori, AppArmor, Read-Only rootNapredna razina OS-a i virtualizacijaNizakAgencijski hosting za više klijenata, autentificirani portali, osjetljivi marketinški obrasci
Namjenski virtualni strojevi (VM-ovi)Hardverska virtualizacija putem hipervizoraStrogo odvajanje na razini hardvera i kernelaVisokObrada plaćanja, regulirani HIPAA/PCI podaci, izvođenje nepouzdanog prilagođenog koda
Hibridni model (Kontejneri u namjenskim VM-ovima)Očvrsnuti kontejneri unutar VM-ova specifičnih za zakupcaVišeslojne hardverske granice i granice OS-aUmjeren do visokKorisnici visoke razine (enterprise) koji zahtijevaju strogu ugovornu usklađenost

Procijenite svaki projekt prema strogim kriterijima prije dodjele infrastrukturnog budžeta:

  1. Osjetljivost podataka: Pohranjuje li projekt regulatorno zaštićene podatke (npr. podatke o kreditnim karticama ili zdravstvene podatke)? Ako da, implementirajte ga na namjenski VM.
  2. Porijeklo koda: Implementirate li standardizirani kod koji je revidirao vaš tim ili dopuštate neprovjerene dodatke trećih strana? Standardni kod pripada u očvrsnute kontejnere; neprovjereni kod trećih strana zahtijeva izolaciju hipervizorom.
  3. Budžet i životni vijek: Za sezonske odredišne stranice i primarna web sjedišta tvrtke, višezakupništvo s očvrsnutim kontejnerima pruža maksimalne performanse po uloženom novcu.

Kada prezentirate planove infrastrukture upravi, konzultirajte naš vodič o procjeni kada klijenti trebaju namjenske VM-ove kako biste svoje preporuke potkrijepili jasnim argumentima temeljenim na razinama izolacije.


Zaključak: Povezivanje sigurnosnih kontrola s poslovnim povratom ulaganja (ROI)

Osiguravanje višezakupničkog Docker okruženja ne zahtijeva proračun za složenu korporativnu infrastrukturu u oblaku. Zahtijeva dosljednu i discipliniranu primjenu kontrola operativnog sustava.

Kada s netehničkim vodstvom pregledavate infrastrukturu, ove tehničke konfiguracije prikažite kroz tri ključna poslovna mjerila:

  • Isplativost: Višezakupnički kontejneri omogućuju timu hosting desetaka marketinških stranica uz djelić računalnih resursa koje bi zahtijevali pojedinačni VM-ovi.
  • Zaštita dostupnosti sustava (Uptime): Kontrolne grupe jamče da skokovi prometa na sezonskoj kampanji neće narušiti rad glavnih web sjedišta brenda.
  • Ograničavanje dometa štete (Blast Radius): Datotečni sustavi samo za čitanje, uklonjene ovlasti i izolirani mrežni mostovi osiguravaju da sigurnosni propust na jednoj stranici ne može ugroziti baze podataka susjednih klijenata ili kontrole poslužitelja.

Sustavno primijenite ove sigurnosne postavke na predloške svojih kontejnera. Time ćete isporučiti infrastrukturu visokih performansi i pristupačne cijene koja zadovoljava i inženjerske sigurnosne standarde i proračunska ograničenja uprave.

Sources (5)