Tinklaraštis

Praktinis Docker izoliavimo saugumo kontrolinis sąrašas kelių nuomininkų talpinimui

Užtikrinkite saugų kelių nuomininkų Docker talpinimą su šiuo praktiniu kontroliniu sąrašu, apimančiu ne root vartotojus, galimybes, seccomp, vartotojų vardų sritis, išteklių ribas ir tik skaitymui skirtas failų sistemas.

Santrauka

Kelių nuomininkų Docker talpinimas reikalauja stipraus izoliavimo, kad būtų išvengta konteinerių pabėgimų. Šis straipsnis pateikia praktinį saugumo kontrolinį sąrašą, apimantį šešias pagrindines sritis: paleisti kaip ne root vartotoją, atimti galimybes, taikyti seccomp profilius, įjungti vartotojų vardų sričių perrašymą, nustatyti išteklių ribas ir naudoti tik skaitymui skirtas šaknines failų sistemas. Kiekvienas žingsnis apima konkretų konfigūracijos pavyzdį Docker Compose. Taip pat sužinosite apie dažniausias klaidas, pvz., branduolio suderinamumo problemas su vartotojų vardų sritimis ir našumo kompromisus taikant seccomp. Vykdydami šį kontrolinį sąrašą galite žymiai sumažinti atakos paviršių be nereikalingo sudėtingumo. Straipsnis baigiamas rekomenduojama bazine konfigūracija, skirta gamybos kelių nuomininkų aplinkoms.

Jei valdote kelių nuomininkų Docker aplinką, konteinerių pabėgimo atakos šmėkla neduoda jums ramybės. Vienas branduolio išnaudojimas gali ištrūkti iš konteinerio ir suteikti atakuotojui neribotą prieigą prie pagrindinio kompiuterio ir visų kitų nuomininkų duomenų. Nors Docker suteikia galingus izoliavimo primityvus – vardų sritis, cgroups ir galimybes – netinkama konfigūracija palieka spragų. Šiame straipsnyje pateikiamas žingsnis po žingsnio saugumo kontrolinis sąrašas, kurį galite pritaikyti šiandien. Kiekvienas žingsnis apima veikiantį Docker Compose fragmentą ir pagrindines išlygas. Galų gale turėsite sustiprintą bazinę konfigūraciją, subalansuojančią saugumą ir našumą.

1. Paleiskite konteinerius kaip ne root vartotoją

Konteineriai pagal numatytuosius nustatymus veikia kaip root vartotojas konteinerio viduje. Jei atakuotojas įgyja root teises konteineryje, jis turi pranašumą pabėgti. Visada apibrėžkite ne root vartotoją savo Dockerfile.

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

Compuse taip pat galite tiesiogiai nustatyti vartotoją:

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

Išlyga: Kai kurioms programoms reikia root teisių teisėtoms operacijoms (pvz., prisijungti prie žemesnių nei 1024 prievadų). Vietoj to, kad paleistumėte visą konteinerį kaip root, naudokite CAP_NET_BIND_SERVICE. Norėdami giliau pažvelgti į izoliavimo pagrindus, žr. mūsų vadovą kaip pasiekti tikrą kelių nuomininkų izoliavimą Docker.

2. Atimkite visas galimybes ir pridėkite tik tai, ko reikia

„Linux“ galimybės suteikia konteineriams smulkias privilegijas. Pagal numatytuosius nustatymus Docker suteikia galimybių rinkinį. Atimkite viską ir suteikite tik tas, kurios reikalingos.

services:
  app:
    image: myapp
    cap_drop:
      - ALL
    cap_add:
      - NET_BIND_SERVICE  # jei reikia

Išlyga: Galimybės, tokios kaip SYS_ADMIN ar NET_RAW, retai reikalingos. Audituokite savo programą, kad nustatytumėte mažiausią rinkinį. Atėmę visas galimybes užblokuojate daugelį pabėgimo vektorių.

3. Taikykite seccomp profilį

Seccomp (saugaus skaičiavimo režimas) filtruoja konteineriui prieinamus sistemos iškvietimus. Docker pateikia numatytąjį seccomp profilį, kuris blokuoja pavojingus sistemos iškvietimus, pvz., clone su tam tikromis vėliavėlėmis. Galite jį toliau pritaikyti.

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

