Blogi

Todellisen monivuokralaiseristyksen saavuttaminen Dockerissa

Dockerin jaettu ydinmalli tuo riskejä monivuokralaisympäristöihin. Tämä opas antaa konkreettisia ohjeita eristyksen vahvistamiseen käyttämällä käyttäjänimiavaruuksia, seccompia, AppArmoria, hiekkalaatikkotyökaluja ja orkestroinnin parhaita käytäntöjä.

Yhteenveto

Docker-säiliöt jakavat isäntäytimen, mikä voi olla turvallisuusongelma monivuokralaisympäristöissä, joissa vuokralaiset eivät välttämättä luota toisiinsa. Tämä artikkeli selittää oletusarvoisen Docker-asennuksen eristysaukot ja tarjoaa konkreettisia ohjeita eristyksen vahvistamiseksi käyttämällä Linux-nimiavaruuksia, cgroupseja, käyttäjänimiavaruuksia, seccompia, AppArmoria ja laitteistovirtualisointia. Opit konfiguroimaan vuokralaiskohtaisia Docker-palvelimia, käyttämään hiekkalaatikkotyökaluja kuten gVisor tai Firecracker vahvempaan eristykseen, ja orkestroimaan Kubernetesilla monivuokralaiskäyttöä varten. Käymme läpi myös oikean infrastruktuuripalveluntarjoajan valinnan, joka tarjoaa KVM-pohjaista virtualisointia lisäeristyskerrokseksi. Lopuksi sinulla on suunnitelma turvallisten monivuokralaiskuormien ajamiseen Dockerissa.

Kun isännöit useita vuokralaisia yhdellä Docker-isännällä, oletusarvoinen säiliöeristys – joka perustuu Linux-nimiavaruuksiin ja cgroupseihin – ei usein riitä. Yhden vuokralaisen säiliöpako voi vaarantaa koko isännän ja kaikki muut säiliöt. Tämä ongelma on erityisen akuutti jaetussa isännöinnissä, SaaS-alustoilla tai missä tahansa skenaariossa, jossa luottamaton koodi toimii oman koodisi rinnalla. Hyvä uutinen: voit pinota useita eristystekniikoita rakentaaksesi kovetetun monivuokralaisympäristön. Tämä opas käy läpi kuusi käytännön vaihetta, alkaen helpoista toimenpiteistä kuten käyttäjänimiavaruuksista aina kehittyneisiin toimiin kuten hiekkalaatikkoruntimeihin ja infrastruktuurivalintoihin.

Dockerin oletuseristyksen ymmärtäminen

Docker käyttää Linux-nimiavaruuksia eristääkseen prosesseja, verkkoa, tiedostojärjestelmää ja muita resursseja. Cgroups rajoittaa CPU:ta, muistia ja I/O:ta. Mutta nämä jakavat yhden ytimen – haavoittuvuus ytimessä voi vaikuttaa kaikkiin säiliöihin. Todellinen monivuokralaiskäyttö, erityisesti luottamattomien vuokralaisten kanssa, vaatii puolustuksen syvyyttä. Kuten Monivuokralaisen Docker-arkkitehtuurin suunnittelu: Oikean eristystason valinta -artikkelissa käsitellään, eristystasot vaihtelevat heikosta (vain nimiavaruudet) vahvaan (laitteistovirtualisointi). Aloitetaan heikoimmasta.

Vaihe 1: Ota käyttäjänimiavaruudet käyttöön

Oletusarvoisesti säiliön sisällä oleva root-käyttäjä kuvastuu isännän root-käyttäjään. Säiliöpako antaa täyden pääsyn isäntään. Käyttäjänimiavaruudet kartoittavat säiliön root-käyttäjän ulkopuoliseen ei-root-käyttäjään. Ota se käyttöön globaalisti komennolla dockerd --userns-remap=default tai säiliökohtaisesti komennolla --userns=host. Tämä yksinkertainen toimenpide poistaa monet etuoikeuksien korotushyökkäykset. Testaa sovelluksesi: jotkut, jotka vaativat isäntätason oikeuksia (esim. tiedostojärjestelmien liittäminen), saattavat rikkoutua. Drupal- tai WordPress-sivustoilla se on yleensä turvallista.

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

Seccomp rajoittaa järjestelmäkutsuja, joita säiliö voi tehdä. Dockerin mukana tulee oletusarvoinen seccomp-profiili, joka estää vaaralliset järjestelmäkutsut, kuten mount ja reboot. Monivuokralaiskäytössä tiukenna sitä edelleen – estä harvinaiset järjestelmäkutsut, joita pakotyökalut käyttävät. Samoin AppArmor voi rajoittaa säiliöprosesseja. Luo mukautettu AppArmor-profiili, joka estää kirjoitusoikeuden ytimen liittymiin ja rajoittaa tiedostopolkuja. Molemmat asetetaan --security-opt-lipuilla. Yhdistä ne kerrokselliseksi puolustukseksi.

Vaihe 3: Käytä vuokralaiskohtaisia Docker-palvelimia

