Docker Security
Last updated
Leer & oefen AWS-hacking:HackTricks Opleiding AWS Red Team Expert (ARTE) Leer & oefen GCP-hacking: HackTricks Opleiding GCP Red Team Expert (GRTE)
Gebruik Trickest om maklik te bou en werkstrome outomatiseer wat aangedryf word deur die wêreld se mees gevorderde gemeenskapshulpmiddels. Kry Vandag Toegang:
Die Docker-enjin maak gebruik van die Linux-kernel se Namespaces en Cgroups om houers te isoleer, wat 'n basiese veiligheidslaag bied. Addisionele beskerming word gebied deur Capabilities dropping, Seccomp, en SELinux/AppArmor, wat houer-isolasie verbeter. 'n Auth-plugin kan verdere beperkings op gebruikersaksies plaas.
Die Docker-enjin kan óf plaaslik via 'n Unix-aansluiting óf op afstand deur HTTP benader word. Vir afgeleë toegang is dit noodsaaklik om HTTPS en TLS te gebruik om vertroulikheid, integriteit, en outentisering te verseker.
Die Docker-enjin luister standaard na die Unix-aansluiting by unix:///var/run/docker.sock
. Op Ubuntu-stelsels word Docker se aanvangsopsies in /etc/default/docker
gedefinieer. Om afgeleë toegang tot die Docker-API en -klient moontlik te maak, stel die Docker-daemon bloot oor 'n HTTP-aansluiting deur die volgende instellings by te voeg:
Nietemin, die blootstelling van die Docker daemon oor HTTP word nie aanbeveel nie as gevolg van veiligheidskwessies. Dit word aanbeveel om verbindings te beveilig deur HTTPS te gebruik. Daar is twee hoofbenaderings om die verbinding te beveilig:
Die klient verifieer die bediener se identiteit.
Beide die klient en bediener verifieer mekaar se identiteit.
Sertifikate word gebruik om 'n bediener se identiteit te bevestig. Vir gedetailleerde voorbeelde van beide metodes, verwys na hierdie gids.
Houverbeeld kan gestoor word in privaat of openbare repose. Docker bied verskeie stooropsies vir houverbeeld:
Docker Hub: 'n Openbare registerdiens van Docker.
Docker Registry: 'n oopbronprojek wat gebruikers toelaat om hul eie register te hê.
Docker Trusted Registry: Docker se kommersiële registeraanbod, met rolgebaseerde gebruiker-verifikasie en integrasie met LDAP-gidsdiens.
Houers kan sekuriteitskwessies hê as gevolg van die basisbeeld of as gevolg van die sagteware wat bo-op die basisbeeld geïnstalleer is. Docker werk aan 'n projek genaamd Nautilus wat sekuriteitskandering van Houers doen en die kwessies lys. Nautilus werk deur elke Houerbeeldlaag met die kwessierepositorium te vergelyk om sekuriteitsgate te identifiseer.
Vir meer inligting lees hierdie.
docker scan
Die docker scan
bevel stel jou in staat om bestaande Docker-beelde te skandeer deur die beeldnaam of ID te gebruik. Voer byvoorbeeld die volgende bevel uit om die hello-world beeld te skandeer:
Docker beeld ondertekening verseker die veiligheid en integriteit van beelde wat in houers gebruik word. Hier is 'n beknopte verduideliking:
Om Docker inhoudsvertroue te aktiveer, stel export DOCKER_CONTENT_TRUST=1
in. Hierdie kenmerk is standaard af in Docker weergawe 1.10 en later.
Met hierdie kenmerk geaktiveer, kan slegs ondertekende beelde afgelaai word. Die aanvanklike beeldstoot vereis die instelling van wagwoorde vir die hoof- en etikettering sleutels, met Docker wat ook Yubikey ondersteun vir verbeterde veiligheid. Meer besonderhede kan hier gevind word hier.
'n Poging om 'n ondertekende beeld met inhoudsvertroue geaktiveer af te trek, lei tot 'n "Geen vertroue data vir die nuutste" fout.
Vir beeldstote na die eerste, vra Docker vir die wagwoord van die stoor sleutel om die beeld te onderteken.
Om jou privaat sleutels te rugsteun, gebruik die bevel:
Wanneer jy oorskakel na Docker-gashere, is dit nodig om die hoof- en bewaarpleksleutels te skuif om werksaamhede te handhaaf.
Gebruik Trickest om maklik te bou en werkvloeie te outomatiseer wat aangedryf word deur die wêreld se mees gevorderde gemeenskapsinstrumente. Kry Vandaag Toegang:
Namespaces is 'n kenmerk van die Linux kernel wat kernel hulpbronne verdeel sodat een stel prosesse een stel hulpbronne sien terwyl 'n ander stel prosesse 'n verskillende stel hulpbronne sien. Die kenmerk werk deur dieselfde namespace vir 'n stel hulpbronne en prosesse te hê, maar daardie namespaces verwys na afsonderlike hulpbronne. Hulpbronne kan in meervoudige ruimtes bestaan.
Docker maak gebruik van die volgende Linux kernel Namespaces om Kontainer isolasie te bereik:
pid namespace
mount namespace
network namespace
ipc namespace
UTS namespace
Vir meer inligting oor die namespaces kyk na die volgende bladsy:
NamespacesLinux kernel kenmerk cgroups bied die vermoë om hulpbronne soos cpu, geheue, io, netwerkbandwydte onder 'n stel prosesse te beperk. Docker maak dit moontlik om Kontainers te skep met behulp van die cgroup-funksie wat hulpbronbeheer vir die spesifieke Kontainer moontlik maak. Hieronder is 'n Kontainer geskep met gebruikerspasiëntgeheue beperk tot 500m, kernelgeheue beperk tot 50m, cpu-aandeel tot 512, blkioweight tot 400. CPU-aandeel is 'n verhouding wat Kontainer se CPU-gebruik beheer. Dit het 'n standaardwaarde van 1024 en 'n reeks tussen 0 en 1024. As drie Kontainers dieselfde CPU-aandeel van 1024 het, kan elke Kontainer tot 33% van die CPU neem in geval van CPU-hulpbronstryd. blkio-weight is 'n verhouding wat Kontainer se IO beheer. Dit het 'n standaardwaarde van 500 en 'n reeks tussen 10 en 1000.
Om die cgroup van 'n houer te kry, kan jy doen:
Vir meer inligting kyk:
CGroupsBevoegdhede maak fyn beheer vir die bevoegdhede wat aan die root-gebruiker toegelaat kan word. Docker gebruik die Linux-kernel bevoegdheidseienskap om die operasies wat binne 'n houer gedoen kan word te beperk ongeag die tipe gebruiker.
Wanneer 'n Docker-houer uitgevoer word, laat die proses sensitiewe bevoegdhede vall wat die proses kon gebruik om te ontsnap uit die isolasie. Dit probeer verseker dat die proses nie sensitiewe aksies kan uitvoer en ontsnap nie:
Linux CapabilitiesDit is 'n sekuriteitskenmerk wat Docker toelaat om die syscalls te beperk wat binne die houer gebruik kan word:
SeccompAppArmor is 'n kernel-verbetering om houers tot 'n beperkte stel hulpbronne met per-program profiele te beperk:
AppArmorEtiketteringstelsel: SELinux ken 'n unieke etiket toe aan elke proses en lêersisteemobjek.
Beleidshandhawing: Dit dwing sekuriteitsbeleide af wat definieer watter aksies 'n prosesetiket op ander etikette binne die stelsel kan uitvoer.
Houerprosesetikette: Wanneer houermasjiene houerprosesse inisieer, word hulle gewoonlik toegewys aan 'n beperkte SELinux-etiket, gewoonlik container_t
.
Lêeretikettering binne Houers: Lêers binne die houer word gewoonlik geëtiketteer as container_file_t
.
Beleidreëls: Die SELinux-beleid verseker hoofsaaklik dat prosesse met die container_t
-etiket slegs kan interaksie hê (lees, skryf, uitvoer) met lêers wat geëtiketteer is as container_file_t
.
Hierdie meganisme verseker dat selfs as 'n proses binne 'n houer gekompromitteer is, dit beperk is tot interaksie slegs met objekte wat die ooreenstemmende etikette het, wat die potensiële skade van sulke kompromitterings aansienlik beperk.
SELinuxIn Docker speel 'n outorisasie-inprop 'n kritieke rol in sekuriteit deur te besluit of versoek aan die Docker-daemon toegelaat of geblokkeer moet word. Hierdie besluit word geneem deur twee sleutelkontekste te ondersoek:
Outentiseringskonteks: Dit sluit omvattende inligting oor die gebruiker in, soos wie hulle is en hoe hulle hulself geoutentiseer het.
Opdragkonteks: Dit behels alle relevante data wat verband hou met die versoek wat gedoen word.
Hierdie kontekste help verseker dat slegs legitieme versoek van geoutentiseerde gebruikers verwerk word, wat die sekuriteit van Docker-operasies verbeter.
AuthZ& AuthN - Docker Access Authorization PluginAs jy nie die hulpbronne wat 'n houer kan gebruik behoorlik beperk nie, kan 'n gekompromitteerde houer die gasheer waarop dit hardloop DoS.
CPU DoS
Bandwydte DoS
Op die volgende bladsy kan jy leer wat impliseer die --bevoorregte
vlag:
As jy 'n houer hardloop waar 'n aanvaller daarin slaag om toegang te kry as 'n lae-bevoegdheidsgebruiker. As jy 'n sleg-gekonfigureerde suid-binêre lêer het, kan die aanvaller dit misbruik en bevoegdhede binne die houer opgradeer. Dit kan hom toelaat om daaruit te ontsnap.
Die houer hardloop met die geen-nuwe-bevoegdhede
opsie geaktiveer sal hierdie soort bevoorregte opgradering voorkom.
Vir meer --security-opt
-opsies, kyk na: https://docs.docker.com/engine/reference/run/#security-configuration
Dit is noodsaaklik om te vermy om geheime direk in Docker-beelde in te sluit of om omgewingsveranderlikes te gebruik, aangesien hierdie metodes jou sensitiewe inligting blootstel aan enigiemand met toegang tot die houer deur opdragte soos docker inspect
of exec
.
Docker volumes is 'n veiliger alternatief, aanbeveel vir die benadering van sensitiewe inligting. Hulle kan gebruik word as 'n tydelike lêersisteem in die geheue, wat die risiko's wat verband hou met docker inspect
en logging verminder. Nietemin kan root-gebruikers en diegene met exec
-toegang tot die houer steeds die geheime benader.
Docker-geheime bied 'n selfs veiliger metode vir die hantering van sensitiewe inligting. Vir gevalle wat geheime tydens die beeldboufase benodig, bied BuildKit 'n doeltreffende oplossing met ondersteuning vir bou-tyd-geheime, wat bou spoed verbeter en addisionele kenmerke bied.
Om van BuildKit gebruik te maak, kan dit op drie maniere geaktiveer word:
Deur 'n omgewingsveranderlike: export DOCKER_BUILDKIT=1
Deur opdragte te voorafgaan: DOCKER_BUILDKIT=1 docker build .
Deur dit standaard in die Docker-konfigurasie te aktiveer: { "features": { "buildkit": true } }
, gevolg deur 'n Docker-herlaai.
BuildKit maak die gebruik van bou-tyd-geheime met die --secret
-opsie moontlik, wat verseker dat hierdie geheime nie ingesluit word in die beeldbou-kas of die finale beeld nie, deur 'n opdrag soos die volgende te gebruik:
Vir geheime wat benodig word in 'n lopende houer, bied Docker Compose en Kubernetes robuuste oplossings. Docker Compose maak gebruik van 'n secrets
sleutel in die diensdefinisie om geheime lêers te spesifiseer, soos getoon in 'n docker-compose.yml
voorbeeld:
Hierdie konfigurasie maak die gebruik van geheime inligting moontlik wanneer dienste met Docker Compose begin word.
In Kubernetes-omgewings word geheime inligting op 'n ingeboude manier ondersteun en kan verder bestuur word met gereedskap soos Helm-Secrets. Kubernetes se Rol Gebaseerde Toegangsbeheer (RBAC) verbeter geheime bestuursbeveiliging, soortgelyk aan Docker Enterprise.
gVisor is 'n aansoek-kernel, geskryf in Go, wat 'n aansienlike deel van die Linux-sisteemoppervlak implementeer. Dit sluit 'n Open Container Initiative (OCI) uitvoertyd genaamd runsc
in wat 'n isolasiegrens tussen die aansoek en die gasheerkernel bied. Die runsc
uitvoertyd integreer met Docker en Kubernetes, wat dit eenvoudig maak om gesandbokte houers te hardloop.
Kata Containers is 'n oopbron-gemeenskap wat werk aan die bou van 'n veilige houeruitvoertyd met ligte virtuele masjiene wat soos houers voel en optree, maar sterker werklas-isolasie bied deur hardeware-virtualisering tegnologie as 'n tweede verdedigingslaag.
Moenie die --privileged
vlag gebruik of 'n Docker-aansluiting binne die houer monteer nie. Die docker-aansluiting maak dit moontlik om houers te skep, dus is dit 'n maklike manier om volle beheer oor die gasheer te neem, byvoorbeeld deur 'n ander houer met die --privileged
vlag te hardloop.
Moet nie as wortel binne die houer hardloop nie. Gebruik 'n verskillende gebruiker en gebruiker-ruimtes. Die wortel in die houer is dieselfde as op die gasheer tensy dit met gebruiker-ruimtes herkartografeer word. Dit word slegs lig beperk deur, hoofsaaklik, Linux-ruimtes, vermoëns en cgroups.
Laat alle vermoëns val (--cap-drop=all
) en aktiveer slegs dié wat benodig word (--cap-add=...
). Baie werkbelastings benodig nie enige vermoëns nie en die byvoeging daarvan verhoog die omvang van 'n potensiële aanval.
Gebruik die "geen-nuwe-voorregte" veiligheidsoptie om te voorkom dat prosesse meer voorregte verkry, byvoorbeeld deur suid-binêre lêers.
Beperk hulpbronne wat aan die houer beskikbaar is. Hulpbronlimiete kan die masjien teen ontkenning van diensaanvalle beskerm.
Gebruik amptelike docker-beelde en vereis handtekeninge of bou jou eie gebaseer op hulle. Moet nie erfenis of agterdeur beelde gebruik nie. Berg ook wortelsleutels, wagwoord op 'n veilige plek op. Docker het planne om sleutels met UCP te bestuur.
Herbou gereeld jou beelde om sekuriteitsopdaterings op die gasheer en beelde toe te pas.
Bestuur jou geheime inligting wyslik sodat dit moeilik vir die aanvaller is om daartoe toegang te verkry.
As jy die docker-daemon blootstel, gebruik HTTPS met klient- en bedienerverifikasie.
In jou Dockerfile, gee voorkeur aan KOPIE in plaas van BYVOEG. BYVOEG onttrek outomaties gezipde lêers en kan lêers vanaf URL's kopieer. KOPIE het nie hierdie vermoëns nie. Vermy waar moontlik BYVOEG sodat jy nie vatbaar is vir aanvalle deur afgeleë URL's en Zip-lêers nie.
Het afsonderlike houers vir elke mikrodiens
Moenie ssh binne die houer sit nie, "docker exec" kan gebruik word om na die houer te ssh.
Het kleiner houer beelde
As jy binne 'n docker-houer is of toegang het tot 'n gebruiker in die docker-groep, kan jy probeer om te ontsnap en voorregte te opgradeer:
Docker Breakout / Privilege EscalationAs jy toegang het tot die docker-aansluiting of toegang het tot 'n gebruiker in die docker-groep maar jou aksies word beperk deur 'n docker-verifikasie-inprop, kyk of jy dit kan deurloophaal:
AuthZ& AuthN - Docker Access Authorization PluginDie gereedskap docker-bench-security is 'n skrip wat tientalle algemene beste praktyke ondersoek rakende die implementering van Docker-houers in produksie. Die toetse is almal geoutomatiseer en is gebaseer op die CIS Docker Benchmark v1.3.1. Jy moet die gereedskap vanaf die gasheer wat Docker hardloop of vanaf 'n houer met genoeg voorregte hardloop. Vind uit hoe om dit in die README te hardloop: https://github.com/docker/docker-bench-security.
Gebruik Trickest om maklik werkstrome te bou en te outomatiseer wat aangedryf word deur die wêreld se mees gevorderde gemeenskapsgereedskap. Kry Vandag Toegang:
Leer & oefen AWS-hacking: HackTricks Opleiding AWS Red Team Expert (ARTE) Leer & oefen GCP-hacking: HackTricks Opleiding GCP Red Team Expert (GRTE)