Sustiprintas profilis gali blokuoti unshare, ptrace ir mount. Pradėkite nuo Docker numatytojo ir apribokite daugiau. Išlyga: Per griežti profiliai gali sugadinti programas. Išbandykite išsamiai testavimo aplinkoje. Daugiau apie konteinerių pabėgimo gynybą skaitykite ginti nuo konteinerių pabėgimo.

4. Įjunkite vartotojų vardų sričių perrašymą

Vartotojų vardų sritys susieja konteinerio root vartotoją su neprivilegijuotu pagrindinio kompiuterio vartotoju. Tai reiškia, kad net jei atakuotojas įgyja root teises konteineryje, jis neturi specialių privilegijų pagrindiniame kompiuteryje.

Įjunkite tai Docker dėmone, redaguodami /etc/docker/daemon.json:

{
  "userns-remap": "default"
}

Tada iš naujo paleiskite Docker. Išlyga: Vartotojų vardų sričių perrašymas turi du trūkumus: jis sugadina tomų prijungimą, kai nėra kruopščiai sukonfigūruotas (failai priklauso perrašytam vartotojui) ir yra nesuderinamas su kai kuriomis saugojimo tvarkyklėmis, pvz., overlay2 senesniuose branduoliuose. Išbandykite išsamiai.

5. Nustatykite išteklių ribas naudodami cgroups

Išteklių ribos neleidžia pažeistam konteineriui pradėti paslaugų atsisakymo atakos prieš pagrindinį kompiuterį. Naudokite cgroups, kad apribotumėte procesoriaus, atminties ir disko I/O.

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

Docker Compose v3 naudokite deploy skyrių (veikia su swarm arba compose v2). Paprastam Docker naudokite --memory ir --cpus. Išlyga: Nustačius per mažas ribas gali įvykti OOM nužudymai. Stebėkite naudojimą ir atitinkamai reguliuokite.

6. Naudokite tik skaitymui skirtą šakninę failų sistemą

Tik skaitymui skirta šakninė failų sistema neleidžia atakuotojams rašyti kenkėjiškų dvejetainių failų ar keisti konfigūracijos failų konteineryje.

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

Prijunkite tmpfs kataloguose, kuriems reikia rašymo prieigos (pvz., /tmp). Tai priverčia visus rašomus duomenis būti laikinais. Išlyga: Kai kurioms programoms reikia nuolatinės saugyklos; tam naudokite pavadintus tomus.

Dažniausios klaidos

  • Branduolio suderinamumas: Vartotojų vardų sričių perrašymas ir kai kurios seccomp taisyklės reikalauja naujesnio Linux branduolio (4.14+). Patikrinkite savo branduolio versiją.
  • Našumo poveikis: Seccomp ir vartotojų vardų sritys prideda nedidelį papildomą krūvį, tačiau jis yra nereikšmingas daugumai darbo krūvių. Išbandykite savo konkrečią programą.
  • Sudėtingumas: Pridėjus visas šešias priemones vienu metu, gali kažkas sugesti. Taikykite jas po vieną, išbandykite kiekvieną pakeitimą.

Norėdami gauti platesnį orkestravimo modelių vaizdą, žr. mūsų vadovą kurti kelių nuomininkų Docker architektūrą.

Išvada

Saugus kelių nuomininkų Docker pagrindinis kompiuteris nereikalauja egzotiškų įrankių – tik teisingo Docker įtaisytųjų funkcijų naudojimo. Pradėkite nuo ne root vartotojo, atimkite visas galimybes, taikykite seccomp profilį, įjunkite vartotojų vardų sričių perrašymą, nustatykite išteklių ribas ir naudokite tik skaitymui skirtą failų sistemą. Šis kontrolinis sąrašas sudaro stiprią bazinę konfigūraciją, kuri blokuoja dažniausius pabėgimo būdus. Įdiegę paleiskite saugumo įrankius, pvz., docker-bench-security, kad patikrintumėte savo konfigūraciją. Atminkite: saugumas yra procesas, o ne produktas. Atsiradus naujoms branduolio pažeidžiamumams, peržiūrėkite savo nustatymus. Norėdami sukurti automatinius tikslinius puslapius, kurie demonstruoja jūsų talpinimo paslaugas, naudokite Pagenza, kad jūsų svetainė būtų internete per kelias minutes.

Sources (5)