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
--memoryja--memory-swapasettavat kovat rajat (ei swapia).--cpusrajoittaa suoritinta.--pids-limitestää 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
- Rakenna säiliöt ei-root-käyttäjällä.
- Pudota kaikki kapasiteetit, lisää vain tarvittavat.
- Asenna tiedostojärjestelmä vain luku -tilassa väliaikaisilla kirjoitettavilla liitoksilla.
- Aseta muisti-, suoritin- ja PID-rajoitukset.
- Luo eristetyt Docker-verkot jokaiselle vuokraajalle.
- Käytä mukautettuja seccomp- ja AppArmor-profiileja.
- 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.