Yhden Docker-palvelimen käyttäminen kaikille vuokralaisille on riskialtista – mikä tahansa säiliöpako voi päästä käsiksi palvelimen socketiin. Eristä palvelimet vuokralaisittain käyttämällä Docker-in-Docker (DinD) -menetelmää tai etäpalvelimen päätepisteitä. Esimerkiksi käynnistä Docker-palvelin säiliön sisällä --privileged-lipulla (mutta tämä heikentää eristystä). Parempi lähestymistapa: aja erillisiä palvelimia erillisissä virtuaalikoneissa tai käytä Dockerin kokeellista --group-ominaisuutta käyttäjänimiavaruuksien kanssa. Orkestroinnissa Kubernetesin nimiavaruuspohjainen eristys on käytännöllisempi, kuten Säiliöpaon torjunta: Käytännön opas Docker-eristykseen monivuokralaisisännöinnissä -artikkelissa käsitellään.

Vaihe 4: Harkitse hiekkalaatikkoruntimeja

Kun Linux-ydin itse on luottamaton, käytä hiekkalaatikkoruntimea, joka lisää kevyen VM-kerroksen. gVisor (runsc) sieppaa järjestelmäkutsut ja toteuttaa oman ytimen, kun taas Firecracker käyttää mikrovirtuaalikoneita laitteistovirtualisoinnilla. Molemmat integroituvat Dockeriin containerd-runtimejen kautta. Lisää esimerkiksi "runtimes": {"runsc": {}} Docker-palvelimen konfiguraatioon ja aja säiliöt --runtime=runsc-lipulla. Suorituskyvyn ylikuormitus on 5–15%, mutta eristys on huomattavasti vahvempi. Ihanteellinen korkean turvallisuuden monivuokralaisasetuksiin.

Vaihe 5: Orkestroi Kubernetesilla ja turvallisuuskäytännöillä

Kubernetes tarjoaa natiivin monivuokralaisuuden nimiavaruuksien, Pod-turvallisuusstandardien ja verkkokäytäntöjen kautta. Määritä vuokralaiskohtaiset nimiavaruudet resurssikiintiöillä ja pakota rajoitettuja pod-turvallisuuskonteksteja (pudota kaikki kyvyt, lukumuotoinen juuritiedostojärjestelmä). Pääsynvalvojat kuten OPA/Gatekeeper voivat estää virheelliset konfiguraatiot. Jos hallinnoit monia vuokralaisia, Kubernetes automatiosoi eristyksen valvonnan. Tuotantotason orkestrointia varten katso Beyond Docker Compose: Tuotantovalmiiden konttisovellusten orkestrointi.

Vaihe 6: Valitse oikea isännöintipalveluntarjoaja

Infrastruktuuripalveluntarjoajasi hypervisorilla on merkitystä. Docker jaetussa isännöinnissä (OpenVZ) antaa heikon eristyksen – yksi vuokralainen voi nähdä toisten prosessit. Suosi palveluntarjoajia, jotka käyttävät KVM:ää tai VMwarea, jotka tarjoavat laitteistotason erottelun. Palveluntarjoajat kuten DigitalOcean, Kamatera tai AWS tarjoavat KVM-pohjaisia VPS:itä omistetuilla resursseilla. Rautatasolla varmista, että BIOS-tason virtualisointi on käytössä sisäkkäisille säiliöille. Palveluntarjoaja, joka eristää vuokralaiset hypervisor-tasolla, täydentää säiliöeristystä. Kuten Docker-eristyksen hallinta turvalliseen ja tehokkaaseen web-isännöintiin -artikkelissa kerrotaan, isäntäkäyttöjärjestelmä tulisi myös kovettaa minimaalisella hyökkäyspinnalla.

Varoitukset ja kompromissit

Jokainen lisäkerros lisää monimutkaisuutta ja suorituskykykustannuksia. Käyttäjänimiavaruudet voivat rikkoa isäntäliitetyt taltiot. Seccomp-profiilit vaativat sovelluskohtaista hienosäätöä. Hiekkalaatikkoruntimet kuten gVisor eivät tue kaikkia järjestelmäkutsuja – sovelluksesi ei ehkä toimi. Vuokralaiskohtaiset Docker-palvelimet lisäävät muistin ylikuormitusta. Valitse eristystaso, joka vastaa uhkamalliasi: luotetuille vuokralaisille oletusnimiavaruudet saattavat riittää; julkisille SaaS-palveluille sijoita runtime-hiekkalaatikoihin ja Kubernetes-käytäntöihin. Testaa perusteellisesti ennen tuotantoon vientiä.

Yhteenveto

Todellinen monivuokralaiseristys Dockerissa on saavutettavissa kerrostamalla useita ytimen ominaisuuksia, runtime-hiekkalaatikoita ja orkestrointivalvontaa. Aloita käyttäjänimiavaruuksista ja seccompista, etene sitten vuokralaiskohtaisiin palvelimiin tai hiekkalaatikkoruntimeihin. Suuressa mittakaavassa Kubernetes tarjoaa käytäntöohjattua eristystä. Yhdistä aina hypervisor-tasolla eroteltuun isäntään hyvämaineiselta palveluntarjoajalta. Yksikään tekniikka ei ole luodinkestävä, mutta niiden yhdistäminen luo vankan puolustuksen. Vuokralaisesi kiittävät sinua – ja samoin turvallisuustarkastuksesi.

Sources (5)