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_ADMIN tai CAP_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-data ja mysql).
  • Kaikki oikeudet pudotettu, vain NET_BIND_SERVICE lisä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)