Blogi

Docker-säiliöiden kovennus monivuokraajaisännöintiin: Vaiheittainen eristysopas

Opi lukitsemaan Docker-säiliöt monivuokraajaympäristöissä käytännön turvatoimilla, kuten ei-root-käyttäjät, pudotetut kapasiteetit, vain luku -tiedostojärjestelmät ja verkon eristys.

Yhteenveto

Monivuokraajan Docker-isännöintialustan pyörittäminen vaatii ilmatiiviin säiliöeristyksen estämään vuokraajia häiritsemästä toisiaan tai karkaamasta isäntään. Tämä opas tarjoaa konkreettisen, vaiheittaisen kovennusprosessin, jota voit soveltaa jo tänään. Opit määrittämään ei-root-käyttäjiä, pudottamaan tarpeettomia Linux-kapasiteetteja, asentamaan tiedostojärjestelmiä vain luku -tilassa, pakottamaan resurssirajoja cgroupien avulla, segmentoimaan verkkoja ja soveltamaan seccomp- tai AppArmor-profiileja. Käsittelemme myös, milloin kannattaa täydentää säiliöitä virtuaalikoneilla maksimaalisen turvallisuuden saavuttamiseksi. Lopuksi sinulla on tarkistuslista, jolla voit järjestelmällisesti poistaa yleisiä säiliöpakoreittejä ja pitää monivuokraajainfrastruktuurisi todella eristettynä.

Tosimaailman ongelma monivuokraajasäiliöiden kanssa

Docker-säiliöt jakavat isäntäytimen, ja jos eristys on väärin konfiguroitu, yksi vuokraaja voi teoriassa päästä käsiksi toisen tietoihin, kuluttaa kaiken suorittimen tai jopa murtautua isäntään. Isännöintipalveluntarjoajana tarvitset ilmatiiviit rajat uhraamatta säiliöiden suorituskykyhyötyjä. Monet tiimit aloittavat oletusarvoisilla Docker-asetuksilla, jotka on suunniteltu kehitykseen, eivät tuotannon monivuokraajuuteen. Hyvä uutinen: systemaattisella kovennustarkistuslistalla voit lukita jokaisen säiliön lähes VM-tason eristykseen säilyttäen samalla Dockerin nopeuden.

Tämä artikkeli opastaa sinut jokaisen kovennusvaiheen läpi käytännön esimerkein ja varoituksin. Lopuksi sinulla on toistettava prosessi turvallisten monivuokraajasäiliöiden käyttöönottoon.

Vaihe 1: Suorita säiliöt ei-root-käyttäjänä

Oletusarvoisesti Docker-säiliöt toimivat root-käyttäjänä. Jos säiliö vaarantuu, hyökkääjä saa root-oikeudet säiliön sisällä ja voi yrittää säiliöpakoa. Luo ensin omistettu käyttäjä Dockerfile-tiedostossa ja vaihda siihen:

FROM ubuntu:22.04
RUN useradd -m appuser
USER appuser

Varoitus: Jotkin prosessit (esim. sitoutuminen portteihin < 1024) vaativat root-oikeuksia. Käytä näissä tapauksissa --cap-add-lippua myöntääksesi vain tarvittavan kapasiteetin, kuten --cap-add=NET_BIND_SERVICE, ja suorita prosessi silti ei-root-käyttäjänä.

Lisätietoa perustavanlaatuisesta eristyksestä, katso oppaamme todellisen monivuokraajaeristyksen saavuttamisesta Dockerissa.

Vaihe 2: Pudota kaikki Linux-kapasiteetit ja lisää takaisin vain tarvitsemasi

Linux-kapasiteetit jakavat root-oikeudet pieniin yksiköihin. Docker-säiliöt tulevat oletusarvoisella kapasiteettijoukolla, joka on liian salliva monivuokraajaisännöintiin. Pudota kaikki ja lisää takaisin vain sovelluksesi vaatimat:

docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE my-app

Yleisiä kapasiteetteja vältettäväksi: SYS_ADMIN (säiliöpako), NET_RAW (pakettien nuuskiminen), SYS_PTRACE (prosessien virheenkorjaus). Käytä docker run -komentoa lipulla --security-opt no-new-privileges estääksesi oikeuksien korotuksen setuid-binäärien kautta.

Vaihe 3: Asenna juuritiedostojärjestelmä vain luku -tilassa

Hyökkääjät kirjoittavat usein haitallisia skriptejä säiliön tiedostojärjestelmään. Tekemällä juuritiedostojärjestelmästä vain luku -tilassa estät tämän:

docker run --read-only --tmpfs /tmp:rw,noexec,nosuid,size=64m my-app

--tmpfs luo väliaikaisen kirjoitettavan liitoksen hakemistoille, kuten /tmp ja /var/run. noexec-lippu estää suorituksen kyseisestä liitoksesta. Tämä lähestymistapa pakottaa hyökkääjät kiertämään kirjoitettavien hakemistojen kautta, joita voit valvoa.

