Docker Security
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Use Trickest to easily build and automate workflows powered by the world's most advanced community tools. Get Access Today:
Injini ya Docker inatumia Namespaces na Cgroups za kernel ya Linux ili kutenga kontena, ikitoa safu ya msingi ya usalama. Ulinzi wa ziada unapatikana kupitia Capabilities dropping, Seccomp, na SELinux/AppArmor, ikiongeza kutengwa kwa kontena. Plugin ya uthibitisho inaweza kuzuia vitendo vya mtumiaji zaidi.
Injini ya Docker inaweza kufikiwa kwa ndani kupitia socket ya Unix au kwa mbali kwa kutumia HTTP. Kwa ufikiaji wa mbali, ni muhimu kutumia HTTPS na TLS ili kuhakikisha usiri, uadilifu, na uthibitisho.
Injini ya Docker, kwa default, inasikiliza kwenye socket ya Unix katika unix:///var/run/docker.sock
. Kwenye mifumo ya Ubuntu, chaguo za kuanzisha Docker zimefafanuliwa katika /etc/default/docker
. Ili kuwezesha ufikiaji wa mbali kwa API ya Docker na mteja, fungua daemon ya Docker kupitia socket ya HTTP kwa kuongeza mipangilio ifuatayo:
Hata hivyo, kufichua Docker daemon kupitia HTTP hakupendekezwi kutokana na wasiwasi wa usalama. Inashauriwa kulinda mawasiliano kwa kutumia HTTPS. Kuna mbinu mbili kuu za kulinda mawasiliano:
Mteja anathibitisha utambulisho wa seva.
Wote mteja na seva wanathibitisha utambulisho wa kila mmoja.
Vyeti vinatumika kuthibitisha utambulisho wa seva. Kwa mifano ya kina ya mbinu zote mbili, rejelea hiki kiongozi.
Picha za kontena zinaweza kuhifadhiwa katika hifadhi za kibinafsi au za umma. Docker inatoa chaguzi kadhaa za kuhifadhi picha za kontena:
Docker Hub: Huduma ya usajili wa umma kutoka Docker.
Docker Registry: Mradi wa chanzo wazi unaowezesha watumiaji kuendesha usajili wao wenyewe.
Docker Trusted Registry: Kutoa usajili wa kibiashara wa Docker, ukiwa na uthibitisho wa mtumiaji kulingana na majukumu na ujumuishaji na huduma za directory za LDAP.
Kontena zinaweza kuwa na vulnerabilities za usalama ama kwa sababu ya picha ya msingi au kwa sababu ya programu iliyowekwa juu ya picha ya msingi. Docker inafanya kazi kwenye mradi unaoitwa Nautilus ambao unafanya uchambuzi wa usalama wa Kontena na kuorodhesha vulnerabilities. Nautilus inafanya kazi kwa kulinganisha kila safu ya picha ya Kontena na hifadhi ya vulnerabilities ili kubaini mapengo ya usalama.
Kwa maelezo zaidi soma hii.
docker scan
Amri ya docker scan
inakuwezesha kuchambua picha za Docker zilizopo kwa kutumia jina la picha au ID. Kwa mfano,endesha amri ifuatayo kuchambua picha ya hello-world:
Docker image signing inahakikisha usalama na uadilifu wa picha zinazotumika katika kontena. Hapa kuna maelezo mafupi:
Ili kuwasha uaminifu wa maudhui ya Docker, weka export DOCKER_CONTENT_TRUST=1
. Kipengele hiki hakipo kwa default katika toleo la Docker 1.10 na baadaye.
Ukiwa na kipengele hiki kikiwa kimewashwa, picha zilizotiwa saini pekee ndizo zinaweza kupakuliwa. Kuanzisha kupakia picha kunahitaji kuweka maneno ya siri kwa funguo za mzizi na kuweka alama, huku Docker pia ikisaidia Yubikey kwa usalama wa ziada. Maelezo zaidi yanaweza kupatikana hapa.
Kujaribu kuvuta picha isiyo na saini huku uaminifu wa maudhui ukiwa umewashwa kunasababisha kosa la "No trust data for latest".
Kwa kupakia picha baada ya ya kwanza, Docker inauliza neno la siri la funguo za hifadhi ili kusaini picha.
Ili kuhifadhi funguo zako za kibinafsi, tumia amri:
When switching Docker hosts, it's necessary to move the root and repository keys to maintain operations.
Tumia Trickest kujenga na kujiendesha kiotomatiki kazi zinazotolewa na zana za jamii za kisasa zaidi duniani. Pata Ufikiaji Leo:
Namespaces ni kipengele cha kernel ya Linux ambacho kinagawanya rasilimali za kernel kwa namna ambayo seti moja ya michakato inaona seti moja ya rasilimali wakati seti nyingine ya michakato inaona seti tofauti ya rasilimali. Kipengele hiki kinatumika kwa kuwa na namespace sawa kwa seti ya rasilimali na michakato, lakini namespaces hizo zinarejelea rasilimali tofauti. Rasilimali zinaweza kuwepo katika nafasi nyingi.
Docker inatumia Namespaces zifuatazo za kernel ya Linux ili kufikia kutengwa kwa Kontena:
pid namespace
mount namespace
network namespace
ipc namespace
UTS namespace
Kwa maelezo zaidi kuhusu namespaces angalia ukurasa ufuatao:
NamespacesKipengele cha kernel ya Linux cgroups kinatoa uwezo wa kudhibiti rasilimali kama cpu, memory, io, bandwidth ya mtandao kati ya seti ya michakato. Docker inaruhusu kuunda Kontena kwa kutumia kipengele cha cgroup ambacho kinatoa udhibiti wa rasilimali kwa Kontena maalum. Ifuatayo ni Kontena iliyoundwa na kumbukumbu ya nafasi ya mtumiaji iliyopunguziliwa hadi 500m, kumbukumbu ya kernel iliyopunguziliwa hadi 50m, sehemu ya cpu hadi 512, blkioweight hadi 400. Sehemu ya CPU ni uwiano unaodhibiti matumizi ya CPU ya Kontena. Ina thamani ya default ya 1024 na anuwai kati ya 0 na 1024. Ikiwa Kontena tatu zina sehemu sawa ya CPU ya 1024, kila Kontena inaweza kuchukua hadi 33% ya CPU katika hali ya ushindani wa rasilimali za CPU. blkio-weight ni uwiano unaodhibiti IO ya Kontena. Ina thamani ya default ya 500 na anuwai kati ya 10 na 1000.
Ili kupata cgroup ya kontena unaweza kufanya:
Kwa maelezo zaidi angalia:
CGroupsUwezo unaruhusu udhibiti wa kina kwa uwezo ambao unaweza kuruhusiwa kwa mtumiaji wa root. Docker inatumia kipengele cha uwezo wa kernel ya Linux ili kupunguza shughuli ambazo zinaweza kufanywa ndani ya Kontena bila kujali aina ya mtumiaji.
Wakati kontena la docker linaendeshwa, mchakato unashusha uwezo nyeti ambao mchakato unaweza kutumia kutoroka kutoka kwa kutengwa. Hii inajaribu kuhakikisha kwamba mchakato hauwezi kufanya vitendo nyeti na kutoroka:
Linux CapabilitiesHii ni kipengele cha usalama kinachoruhusu Docker kupunguza syscalls ambazo zinaweza kutumika ndani ya kontena:
SeccompAppArmor ni uboreshaji wa kernel ili kufunga kontena kwa seti ndogo ya rasilimali na profaili za kila programu.:
AppArmorMfumo wa Kuweka Alama: SELinux inatoa alama ya kipekee kwa kila mchakato na kitu cha mfumo wa faili.
Utekelezaji wa Sera: Inatekeleza sera za usalama ambazo zinaeleza ni vitendo vipi alama ya mchakato inaweza kufanya kwenye alama nyingine ndani ya mfumo.
Alama za Mchakato wa Kontena: Wakati injini za kontena zinaanzisha michakato ya kontena, kawaida zinapewa alama ya SELinux iliyofungwa, mara nyingi container_t
.
Kuweka Alama kwa Faili ndani ya Kontena: Faili ndani ya kontena kawaida huwekwa alama kama container_file_t
.
Kanuni za Sera: Sera ya SELinux hasa inahakikisha kwamba michakato yenye alama ya container_t
inaweza kuingiliana tu (kusoma, kuandika, kutekeleza) na faili zilizowekwa alama kama container_file_t
.
Mekanismu hii inahakikisha kwamba hata kama mchakato ndani ya kontena umeathiriwa, umefungwa kuingiliana tu na vitu vilivyo na alama zinazolingana, ikipunguza kwa kiasi kikubwa uharibifu unaoweza kutokea kutokana na athari hizo.
SELinuxKatika Docker, plugin ya idhini ina jukumu muhimu katika usalama kwa kuamua ikiwa ruhusa itatolewa au kuzuia maombi kwa daemon ya Docker. Uamuzi huu unafanywa kwa kuchunguza muktadha miwili muhimu:
Muktadha wa Uthibitishaji: Hii inajumuisha taarifa kamili kuhusu mtumiaji, kama vile nani walivyo na jinsi walivyojithibitisha.
Muktadha wa Amri: Hii inajumuisha data yote muhimu inayohusiana na ombi linalofanywa.
Muktadha hii husaidia kuhakikisha kwamba maombi halali tu kutoka kwa watumiaji walioidhinishwa yanashughulikiwa, ikiongeza usalama wa shughuli za Docker.
AuthZ& AuthN - Docker Access Authorization PluginIkiwa hujapunguza ipasavyo rasilimali ambazo kontena linaweza kutumia, kontena lililoathiriwa linaweza kufanya DoS kwa mwenyeji ambapo linaendesha.
CPU DoS
Bandwidth DoS
Katika ukurasa ufuatao unaweza kujifunza ni nini --privileged
flag inamaanisha:
Ikiwa unakimbia kontena ambapo mshambuliaji anafanikiwa kupata ufikiaji kama mtumiaji wa hadhi ya chini. Ikiwa una suid binary iliyo na makosa, mshambuliaji anaweza kuitumia vibaya na kuinua hadhi ndani ya kontena. Hii, inaweza kumruhusu kutoroka kutoka kwake.
Kukimbia kontena na chaguo la no-new-privileges
limewezeshwa kutazuia aina hii ya kuinua hadhi.
For more --security-opt
options check: https://docs.docker.com/engine/reference/run/#security-configuration
Ni muhimu kuepuka kuingiza siri moja kwa moja katika picha za Docker au kutumia mabadiliko ya mazingira, kwani mbinu hizi zinaweka taarifa zako nyeti wazi kwa yeyote mwenye ufikiaji wa kontena kupitia amri kama docker inspect
au exec
.
Docker volumes ni mbadala salama, inashauriwa kwa kufikia taarifa nyeti. Zinweza kutumika kama mfumo wa faili wa muda katika kumbukumbu, kupunguza hatari zinazohusiana na docker inspect
na logging. Hata hivyo, watumiaji wa root na wale wenye ufikiaji wa exec
kwa kontena bado wanaweza kufikia siri hizo.
Docker secrets inatoa njia salama zaidi ya kushughulikia taarifa nyeti. Kwa mifano inayohitaji siri wakati wa awamu ya kujenga picha, BuildKit inatoa suluhisho bora lenye msaada wa siri za wakati wa kujenga, kuimarisha kasi ya kujenga na kutoa vipengele vya ziada.
Ili kutumia BuildKit, inaweza kuanzishwa kwa njia tatu:
Kupitia mabadiliko ya mazingira: export DOCKER_BUILDKIT=1
Kwa kuweka mbele amri: DOCKER_BUILDKIT=1 docker build .
Kwa kuifanya iwe ya default katika usanidi wa Docker: { "features": { "buildkit": true } }
, ikifuatiwa na upya wa Docker.
BuildKit inaruhusu matumizi ya siri za wakati wa kujenga kwa kutumia chaguo la --secret
, kuhakikisha kwamba siri hizi hazijumuishwi katika cache ya kujenga picha au picha ya mwisho, kwa kutumia amri kama:
Kwa siri zinazohitajika katika kontena linalofanya kazi, Docker Compose na Kubernetes zinatoa suluhisho thabiti. Docker Compose inatumia ufunguo wa secrets
katika ufafanuzi wa huduma kwa ajili ya kubainisha faili za siri, kama inavyoonyeshwa katika mfano wa docker-compose.yml
:
Hii usanidi inaruhusu matumizi ya siri wakati wa kuanzisha huduma na Docker Compose.
Katika mazingira ya Kubernetes, siri zinasaidiwa kwa asili na zinaweza kusimamiwa zaidi kwa zana kama Helm-Secrets. Udhibiti wa Upatikanaji Kulingana na Majukumu (RBAC) wa Kubernetes unaboresha usalama wa usimamizi wa siri, sawa na Docker Enterprise.
gVisor ni kernel ya programu, iliyoandikwa kwa Go, ambayo inatekeleza sehemu kubwa ya uso wa mfumo wa Linux. Inajumuisha runtime ya Open Container Initiative (OCI) inayoitwa runsc
ambayo inatoa mipaka ya kutengwa kati ya programu na kernel ya mwenyeji. Runtime ya runsc
inajumuishwa na Docker na Kubernetes, na kufanya iwe rahisi kuendesha kontena zilizowekwa kwenye sanduku.
Kata Containers ni jamii ya chanzo wazi inayofanya kazi kujenga runtime salama ya kontena yenye mashine za virtual nyepesi ambazo zina hisia na utendaji kama kontena, lakini zinatoa kutengwa kwa mzigo mzito kwa kutumia teknolojia ya virtualisasi ya vifaa kama safu ya pili ya ulinzi.
Usitumie bendera ya --privileged
au kuunganisha Docker socket ndani ya kontena. Socket ya docker inaruhusu kuanzisha kontena, hivyo ni njia rahisi ya kuchukua udhibiti kamili wa mwenyeji, kwa mfano, kwa kuendesha kontena nyingine na bendera ya --privileged
.
Usifanye kama root ndani ya kontena. Tumia mtumiaji tofauti na majina ya watumiaji. Root ndani ya kontena ni sawa na kwenye mwenyeji isipokuwa ikirekebishwa na majina ya watumiaji. Inapunguziliwa mbali kidogo na, hasa, majina ya Linux, uwezo, na cgroups.
Ondoa uwezo wote (--cap-drop=all
) na wezesha tu wale wanaohitajika (--cap-add=...
). Mzigo mwingi hauhitaji uwezo wowote na kuongeza uwezo huongeza wigo wa shambulio linaloweza kutokea.
Tumia chaguo la usalama "no-new-privileges" kuzuia michakato kupata zaidi ya uwezo, kwa mfano kupitia binaries za suid.
Punguza rasilimali zinazopatikana kwa kontena. Mipaka ya rasilimali inaweza kulinda mashine kutokana na mashambulizi ya kukataa huduma.
Tumia picha rasmi za docker na hitaji saini au jenga yako mwenyewe kulingana nazo. Usirithi au kutumia picha zenye backdoor. Pia hifadhi funguo za root, neno la siri mahali salama. Docker ina mipango ya kusimamia funguo na UCP.
Kila wakati jenga upya picha zako ili kuweka sasisho za usalama kwa mwenyeji na picha.
Simamia siri zako kwa busara ili iwe vigumu kwa mshambuliaji kuzipata.
Ikiwa unafichua daemon ya docker tumia HTTPS na uthibitishaji wa mteja na seva.
Katika Dockerfile yako, pendelea COPY badala ya ADD. ADD inatoa kiotomatiki kufungua faili zilizoshonwa na inaweza nakala faili kutoka URL. COPY haina uwezo huu. Kila wakati iwezekanavyo, epuka kutumia ADD ili usiwe na hatari ya mashambulizi kupitia URL za mbali na faili za Zip.
Kuwa na kontena tofauti kwa kila huduma ndogo
Usiweke ssh ndani ya kontena, “docker exec” inaweza kutumika kuingia kwenye Kontena.
Kuwa na picha za kontena ndogo
Ikiwa uko ndani ya kontena la docker au una ufikiaji wa mtumiaji katika kikundi cha docker, unaweza kujaribu kutoroka na kupandisha mamlaka:
Docker Breakout / Privilege EscalationIkiwa una ufikiaji wa socket ya docker au una ufikiaji wa mtumiaji katika kikundi cha docker lakini vitendo vyako vinapunguziliwa mbali na plugin ya uthibitishaji wa docker, angalia ikiwa unaweza kuipita:
AuthZ& AuthN - Docker Access Authorization PluginZana docker-bench-security ni script inayokagua mazoea bora ya kawaida kuhusu kupeleka kontena za Docker katika uzalishaji. Majaribio yote ni ya kiotomatiki, na yanategemea CIS Docker Benchmark v1.3.1. Unahitaji kuendesha zana hiyo kutoka kwa mwenyeji anayekimbia docker au kutoka kwa kontena lenye mamlaka ya kutosha. Jifunze jinsi ya kuendesha katika README: https://github.com/docker/docker-bench-security.
Tumia Trickest kujenga na kujiendesha kiotomatiki kwa urahisi kwa kutumia zana za jamii zenye maendeleo zaidi duniani. Pata Ufikiaji Leo:
Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)