Blogi
Suojaudu konttien karkaamiselta: Käytännön opas Docker-eristykseen monen vuokralaisen isännöintiin
Opi suojaamaan Docker-kontteja karkaamisyrityksiltä ja eristysongelmilta monen vuokralaisen ympäristöissä konkreettisin askelin ja esimerkein.

Yhteenveto
Docker-kontit jakavat isäntäytimen, mikä tekee eristyksestä kriittistä – erityisesti monen vuokralaisen isännöinnissä, jossa yksi kontin karkaaminen voi vaarantaa kaikki vuokralaiset. Monet kehittäjät olettavat konttien olevan täysin eristettyjä virtuaalikoneita, mutta todellisuus on toinen. Tämä artikkeli selittää Docker-eristyksen taustalla olevat Linux-ytimen ominaisuudet (nimiavaruudet, cgroups) ja niitä uhkaavat hyökkäysvektorit. Opit käytännön toimenpiteitä Docker-asennuksesi koventamiseksi: oikeuksien rajoittaminen, turvallisen ajonaikaisen ympäristön käyttö, kuvien skannaus ja verkon segmentointi. Seuraamalla todellista esimerkkiä monen vuokralaisen WordPress-isännöintipalvelusta näet, miten nämä suojaukset toteutetaan. Käsittelemme myös varoituksia, kuten suorituskykykompromisseja ja seccomp/AppArmor-käyttöä. Tavoitteena on antaa sinulle vankka eristysstrategia, joka estää konttien karkaamisen ja pitää vuokralaisesi turvassa.
Johdanto
Jos ylläpidät monen vuokralaisen isännöintialustaa – olipa kyse jaetusta WordPress-isännöinnistä, SaaS-sovelluksesta tai kehitysympäristöpalvelusta – konttien karkaaminen on painajaismahdollisuus. Ytimen haavoittuvuus tai virheellinen konfiguraatio voi antaa yhden vuokralaisen murtautua ulos kontistaan ja päästä käsiksi muiden vuokralaisten tietoihin tai itse isäntään. Dockerin eristys perustuu Linux-ytimen ominaisuuksiin, kuten nimiavaruuksiin ja cgroupseihin, mutta oletuskonfiguraatiot ovat usein riittämättömiä vankkaan turvallisuuteen. Tämä artikkeli käy läpi hyökkäysvektorit ja tarjoaa toimivia toimenpiteitä Docker-konttiesi lukitsemiseksi, havainnollistettuna todellisella monen vuokralaisen WordPress-esimerkillä. Laajemman katsauksen tuotantoympäristöjen orkestrointiin löydät oppaastamme Tuotantovalmiiden kontitettujen sovellusten orkestrointi.
Docker-eristyksen ymmärtäminen
Docker-kontit käyttävät Linux-nimiavaruuksia prosessitason eristyksen tarjoamiseen: PID-nimiavaruudet eristävät prosessipuita, verkkonimiavaruudet erottavat verkkoliitännät, liitosnimiavaruudet eristävät tiedostojärjestelmän liitokset ja käyttäjänimiavaruudet mahdollistavat kontin root-käyttäjän kartoittamisen isännän privilegion ulkopuoliseen käyttäjään. Ohjausryhmät (cgroups) rajoittavat resurssien käyttöä, kuten CPU:ta, muistia ja levyn I/O:ta. Nämä ominaisuudet yhdessä luovat "hiekkalaatikon" jokaisen kontin ympärille. Kuitenkin, toisin kuin virtuaalikone, joka käyttää erillistä ydintä, kontit jakavat isäntäytimen. Tämä tarkoittaa, että ytimen haavoittuvuutta (esim. CVE-2022-0492) voidaan hyödyntää kontin nimiavaruuseristyksen rikkomiseen. Lisäksi virheelliset konfiguraatiot, kuten konttien ajaminen root-käyttäjänä kontin sisällä, kaikkien oikeuksien antaminen kontille tai tarpeettomien Linux-oikeuksien pudottamatta jättäminen, voivat laajentaa hyökkäyspinta-alaa.
Hyökkäysvektorit
Yleisiä hyökkäysvektoreita ovat:
- Ytimen hyökkäykset: Isäntäytimen bugin hyödyntäminen isäntäkäytön saamiseksi.
- Privilegoidut kontit:
--privileged-lipulla ajaminen antaa kaikki oikeudet ja ohittaa useimmat eristykset. - Oikeuksien väärinkäyttö: Vaikka täyttä privilegoitua tilaa ei käytettäisikään, vaarallisia oikeuksia, kuten
CAP_SYS_ADMINtaiCAP_NET_ADMIN, omaava kontti voi liittää tiedostojärjestelmiä tai manipuloida verkkoasetuksia. - Epäturvalliset kuvakäytännöt: Tunnettuja haavoittuvuuksia sisältävien peruskuvien käyttö tai tarpeettomien työkalujen, kuten kääntäjien tai komentotulkkien, sisällyttäminen.
- Jaetut liitosnimiavaruudet: Isäntähakemistojen liittäminen kontteihin voi mahdollistaa karkaamisen, jos niitä ei ole vain luku -tilassa.
Käytännön turvallisuustoimenpiteet
1. Aja kontteja ei-root-käyttäjänä
Oletuksena Docker ajaa kontteja root-käyttäjänä kontin sisällä. Jos hyökkääjä saa root-oikeudet kontin sisällä, hänellä on enemmän vipuvartta. Luo käyttäjä Dockerfile-tiedostoon ja käytä USER-direktiiviä. Vältä myös --user-lipun käyttöä Docker Compose -tiedostossa mielivaltaisen isäntäkäyttäjän kartoittamiseen, jos mahdollista.
2. Pudota kaikki oikeudet ja lisää vain tarvittavat
Linux-oikeudet jakavat superkäyttäjän oikeudet pienempiin yksiköihin. Docker Compose -tiedostossa käytä cap_drop: ALL ja lisää sitten cap_add vain tarvittavat (esim. NET_BIND_SERVICE). Vältä vaarallisia oikeuksia, kuten SYS_ADMIN, NET_ADMIN, SYS_PTRACE.
3. Käytä vain luku -oikeuksilla olevaa root-tiedostojärjestelmää
Aseta read_only: true kontin määritykseen. Tämä estää hyökkääjiä kirjoittamasta kontin tiedostojärjestelmään. Jos sovelluksesi tarvitsee väliaikaisten tiedostojen kirjoittamista, liitä tmpfs-volyymi kyseiseen sijaintiin.
4. Ota käyttöön käyttäjänimiavaruuden uudelleenmääritys
Käyttäjänimiavaruuden uudelleenmääritys kartoittaa kontin root-käyttäjän ei-root-isäntäkäyttäjään. Tämä lisää eristystasoa, sillä vaikka kontin root-käyttäjä murtautuisi ulos, hänellä on uudelleenmäärityksen mukaisen käyttäjän oikeudet. Ota se käyttöön tiedostossa /etc/docker/daemon.json asetuksella "userns-remap": "default". Huomaa, että tämä voi monimutkaistaa volyymien oikeuksia. Lisätietoja löydät oppaasta Docker-eristyksen hallinta turvalliseen ja tehokkaaseen verkkohostaukseen.
5. Käytä Seccomp- ja AppArmor/AppArmor-profiileja
Seccomp rajoittaa järjestelmäkutsuja, joita kontti voi tehdä. Docker tarjoaa oletusarvoisen seccomp-profiilin, joka estää vaaralliset järjestelmäkutsut. Voit myös luoda mukautettuja profiileja. Vastaavasti AppArmor (tai SELinux) tarjoaa pakollisen pääsynvalvonnan. Käytä AppArmoria rajoittamaan konttisi minimaaliseen sallittujen toimintojen joukkoon. Turvallisuusprofiili voidaan asettaa security_opt-asetuksella Docker Compose -tiedostossa.
6. Käytä minimaalisia peruskuvia ja skannaa haavoittuvuuksien varalta
Valitse pieniä kuvia, kuten Alpine tai Distroless, joilla on pienempi hyökkäyspinta. Skannaa kuvia säännöllisesti työkaluilla, kuten Docker Scout, Trivy tai Clair. Integroi skannaus CI/CD-putkeen estääksesi haavoittuvien kuvien käyttöönoton.
7. Verkon segmentointi mukautetuilla siltiverkoilla
Luo erilliset siltiverkot kullekin vuokralaiselle tai sovellustasolle. Tämä rajoittaa itä-länsi-liikennettä. Määritä Docker Compose -tiedostossa verkot ja eristä palvelut. Käytä internal: true, jos palvelu ei tarvitse ulospäin suuntautuvaa Internet-yhteyttä. Isännän palomuurisäännöt rajoittavat edelleen konttien välistä liikennettä.
8. Rajoita resursseja cgroupseilla
Aseta CPU- ja muistirajoitukset Docker Compose -tiedostossa käyttämällä deploy.resources.limits. Tämä estää vaarantuneen kontin käynnistämästä resurssien ehtymishyökkäystä. Lisäksi aseta kernel_memory ja memory_reservation tarkempaa hallintaa varten.
Todellinen esimerkki: Monen vuokralaisen WordPress-isännöinti Docker Compose -tiedostolla
Harkitse tilannetta, jossa isännöit useita WordPress-sivustoja eri asiakkaille, jokainen omassa Docker-kontissaan. Epäturvallinen asennus voisi näyttää tältä:
version: '3'
services:
wordpress:
image: wordpress:latest
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: exampleuser
WORDPRESS_DB_PASSWORD: examplepass
WORDPRESS_DB_NAME: exampledb
volumes:
- ./wp-content:/var/www/html/wp-content
db:
image: mysql:5.7
environment:
MYSQL_DATABASE: exampledb
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
MYSQL_ROOT_PASSWORD: somewordpress
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
Tämä asennus on haavoittuva: WordPress-kontti ajaa root-käyttäjänä sisällä, sillä on kaikki oikeudet (koska mitään ei ole pudotettu), se liittää isäntähakemiston kirjoitusoikeudella ja sillä on rajoittamaton verkkoyhteys.
Kovennetaan sitä nyt:
version: '3'
services:
wordpress:
image: wordpress:latest
user: www-data
cap_drop:
- ALL
cap_add:
- NET_BIND_SERVICE
read_only: true
tmpfs:
- /var/www/html/wp-content/plugins
security_opt:
- seccomp=seccomp-profile.json
- apparmor=wordpress-profile
networks:
- frontend
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: exampleuser
WORDPRESS_DB_PASSWORD: examplepass
WORDPRESS_DB_NAME: exampledb
volumes:
- wp-uploads:/var/www/html/wp-content/uploads
deploy:
resources:
limits:
cpus: '0.5'
memory: 256M
db:
image: mysql:5.7
user: mysql
cap_drop:
- ALL
cap_add:
- NET_BIND_SERVICE
networks:
- backend
environment:
MYSQL_DATABASE: exampledb
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
MYSQL_ROOT_PASSWORD: somewordpress
volumes:
- db_data:/var/lib/mysql
deploy:
resources:
limits:
cpus: '0.25'
memory: 128M
networks:
frontend:
driver: bridge
internal: false
backend:
driver: bridge
internal: true
volumes:
wp-uploads:
db_data:
Keskeiset parannukset:
- Molemmat kontit ajetaan ei-root-käyttäjinä (
www-datajamysql). - Kaikki oikeudet pudotettu, vain
NET_BIND_SERVICElisätty. - WordPressin tiedostojärjestelmä on vain luku -tilassa, lukuun ottamatta tmpfs-liitosta ja latausten volyymiä.
- Seccomp- ja AppArmor-profiilit on otettu käyttöön (mukautetut profiilit on tarjottava).
- Erilliset verkot eristävät web-liikenteen tietokannasta, tietokantaverkko on sisäinen.
- Resurssirajoitukset estävät resurssien ehtymisen.
Lisätietoja WordPress-kohtaisesta Docker-kovennuksesta löydät artikkelista Docker WordPressille: Miksi eristetyt kontit muuttavat kaiken.
Varoitukset
- Käyttäjänimiavaruuden uudelleenmääritys: Vaikka tehokas, se rikkoo volyymien liittämisen, koska uudelleenmäärityksen mukainen isäntä-UID ei ole sama kuin kontin UID. Saatat joutua luomaan hakemistoja etukäteen oikeilla oikeuksilla tai käyttämään Docker-volyymejä uudelleenmäärityksen tuella.
- Seccomp/AppArmor-profiilit: Mukautetut profiilit vaativat sovelluksesi järjestelmäkutsujen ja tiedostojen käyttökuvioiden ymmärtämistä. Liian rajoittavat profiilit voivat rikkoa toiminnallisuuden. Testaa huolellisesti.
- Suorituskyky: Lisäsuojauskerroksilla, kuten seccomp ja AppArmor, on minimaalinen ylikuorma, mutta resurssirajoitukset ja vain luku -tiedostojärjestelmät voivat vaikuttaa kirjoitusintensiivisiin sovelluksiin.
- Orkestroinnin monimutkaisuus: Monen vuokralaisen ympäristössä per vuokralainen Docker Compose -tiedostojen hallinta voi käydä hankalaksi. Harkitse korkeamman tason orkestrointityökalun, kuten Kubernetesin, käyttöä, mutta se tuo mukanaan omat turvallisuusnäkökulmansa.
Johtopäätös
Konttien karkaaminen on todellinen uhka monen vuokralaisen Docker-isännöinnissä, mutta se on estettävissä. Ymmärtämällä eristysmekanismit ja soveltamalla kerroksittaista puolustusta – oikeuksien pudottaminen, ei-root-käyttäjänä ajaminen, käyttäjänimiavaruuksien, seccomp:n, AppArmor:n, verkon segmentoinnin käyttöönotto ja säännöllinen kuvien skannaus – voit merkittävästi vähentää riskiä. Muista, että Dockerin oletusasetukset eivät ole tuotantovalmiita monen vuokralaisen työkuormille. Toteuta nämä toimenpiteet tänään suojataksesi vuokralaisesi ja infrastruktuurisi. Kattavan yleiskatsauksen Dockerin turvallisuuskäytännöistä löydät oppaasta Web-sovellusten turvaaminen Dockerilla: Käytännön opas eristykseen ja parhaisiin käytäntöihin.
Sources (5)
- Docker and Container Isolation - Medium
- What is container isolation? Mechanisms, limitations, and secure runtimes | Blog - Northflank
- Container Isolation Explained for Kubernetes and Beyond - Edera
- Docker Security: 5 Risks and 12 Best Practices for Securing Your Containers - Tigera.io
- 9 Security Best Practices for Docker Containers - Kinsta®

