Blog

Praktični sigurnosni kontrolni popis za izolaciju Docker okruženja u višekorisničkom hostingu

Zaštitite svoj višekorisnički Docker hosting pomoću ovog praktičnog kontrolnog popisa koji obuhvaća ne-root korisnike, mogućnosti, seccomp, korisničke imenike, ograničenja resursa i datotečne sustave samo za čitanje.

Sažetak

Višekorisnički Docker hosting zahtijeva snažnu izolaciju kako bi se spriječila bježanja iz spremnika. Ovaj članak nudi praktični sigurnosni kontrolni popis koji pokriva šest ključnih područja: pokretanje kao ne-root, uklanjanje mogućnosti, primjena seccomp profila, omogućavanje preslikavanja korisničkog imenika, postavljanje ograničenja resursa i korištenje datotečnog sustava samo za čitanje. Svaki korak uključuje konkretan primjer konfiguracije za Docker Compose. Također ćete naučiti uobičajene zamke poput problema kompatibilnosti kernela s korisničkim imenicima i kompromisa u performansama prilikom primjene seccomp-a. Slijedeći ovaj kontrolni popis, možete značajno smanjiti napadnu površinu bez dodavanja nepotrebne složenosti. Članak završava preporučenom osnovnom konfiguracijom za produkcijske višekorisničke okruženja.

Ako upravljate višekorisničkim Docker okruženjem, prijetnja napada bježanjem iz spremnika drži vas budnima noću. Jedan iskoristiv kernel može izaći iz spremnika i napadaču dati neograničen pristup hostu i podacima svih ostalih korisnika. Iako Docker pruža snažne primitive izolacije — imenike, cgroups i mogućnosti — pogrešna konfiguracija ostavlja praznine. Ovaj članak predstavlja korak-po-korak sigurnosni kontrolni popis koji možete primijeniti danas. Svaki korak uključuje radni isječak Docker Compose-a i ključne napomene. Na kraju ćete imati učvršćenu osnovnu liniju koja balansira sigurnost i performanse.

1. Pokretanje spremnika kao ne-root korisnik

Spremnici se prema zadanim postavkama pokreću kao root unutar spremnika. Ako napadač dobije root u spremniku, ima prednost pri bježanju. Uvijek definirajte ne-root korisnika u svojoj Dockerfile datoteci.

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

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

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 spremnika 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 ono što je potrebno

Linux mogućnosti daju spremnicima fino podešene privilegije. Prema zadanim postavkama, Docker dodjeljuje skup mogućnosti. Uklonite sve i dodijelite samo one potrebne.

services:
  app:
    image: myapp
    cap_drop:
      - ALL
    cap_add:
      - NET_BIND_SERVICE  # if needed

Napomena: Mogućnosti poput SYS_ADMIN ili NET_RAW rijetko su potrebne. Provedite reviziju svoje aplikacije kako biste odredili minimalni skup. Uklanjanje svih mogućnosti blokira mnoge vektore bježanja.

3. Primjena seccomp profila

Seccomp (sigurnosni način rada) filtrira sistemske pozive dostupne spremniku. Docker dolazi s zadanim seccomp profilom koji blokira opasne sistemske pozive poput clone s određenim zastavicama. Možete ga dodatno prilagoditi.

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

Učvršćeni profil može blokirati unshare, ptrace i mount. Počnite s Dockerovim zadanim profilom i dodatno ograničite. Napomena: Previše strogi profili mogu slomiti aplikacije. Temeljito testirajte u pripremnom okruženju. Za više o obrani od bježanja iz spremnika, pročitajte obrana od bježanja iz spremnika.

4. Omogućavanje preslikavanja korisničkog imenika

Korisnički imenici preslikavaju root korisnika spremnika na neprivilegiranog korisnika hosta. To znači da čak i ako napadač dobije root unutar spremnika, nema posebne privilegije na hostu.

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

{
  "userns-remap": "default"
}

Zatim ponovno pokrenite Docker. Napomena: Preslikavanje korisničkog imenika ima dva nedostatka: kvari montiranje volumena ako nije pažljivo konfigurirano (datoteke su u vlasništvu preslikanog korisnika) i nekompatibilno je s nekim upravljačkim programima za pohranu poput overlay2 na starijim kernelima. Temeljito testirajte.

5. Postavljanje ograničenja resursa s cgroups

Ograničenja resursa sprječavaju ugroženi spremnik da pokrene napad uskraćivanja usluge na hostu. 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čni Docker koristite --memory i --cpus. Napomena: Postavljanje preniskih ograničenja može uzrokovati OOM ubijanja. Pratite upotrebu i prilagodite u skladu s tim.

6. Korištenje datotečnog sustava samo za čitanje

Datotečni sustav samo za čitanje sprječava napadače da upisuju zlonamjerne binarne datoteke ili mijenjaju konfiguracijske datoteke unutar spremnika.

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

Montirajte tmpfs na direktorije koji trebaju 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: Preslikavanje korisničkog imenika i neka seccomp pravila zahtijevaju noviji Linux kernel (4.14+). Provjerite svoju verziju kernela.
  • Utjecaj na performanse: Seccomp i korisnički imenici dodaju mali režijski trošak, ali je zanemariv za većinu radnih opterećenja. Izmjerite performanse svoje specifične aplikacije.
  • Složenost: Dodavanje svih šest mjera odjednom može pokvariti stvari. Primjenjujte ih jednu po jednu, testirajte svaku promjenu.

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

Zaključak

Sigurni višekorisnički Docker host ne zahtijeva egzotične alate – samo ispravnu upotrebu Dockerovih ugrađenih značajki. Počnite s ne-root korisnikom, uklonite sve mogućnosti, primijenite seccomp profil, omogućite preslikavanje korisničkog imenika, postavite ograničenja resursa i koristite datotečni sustav samo za čitanje. Ovaj kontrolni popis čini snažnu osnovnu liniju 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, ponovno razmotrite svoje postavke. Za automatske odredišne stranice koje prikazuju vašu uslugu hostinga, koristite Pagenza da vaša stranica bude online za nekoliko minuta.

Sources (5)