Blog

Praktična sigurnosna lista za Docker izolaciju za višekorisničko hosting

Osigurajte svoje višekorisničko Docker hosting uz ovu praktičnu listu koja pokriva korisnike koji nisu root, mogućnosti, seccomp, korisničke namespaceove, ograničenja resursa i samo-čitajuće datotečne sisteme.

Sažetak

Višekorisničko Docker hosting zahtijeva snažnu izolaciju kako bi se spriječilo bježanje kontejnera. Ovaj članak pruža praktičnu sigurnosnu listu koja pokriva šest ključnih područja: rad kao non-root, uklanjanje mogućnosti, primjenu seccomp profila, omogućavanje mapiranja korisničkog namespacea, postavljanje ograničenja resursa i korištenje samo-čitajućih root datotečnih sistema. Svaki korak uključuje konkretan primjer konfiguracije za Docker Compose. Također ćete saznati uobičajene zamke kao što su problemi kompatibilnosti kernela s korisničkim namespaceovima i performansni kompromisi pri primjeni seccompa. Slijedeći ovu listu, možete značajno smanjiti napadnu površinu bez dodavanja nepotrebne složenosti. Članak završava preporučenom osnovnom konfiguracijom za produkcijska višekorisnička okruženja.

Ako vodite višekorisničko Docker okruženje, strah od napada bježanja kontejnera vas drži budnima. Jedan kernel exploit može izaći iz kontejnera i dati napadaču neograničen pristup hostu i svim podacima ostalih korisnika. Iako Docker pruža snažne izolacijske primitive—namespaceove, cgroups i mogućnosti—pogrešne konfiguracije ostavljaju praznine. Ovaj članak predstavlja korak-po-korak sigurnosnu listu koju možete primijeniti danas. Svaki korak uključuje radni Docker Compose isječak i ključne napomene. Na kraju, imat ćete očvrsnutu osnovu koja balansira sigurnost i performanse.

1. Pokrenite kontejnere kao korisnika koji nije root

Kontejneri podrazumijevano rade kao root unutar kontejnera. Ako napadač dobije root u kontejneru, ima prednost za bježanje. Uvijek definirajte korisnika koji nije root u vašem Dockerfileu.

FROM alpine:3.18
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser

U Compose-u, također možete postaviti korisnika direktno:

services:
  app:
    image: myapp
    user: "1000:1000"

Napomena: Neke aplikacije zahtijevaju root za legitimne operacije (npr. povezivanje na portove ispod 1024). Koristite CAP_NET_BIND_SERVICE umjesto pokretanja cijelog kontejnera kao root. Za dublji uvid u osnove izolacije, pogledajte naš vodič o postizanju prave višekorisničke izolacije u Dockeru.

2. Uklonite sve mogućnosti i dodajte samo potrebne

Linux mogućnosti daju kontejnerima fina prava. Podrazumijevano, Docker dodjeljuje skup mogućnosti. Uklonite sve i odobrite samo one potrebne.

services:
  app:
    image: myapp
    cap_drop:
      - ALL
    cap_add:
      - NET_BIND_SERVICE  # ako je potrebno

Napomena: Mogućnosti poput SYS_ADMIN ili NET_RAW rijetko su potrebne. Revidirajte svoju aplikaciju kako biste odredili minimalni skup. Uklanjanje svih mogućnosti blokira mnoge vektore bježanja.

3. Primijenite Seccomp profil

Seccomp (secure computing mode) filtrira sistemske pozive dostupne kontejneru. Docker dolazi s podrazumijevanim seccomp profilom koji blokira opasne syscallove poput clone s određenim zastavicama. Možete ga dodatno prilagoditi.

services:
  app:
    image: myapp
    security_opt:
      - seccomp=/path/to/custom-profile.json

Očvrsnuti profil može blokirati unshare, ptrace i mount. Počnite s Dockerovim podrazumijevanim i dodatno ograničite. Napomena: Prestrogi profili mogu slomiti aplikacije. Testirajte temeljito u staging okruženju. Za više o obrani od bježanja kontejnera, pročitajte odbrana od bježanja kontejnera.

4. Omogućite mapiranje korisničkog namespacea

Korisnički namespaceovi mapiraju root korisnika kontejnera na neprivilegovanog host korisnika. To znači da čak i ako napadač dobije root unutar kontejnera, nema posebna prava na hostu.

Omogućite to na Docker demonu uređivanjem /etc/docker/daemon.json:

{
  "userns-remap": "default"
}

Zatim restartujte Docker. Napomena: Mapiranje korisničkog namespacea ima dva nedostatka: kvari montiranje volumena kada nije pažljivo konfigurirano (datoteke su u vlasništvu mapiranog korisnika) i nije kompatibilno s nekim drajverima za skladištenje poput overlay2 na starijim kernelima. Testirajte temeljito.

5. Postavite ograničenja resursa pomoću cgroups

Ograničenja resursa sprječavaju kompromitovani kontejner da pokrene denial-of-service napad na host. Koristite cgroups za ograničavanje CPU-a, memorije i I/O diska.

services:
  app:
    image: myapp
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 512M

Za Docker Compose v3, koristite odjeljak deploy (radi sa swarm ili compose v2). Za običan Docker, koristite --memory i --cpus. Napomena: Postavljanje preniskih ograničenja može uzrokovati OOM ubijanja. Pratite korištenje i prilagodite.

6. Koristite samo-čitajući root datotečni sistem

Samo-čitajući root datotečni sistem sprječava napadače da pišu zlonamjerne binarne datoteke ili mijenjaju konfiguracijske datoteke unutar kontejnera.

services:
  app:
    image: myapp
    read_only: true
    tmpfs:
      - /tmp:noexec,nosuid,size=64m

Montirajte tmpfs na direktorije koji zahtijevaju pravo pisanja (poput /tmp). To prisiljava sve podatke za pisanje da budu prolazni. Napomena: Neke aplikacije zahtijevaju trajnu pohranu; koristite imenovane volumene za to.

Uobičajene zamke

  • Kompatibilnost kernela: Mapiranje korisničkog namespacea i neka seccomp pravila zahtijevaju noviji Linux kernel (4.14+). Provjerite verziju vašeg kernela.
  • Utjecaj na performanse: Seccomp i korisnički namespaceovi dodaju mali overhead, ali je zanemariv za većinu radnih opterećenja. Benchmarkirajte svoju specifičnu aplikaciju.
  • Složenost: Dodavanje svih šest mjera odjednom može slomiti stvari. Primijenite ih jednu po jednu, testirajte svaku promjenu.

Za širi pregled obrazaca orkestracije, pogledajte naš vodič o dizajniranju višekorisničke Docker arhitekture.

Zaključak

Sigurno višekorisničko Docker hosting ne zahtijeva egzotične alate—samo pravilnu upotrebu Dockerovih ugrađenih funkcija. Počnite s korisnikom koji nije root, uklonite sve mogućnosti, primijenite seccomp profil, omogućite mapiranje korisničkog namespacea, postavite ograničenja resursa i koristite samo-čitajući datotečni sistem. Ova lista čini snažnu osnovu koja blokira najčešće tehnike bježanja. Nakon implementacije, pokrenite sigurnosne alate poput docker-bench-security kako biste provjerili svoju konfiguraciju. Zapamtite: sigurnost je proces, a ne proizvod. Kako se pojavljuju nove ranjivosti kernela, ponovo pregledajte svoja podešavanja. Za automatske landing stranice koje prikazuju vašu hosting uslugu, koristite Pagenza da vaš sajt bude online za nekoliko minuta.

Sources (5)