Blogi
Kaitse konteineri väljapääsu eest: praktiline juhend Dockeri isolatsiooni kohta mitme üürnikuga majutuses
Siit saate teada, kuidas kaitsta Docker-konteinereid väljapääsu haavatavuste ja isolatsioonirikete eest mitme üürnikuga keskkondades konkreetsete sammude ja näidetega.

Kokkuvõte
Docker-konteinerid jagavad hosti kerneli, muutes isolatsiooni kriitiliseks – eriti mitme üürnikuga majutuses, kus üks konteineri väljapääs võib ohustada kõiki üürnikke. Paljud arendajad eeldavad, et konteinerid on täiesti isoleeritud virtuaalmasinad, kuid tegelikkus on teistsugune. See artikkel selgitab Dockeri isolatsiooni (nimiruumid, cgroups) taga olevaid Linuxi kerneli funktsioone ja nendele ohtlikke rünnakute vektoreid. Siit saate teada praktilisi samme oma Dockeri seadistuse tugevdamiseks: privileegide piiramine, turvalise käitusaja kasutamine, kujutiste skannimine ja võrgu segmenteerimine. Järgides reaalmaailma näidet mitme üürnikuga WordPressi majutusteenuse pakkujast, näete, kuidas neid kaitsemeetmeid rakendada. Samuti käsitleme hoiatusi, nagu jõudluse kompromissid ja seccomp/AppArmori kasutamine. Eesmärk on anda teile tugev isolatsioonistrateegia, mis hoiab ära konteineri väljapääsud ja kaitseb teie üürnikke.
Sissejuhatus
Kui haldate mitme üürnikuga majutusplatvormi – olgu see siis jagatud WordPressi majutus, SaaS-rakendus või arenduskeskkonna teenus – on konteineri väljapääs õudusunenägu. Kerneli haavatavus või vale konfiguratsioon võib lasta ühel üürnikul oma konteinerist välja murda ja pääseda juurde teiste üürnike andmetele või hostile endale. Dockeri isolatsioon tugineb Linuxi kerneli funktsioonidele, nagu nimiruumid ja cgroups, kuid vaikeseaded on sageli ebapiisavad robustse turvalisuse tagamiseks. See artikkel juhendab teid rünnakute vektorite kaudu ja pakub tegevussamme oma Docker-konteinerite lukustamiseks, illustreerituna reaalmaailma mitme üürnikuga WordPressi näitega. Laiema ülevaate saamiseks tootmiskorraldusest vaadake meie juhendit Tootmiskõlblike konteinerrakenduste korraldamine.
Dockeri isolatsiooni mõistmine
Docker-konteinerid kasutavad protsessitaseme isolatsiooniks Linuxi nimiruume: PID-nimiruumid isoleerivad protsessipuud, võrgu-nimiruumid eraldavad võrguliidesed, paigaldus-nimiruumid isoleerivad failisüsteemi paigaldused ja kasutaja-nimiruumid võimaldavad konteineri juuri kaardistada volitamata hosti kasutajale. Juhtelemendid (cgroups) piiravad ressursikasutust, nagu CPU, mälu ja kettal I/O. Need funktsioonid koos loovad iga konteineri ümber „liivakasti“. Kuid erinevalt virtuaalmasinast, mis töötab eraldi kerneliga, jagavad konteinerid hosti kerneli. See tähendab, et kerneli haavatavust (nt CVE-2022-0492) saab ära kasutada, et murda välja konteineri nimiruumi isolatsioonist. Lisaks võivad valed konfiguratsioonid, nagu konteineri käitamine juurkasutajana konteineri sees, kõigi võimekuste andmine konteinerile või ebavajalike Linuxi võimekuste mitte mahakandmine, laiendada rünnakupinda.
Rünnakute vektorid
Levinumad rünnakute vektorid hõlmavad:
- Kerneli ekspluateerimine: hosti kerneli vea ärakasutamine hosti juurdepääsu saamiseks.
- Volitatud konteinerid:
--privilegedkäitamine annab kõik võimekused ja möödub enamikust isolatsioonist. - Võimekuste kuritarvitamine: Isegi ilma täieliku volitatud režiimita võib ohtlike võimekustega nagu
CAP_SYS_ADMINvõiCAP_NET_ADMINkonteiner paigaldada failisüsteeme või manipuleerida võrguseadetega. - Ebakindlad kujutiste tavad: teadaolevate haavatavustega baaskujutiste kasutamine või ebavajalike tööriistade, nagu kompilaatorid või kest-tõlgid, lisamine.
- Jagatud paigaldus-nimiruumid: hosti kataloogide paigaldamine konteineritesse võib lubada väljapääsu, kui see pole ainult lugemiseks.
Praktilised turvameetmed
1. Käivitage konteinereid mitte-juurkasutajana
Vaikimisi käitab Docker konteinereid juurkasutajana konteineri sees. Kui ründaja saab konteineri sees juurdepääsu, on tal rohkem mõjuvõimu. Looge oma Dockerfile'is kasutaja ja kasutage USER direktiivi. Samuti vältige Docker Compose'is --user lipu kasutamist, et kaardistada volitamata hosti kasutajale, kui see on võimalik.
2. Kandke maha kõik võimekused ja lisage ainult vajalikud
Linuxi võimekused jaotavad superkasutaja õigused väiksemateks üksusteks. Docker Compose'is kasutage cap_drop: ALL ja seejärel cap_add ainult vajalikke (nt NET_BIND_SERVICE). Vältige ohtlikke võimekusi nagu SYS_ADMIN, NET_ADMIN, SYS_PTRACE.
3. Kasutage ainult lugemiseks juurfailisüsteemi
Määrake oma konteineri definitsioonis read_only: true. See takistab ründajatel konteineri failisüsteemi kirjutamist. Kui teie rakendus vajab ajutiste failide kirjutamist, paigaldage sinna tmpfs-maht.
4. Lubage kasutaja nimiruumi ümberkaardistamine
Kasutaja nimiruumi ümberkaardistamine kaardistab konteineri juurkasutaja mitte-juur hosti kasutajaks. See lisab isolatsioonikihi, sest isegi kui konteineri juur murrab välja, on neil ümberkaardistatud kasutaja õigused. Lubage see /etc/docker/daemon.json failis "userns-remap": "default" abil. Olge teadlik, et see võib muuta mahu õigused keerulisemaks. Lisateavet leiate Dockeri isolatsiooni valdamine turvalise ja tõhusa veebimajutuse jaoks.
5. Rakendage Seccomp ja AppArmor/AppArmori profiilid
Seccomp piirab süsteemikutseid, mida konteiner saab teha. Docker pakub vaikimisi seccomp profiili, mis blokeerib ohtlikud süsteemikutse. Samuti saate luua kohandatud profiile. Samamoodi pakub AppArmor (või SELinux) kohustuslikku juurdepääsukontrolli. Kasutage AppArmorit, et piirata oma konteiner minimaalse lubatud toimingute komplektiga. Turvaprofiili saab määrata Docker Compose'is security_opt kaudu.
6. Kasutage minimaalseid baaskujutisi ja skannige haavatavuste järgi
Valige väikesed kujutised nagu Alpine või Distroless, millel on väiksem rünnakupind. Skannige kujutisi regulaarselt tööriistadega nagu Docker Scout, Trivy või Clair. Integreerige skannimine oma CI/CD torujuhtmesse, et vältida haavatavate kujutiste kasutuselevõttu.
7. Võrgu segmenteerimine kohandatud sillavõrkudega
Looge iga üürniku või rakenduse kihi jaoks eraldi sillavõrgud. See piirab idast-läänesse liiklust. Docker Compose'is määrake võrgud ja isoleerige teenused. Kasutage internal: true, kui teenus ei vaja väljaminevat Interneti-juurdepääsu. Hostil olevad tulemüürireeglid piiravad täiendavalt konteineritevahelist liiklust.
8. Piirake ressursse cgroupidega
Määrake CPU ja mälu piirangud Docker Compose'is deploy.resources.limits abil. See takistab kompromiteeritud konteineril käivitada ressursi ammendamise rünnakut. Lisaks määrake peenemaks juhtimiseks kernel_memory ja memory_reservation.
Reaalmaailma näide: mitme üürnikuga WordPressi majutus Docker Compose'iga
Kujutage ette stsenaariumi, kus majutate mitut WordPressi saiti erinevatele klientidele, igaüks oma Docker-konteineris. Ebakindel seadistus võib välja näha järgmine:
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:
See seadistus on haavatav: WordPressi konteiner töötab sees juurkasutajana, omab kõiki võimekusi (kuna ühtegi ei ole maha kantud), paigaldab hosti kataloogi kirjutamisjuurdepääsuga ja omab piiramatut võrguühendust.
Nüüd tugevdame seda:
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:
Põhilised täiustused:
- Mõlemad konteinerid töötavad mitte-juurkasutajatena (
www-datajamysql). - Kõik võimekused on maha kantud, lisatud on ainult
NET_BIND_SERVICE. - WordPressi failisüsteem on ainult lugemiseks, välja arvatud tmpfs-maht ja üleslaadimiste maht.
- Rakendatakse Seccomp ja AppArmori profiile (te peate esitama kohandatud profiilid).
- Eraldi võrgud isoleerivad veebi andmebaasist, andmebaasivõrk on sisemine.
- Ressursipiirangud takistavad ressursside ammendamist.
Lisateavet WordPressi spetsiifilise Dockeri tugevdamise kohta leiate artiklist Docker WordPressi jaoks: miks isoleeritud konteinerid muudavad kõike.
Hoiatused
- Kasutaja nimiruumi ümberkaardistamine: kuigi võimas, rikub see mahu paigaldamist, kuna ümberkaardistatud hosti UID ei ole sama mis konteineri UID. Võimalik, et peate katalooge eelnevalt õigete õigustega looma või kasutama ümberkaardistamise tuge pakkuvaid Docker-mahte.
- Seccomp/AppArmori profiilid: kohandatud profiilid nõuavad teie rakenduse süsteemikutsete ja faili juurdepääsumustrite mõistmist. Liiga piiravad profiilid võivad funktsionaalsust rikkuda. Testige põhjalikult.
- Jõudlus: täiendavad turvakihid, nagu seccomp ja AppArmor, on minimaalse ülekoormusega, kuid ressursipiirangud ja ainult lugemiseks mõeldud failisüsteemid võivad mõjutada kirjutamispõhiseid rakendusi.
- Korralduskompleksus: mitme üürnikuga keskkonnas võib üürnikupõhiste Docker Compose failide haldamine muutuda tülikaks. Kaaluge kõrgema taseme korraldustööriista, nagu Kubernetes, kasutamist, kuid see toob kaasa oma turvakaalutlused.
Järeldus
Konteineri väljapääs on mitme üürnikuga Docker-majutuses reaalne oht, kuid seda saab ennetada. Isolatsioonimehhanismide mõistmise ja kaitse-kihtide rakendamise abil – võimekuste mahakandmine, mitte-juurkasutajana töötamine, kasutaja nimiruumide lubamine, seccomp, AppArmor, võrgu segmenteerimine ja regulaarne kujutiste skannimine – saate riski oluliselt vähendada. Pidage meeles, et Dockeri vaikeseaded ei ole tootmiskõlblikud mitme üürnikuga töökoormuste jaoks. Rakendage need sammud juba täna, et kaitsta oma üürnikke ja infrastruktuuri. Laiema ülevaate saamiseks Dockeri turvalisuse parimatest tavadest vaadake Veebirakenduste turvamine Dockeriga: praktiline juhend isolatsiooni ja parimate tavade kohta.
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®