Vaihe 4: Pakota resurssirajat cgroupien avulla

Rajoittamattomat säiliöt voivat suorittaa palvelunestohyökkäyksiä kuluttamalla isäntämuistia tai suoritinta. Käytä Dockerin suoritusaikarajoituksia:

docker run --memory=512m --memory-swap=512m --cpus=0.5 --pids-limit=100 my-app
  • --memory ja --memory-swap asettavat kovat rajat (ei swapia).
  • --cpus rajoittaa suoritinta.
  • --pids-limit estää haarukkapommit rajoittamalla prosessien määrää.

Varoitus: Resurssirajat toteutetaan cgroupien avulla, mutta ne eivät estä tietojen vuotamista verkon kautta. Yhdistä verkkoeristykseen (seuraava vaihe).

Vaihe 5: Segmentoi verkot Dockerin mukautetuilla verkoilla

Oletusarvoisesti Docker-säiliöt jakavat siltaverkon. Monivuokraajaympäristössä sinun on eristettävä jokaisen vuokraajan verkkopino. Luo oma verkko jokaiselle vuokraajalle:

docker network create tenant-alpha --internal
docker run --network tenant-alpha my-app

Käytä --internal-lippua estämään ulospäin suuntautuva internet-yhteys ja altista vain tarvittavat portit -p-lipulla. Lisätietoa edistyneemmästä verkkojen segmentoinnista, harkitse verkkosovellusten suojaamista Docker-eristyksellä.

Varoitus: Sisäiset verkot estävät suoran säiliöiden välisen viestinnän vuokraajien välillä, mutta DNS-vuotoja voi silti tapahtua, jos käytät isäntäverkkoa. Pysyttele silta- tai overlay-verkoissa.

Vaihe 6: Käytä Seccomp- ja AppArmor-profiileja

Seccomp suodattaa järjestelmäkutsuja, ja AppArmor (tai SELinux) toteuttaa pakolliset pääsynvalvonnat. Docker tarjoaa oletusarvoisen seccomp-profiilin, joka estää vaarallisia järjestelmäkutsuja, kuten clone tietyillä lipuilla. Tiukemman eristyksen saavuttamiseksi luo mukautettu profiili:

docker run --security-opt seccomp=./custom.json --security-opt apparmor=docker-default my-app

Voit luoda perusprofiilin komennolla docker run --rm -it --security-opt seccomp=unconfined my-app strace -c -S time ja sitten karsia sitä. Varoitus: Liian rajoittavat profiilit voivat rikkoa laillista toiminnallisuutta. Testaa perusteellisesti testiympäristössä.

Vaihe 7: Harkitse hybridieristystä virtuaalikoneilla

Jos vuokraajasi vaativat absoluuttista eristystä (esim. säännelty toimiala), suorita säiliöt kevyen VM:n sisällä. Työkalut, kuten Sysbox tai Kata Containers, tarjoavat laitteistotason erotuksen uhraamatta säiliön nopeutta. Tämä on lähestymistapa, jota Dockerin Enhanced Container Isolation (ECI) käyttää. Vaikka ylimääräinen kuormitus on suurempi kuin paljailla säiliöillä, se on huomattavasti pienempi kuin täysillä VM:illä työkuormaa kohti.

Lisätietoa oikean eristystason valinnasta, lue monivuokraaja-Docker-arkkitehtuurin suunnittelu.

Kaikki yhdessä: Kovennustarkistuslista

  1. Rakenna säiliöt ei-root-käyttäjällä.
  2. Pudota kaikki kapasiteetit, lisää vain tarvittavat.
  3. Asenna tiedostojärjestelmä vain luku -tilassa väliaikaisilla kirjoitettavilla liitoksilla.
  4. Aseta muisti-, suoritin- ja PID-rajoitukset.
  5. Luo eristetyt Docker-verkot jokaiselle vuokraajalle.
  6. Käytä mukautettuja seccomp- ja AppArmor-profiileja.
  7. Arvioi hybridi-VM-säiliöitä korkean turvallisuuden tarpeisiin.

Päätelmä

Säiliöiden kovennus ei ole kertaluonteinen tehtävä – se on jatkuva kurinalaisuus. Yllä olevat vaiheet muodostavat turvallisuusperustan monivuokraajaisännöinnille. Muista, ettei yksikään toimenpide takaa turvallisuutta; syvyyssuuntainen puolustus on avainasemassa. Aloita perusasioista: ei-root-käyttäjät ja pudotetut kapasiteetit. Sitten lisää resurssirajat ja verkkojen segmentointi. Kaikkein herkimmille työkuormille yhdistä säiliöt VM:ien kanssa. Tämän oppaan avulla voit luottavaisesti ottaa käyttöön monivuokraaja-Docker-ympäristöjä, jotka ovat sekä tehokkaita että turvallisia.

Sources (5)