Docker Security
Last updated
Jifunze na zoea AWS Hacking:Mafunzo ya HackTricks AWS Timu Nyekundu Mtaalam (ARTE) Jifunze na zoea GCP Hacking: Mafunzo ya HackTricks GCP Timu Nyekundu Mtaalam (GRTE)
Tumia Trickest kujenga na kutumia mifumo ya kazi kwa urahisi inayotumia zana za jamii za juu zaidi ulimwenguni. Pata Ufikiaji Leo:
Docker engine hutumia Namespaces na Cgroups ya kernel ya Linux kuisolate kontena, ikitoa safu ya msingi ya usalama. Kinga ya ziada hutolewa kupitia Capabilities dropping, Seccomp, na SELinux/AppArmor, ikiboresha kuisolishwa kwa kontena. Plugin ya uthibitishaji inaweza kuzuia vitendo vya mtumiaji zaidi.
Docker engine unaweza kupatikana kimtandao kupitia soketi ya Unix au kijijini kwa kutumia HTTP. Kwa upatikanaji wa kijijini, ni muhimu kutumia HTTPS na TLS kuhakikisha usiri, uadilifu, na uthibitisho.
Docker engine, kwa chaguo-msingi, husikiliza kwenye soketi ya Unix kwa unix:///var/run/docker.sock
. Kwenye mifumo ya Ubuntu, chaguzi za kuanzisha Docker zinapatikana katika /etc/default/docker
. Ili kuwezesha upatikanaji wa kijijini kwa API na mteja wa Docker, fungua daemon ya Docker kwenye soketi ya HTTP kwa kuongeza mipangilio ifuatayo:
Hata hivyo, kufunua Docker daemon kupitia HTTP sio kupendekezwa kutokana na wasiwasi wa usalama. Ni vyema kuhakikisha kuwa mawasiliano yanafanyika kwa kutumia HTTPS. Kuna njia mbili kuu za kuhakikisha mawasiliano:
Mteja anathibitisha utambulisho wa seva.
Mteja na seva wanathibitisha utambulisho wao kwa kila mmoja.
Vyeti hutumiwa kuthibitisha utambulisho wa seva. Kwa mifano zaidi kuhusu njia zote, tazama mwongozo huu.
Picha za kontena zinaweza kuhifadhiwa katika hifadhi za kibinafsi au za umma. Docker inatoa chaguzi kadhaa za uhifadhi wa picha za kontena:
Docker Hub: Huduma ya usajili wa umma kutoka Docker.
Docker Registry: Mradi wa chanzo wazi kuruhusu watumiaji kuhifadhi usajili wao wenyewe.
Docker Trusted Registry: Usajili wa kibiashara wa Docker, ukiwa na uthibitishaji wa mtumiaji kulingana na jukumu na ushirikiano na huduma za saraka za LDAP.
Kontena zinaweza kuwa na mapungufu ya usalama kutokana na picha ya msingi au programu iliyosanikishwa juu ya picha ya msingi. Docker inafanya kazi kwenye mradi unaoitwa Nautilus ambao hufanya uchunguzi wa usalama wa Kontena na kuorodhesha mapungufu. Nautilus hufanya kazi kwa kulinganisha kila safu ya picha ya Kontena na hifadhi ya mapungufu ili kutambua mapengo ya usalama.
docker scan
Amri ya docker scan
inaruhusu uchunguzi wa picha za Docker zilizopo kwa kutumia jina au kitambulisho cha picha. Kwa mfano, endesha amri ifuatayo kuchunguza picha ya hello-world:
Kusaini picha za Docker hutoa uhakika na usahihi wa picha zinazotumiwa kwenye makontena. Hapa kuna maelezo mafupi:
Ili kuamsha uaminifu wa yaliyomo ya Docker, weka export DOCKER_CONTENT_TRUST=1
. Kipengele hiki kimezimwa kwa chaguo-msingi kwenye Docker toleo 1.10 na baadaye.
Kwa kipengele hiki kikiwa kimeamilishwa, picha zilizosainiwa pekee ndizo zinazoweza kupakuliwa. Kusukuma picha ya kwanza kunahitaji kuweka nywila za msingi na ufunguo wa alama, na Docker pia inaunga mkono Yubikey kwa usalama ulioimarishwa. Maelezo zaidi yanaweza kupatikana hapa.
Kujaribu kupakua picha isiyosainiwa na uaminifu wa yaliyomo ukiwa umewezeshwa husababisha kosa la "Hakuna data ya uaminifu kwa toleo la karibuni".
Kwa kusukuma picha baada ya ya kwanza, Docker inauliza nywila ya ufunguo wa hifadhi ili kusaini picha.
Ili kuhifadhi nakala rudufu za ufunguo wako wa kibinafsi, tumia amri:
Wakati wa kubadili Wenyewe wa Docker, ni muhimu kuhamisha funguo za mizizi na hazina ili kudumisha shughuli.
Tumia Trickest kujenga kwa urahisi na kutumia mifumo ya kiotomatiki inayotumia zana za jamii za juu zaidi duniani. Pata Ufikiaji Leo:
Namespaces ni kipengele cha kernel ya Linux ambacho kinagawa rasilimali za kernel hivi kwamba seti moja ya mchakato inaona seti moja ya rasilimali wakati seti nyingine ya mchakato inaona seti tofauti ya rasilimali. Kipengele hufanya kazi kwa kuwa na namespace ile ile kwa seti ya rasilimali na michakato, lakini hizo namespaces zinahusiana na rasilimali tofauti. Rasilimali inaweza kuwepo katika nafasi nyingi.
Docker hutumia Namespaces za kernel ya Linux zifuatazo kufikia kizuizi cha Kontena:
pid namespace
mount namespace
network namespace
ipc namespace
UTS namespace
Kwa mashauri zaidi kuhusu namespaces angalia ukurasa ufuatao:
NamespacesKipengele cha kernel ya Linux cgroups hutoa uwezo wa kizuia rasilimali kama cpu, kumbukumbu, io, upana wa mtandao miongoni mwa seti ya michakato. Docker inaruhusu kuunda Kontena kwa kutumia kipengele cha cgroup ambacho huruhusu kudhibiti rasilimali kwa Kontena maalum. Hapa chini ni Kontena iliyoundwa na kikomo cha kumbukumbu ya nafasi ya mtumiaji hadi 500m, kumbukumbu ya nafasi ya kernel hadi 50m, mgawo wa cpu hadi 512, blkioweight hadi 400. Mgawo wa CPU ni uwiano unaodhibiti matumizi ya CPU ya Kontena. Ina thamani ya chaguo-msingi ya 1024 na inaenea kati ya 0 na 1024. Ikiwa Kontena tatu zina mgawo sawa wa CPU wa 1024, kila Kontena inaweza kuchukua hadi 33% ya CPU katika kesi ya mgogoro wa rasilimali ya CPU. blkio-weight ni uwiano unaodhibiti IO ya Kontena. Ina thamani ya chaguo-msingi ya 500 na inaenea kati ya 10 na 1000.
Ili kupata cgroup ya kontena unaweza kufanya:
Kwa maelezo zaidi angalia:
CGroupsUwezo huruhusu udhibiti bora wa uwezo ambao unaweza kuruhusiwa kwa mtumiaji wa mizizi. Docker hutumia kipengele cha uwezo cha kernel ya Linux ili izuie shughuli zinazoweza kufanywa ndani ya Kontena bila kujali aina ya mtumiaji.
Wakati kontena ya docker inapoendeshwa, mchakato hupunguza uwezo wenye hisia ambao mchakato unaweza kutumia kutoroka kutoka kwa kizuizi. Hii inajaribu kuhakikisha kuwa mchakato hautaweza kutekeleza vitendo vyenye hisia na kutoroka:
Linux CapabilitiesHii ni kipengele cha usalama kinachoruhusu Docker kizuia syscalls zinazoweza kutumika ndani ya kontena:
SeccompAppArmor ni nyongeza ya kernel ya kizuia kontena kwa seti ndogo ya rasilimali na mipangilio ya programu:
AppArmorMfumo wa Lebo: SELinux inaandika lebo ya kipekee kwa kila mchakato na kipengee cha mfumo wa faili.
Utekelezaji wa Sera: Inatekeleza sera za usalama ambazo hufafanua vitendo gani lebo ya mchakato inaweza kutekeleza kwenye lebo zingine ndani ya mfumo.
Lebo za Mchakato wa Kontena: Wakati injini za kontena zinaanzisha michakato ya kontena, kawaida hupewa lebo iliyozuiwa ya SELinux, mara nyingi container_t
.
Kuweka Lebo kwenye Faili ndani ya Kontena: Faili ndani ya kontena kawaida huwa na lebo kama container_file_t
.
Sera za Sera: Sera ya SELinux kimsingi inahakikisha kuwa michakato yenye lebo ya container_t
inaweza kuingiliana tu (kusoma, kuandika, kutekeleza) na faili zenye lebo kama container_file_t
.
Mfumo huu unahakikisha kuwa hata kama mchakato ndani ya kontena unashambuliwa, umefungwa kuingiliana tu na vitu vilivyo na lebo zinazofanana, ikipunguza uharibifu unaoweza kutokea kutokana na mashambulizi kama hayo.
SELinuxKatika Docker, programu ya idhini inacheza jukumu muhimu katika usalama kwa kuamua ikiwa kuruhusu au kuzuia maombi kwa daemini ya Docker. Uamuzi huu hufanywa kwa kuchunguza muktadha muhimu wa:
Muktadha wa Uthibitishaji: Hii inajumuisha habari kamili kuhusu mtumiaji, kama ni nani na jinsi walivyothibitishwa.
Muktadha wa Amri: Hii inajumuisha data yote inayohusiana na ombi linalofanywa.
Muktadha huu husaidia kuhakikisha kuwa maombi halali kutoka kwa watumiaji waliothibitishwa tu ndio yanashughulikiwa, ikiboresha usalama wa shughuli za Docker.
AuthZ& AuthN - Docker Access Authorization PluginIkiwa hauruhusu ipasavyo rasilimali ambazo kontena inaweza kutumia, kontena iliyoshambuliwa inaweza kufanya DoS kwenye mwenyeji ambapo inaendeshwa.
CPU DoS
Kupunguza Bandwidth
Kwenye ukurasa ufuatao unaweza kujifunza inamaanisha nini bendera ya --privileged
:
Ikiwa unatekeleza kontena ambapo mshambuliaji anafanikiwa kupata ufikivu kama mtumiaji wa mamlaka ya chini. Ikiwa una binary ya suid iliyokosewa, mshambuliaji anaweza kuitumia na kuongeza mamlaka ndani ya kontena. Ambayo, inaweza kumruhusu kutoroka kutoka humo.
Kutekeleza kontena na chaguo la no-new-privileges
kuwezeshwa kutazuia aina hii ya ongezeko la mamlaka.
Kwa chaguo zaidi za --security-opt
angalia: https://docs.docker.com/engine/reference/run/#security-configuration
Ni muhimu kuepuka kuweka siri moja kwa moja kwenye picha za Docker au kutumia mazingira ya mazingira, kwani njia hizi zinaweka wazi habari zako nyeti kwa yeyote mwenye ufikiaji wa kontena kupitia amri kama vile docker inspect
au exec
.
Vipimo vya Docker ni mbadala salama, inapendekezwa kwa kupata habari nyeti. Wanaweza kutumika kama mfumo wa faili wa muda katika kumbukumbu, kupunguza hatari zinazohusiana na docker inspect
na kuingia kwenye kumbukumbu. Hata hivyo, watumiaji wa mizizi na wale wenye ufikiaji wa exec
kwenye kontena wanaweza bado kupata siri.
Siri za Docker zinatoa njia salama zaidi ya kushughulikia habari nyeti. Kwa visa vinavyohitaji siri wakati wa hatua ya kujenga picha, BuildKit inatoa suluhisho lenye ufanisi na msaada kwa siri za wakati wa kujenga, kuboresha kasi ya ujenzi na kutoa huduma za ziada.
Ili kutumia BuildKit, inaweza kuamilishwa kwa njia tatu:
Kupitia mazingira ya mazingira: export DOCKER_BUILDKIT=1
Kwa kuongeza awali kwenye amri: DOCKER_BUILDKIT=1 docker build .
Kwa kuwezesha kwa chaguo-msingi katika usanidi wa Docker: { "vipengele": { "buildkit": true } }
, ikifuatiwa na kuanzisha upya kwa Docker.
BuildKit inaruhusu matumizi ya siri za wakati wa kujenga kwa chaguo la --secret
, ikihakikisha siri hizi hazijumuishwi katika kache ya ujenzi wa picha au picha ya mwisho, kwa kutumia amri kama vile:
Kwa siri zinazohitajika katika kontena linaloendeshwa, Docker Compose na Kubernetes hutoa suluhisho imara. Docker Compose hutumia ufunguo wa secrets
katika ufafanuzi wa huduma kwa kuelezea 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 kiasili na zinaweza kusimamiwa zaidi na zana kama Helm-Secrets. Udhibiti wa Siri wa Kubernetes (RBAC) huimarisha usalama wa usimamizi wa siri, kama ilivyo kwa Docker Enterprise.
gVisor ni kiini cha programu, kilichoandikwa kwa Go, ambacho kinafanya sehemu kubwa ya uso wa mfumo wa Linux. Kina Open Container Initiative (OCI) runtime kinachoitwa runsc
ambacho hutoa mpaka wa kujitenga kati ya programu na kiini cha mwenyeji. Runtime ya runsc
inashirikiana na Docker na Kubernetes, ikifanya iwe rahisi kuendesha kontena zilizofungwa kwenye mchanga.
Kata Containers ni jumuiya ya chanzo wazi inayofanya kazi ya kujenga runtime salama wa kontena na mashine za kawaida za dijiti ambazo zinaonekana na kufanya kazi kama kontena, lakini zinatoa kujitenga kwa mzigo wenye nguvu kwa kutumia teknolojia ya kivirtuali ya vifaa kama safu ya pili ya ulinzi.
Usitumie bendera ya --privileged
au uweke soketi ya Docker ndani ya kontena. Soketi ya docker inaruhusu kuzalisha kontena, hivyo ni njia rahisi ya kuchukua udhibiti kamili wa mwenyeji, kwa mfano, kwa kuendesha kontena nyingine na bendera ya --privileged
.
Usiendeshe kama mtumiaji wa mizizi ndani ya kontena. Tumia mtumiaji tofauti na spazi za mtumiaji. Mizizi ndani ya kontena ni sawa na kwenye mwenyeji isipokuwa imebadilishwa na spazi za mtumiaji. Inazuiliwa kidogo tu na, kimsingi, spazi za Linux, uwezo, na vikundi.
Tupa uwezo wote (--cap-drop=all
) na wezesha tu wale ambao ni muhimu (--cap-add=...
). Mzigo mwingi wa kazi hauhitaji uwezo wowote na kuongeza huongeza wigo wa shambulio la uwezekano.
Tumia chaguo la usalama la "no-new-privileges" kuzuia michakato kupata uwezo zaidi, kwa mfano kupitia programu za suid.
Zuia rasilimali zilizopo kwa kontena. Vizuizi vya rasilimali vinaweza kulinda mashine kutokana na mashambulizi ya kukataa huduma.
Tumia picha rasmi za docker na hitaji saini au jenga yako kulingana na hizo. Usirithi au kutumia picha zilizokuwa na mlango wa nyuma. Pia hifadhi funguo za mizizi, nywila mahali salama. Docker ina mipango ya kusimamia funguo na UCP.
Rejenga mara kwa mara picha zako ili kutekeleza visasa vya usalama kwa mwenyeji na picha.
Simamia siri yako kwa busara ili iwe ngumu kwa mshambuliaji kuzipata.
Ikiwa unafunua kiini cha docker tumia HTTPS na uthibitisho wa mteja na mwenyeji.
Katika Dockerfile yako, pendekeza COPY badala ya ADD. ADD inachambua faili zilizozipwa kiotomatiki na inaweza kunakili faili kutoka kwenye URL. COPY haina uwezo huu. Kadri inavyowezekana, epuka kutumia ADD ili usiwe mwepesi kwa 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 kwa ssh kwenye Kontena.
Kuwa na picha ndogo za kontena
Ikiwa uko ndani ya kontena la docker au una ufikiaji kwa mtumiaji katika kikundi cha docker, unaweza kujaribu kutoroka na kuongeza mamlaka:
Docker Breakout / Privilege EscalationIkiwa una ufikiaji wa soketi ya docker au una ufikiaji kwa mtumiaji katika kikundi cha docker lakini vitendo vyako vinazuiliwa na programu ya uthibitishaji wa docker, angalia ikiwa unaweza kuipuuza:
AuthZ& AuthN - Docker Access Authorization PluginZana ya docker-bench-security ni script inayochunguza mamia ya mazoea bora ya kawaida kuhusu kupeleka kontena za Docker kwa uzalishaji. Vipimo vyote ni vya kiotomatiki, na vimejengwa kwenye CIS Docker Benchmark v1.3.1. Unahitaji kuendesha zana kutoka kwa mwenyeji unaendesha docker au kutoka kwa kontena yenye mamlaka za kutosha. Pata jinsi ya kuendesha katika README: https://github.com/docker/docker-bench-security.
Tumia Trickest kujenga na kutumia taratibu za kiotomatiki zinazotumia zana za jumuiya za juu zaidi duniani. Pata Ufikiaji Leo:
Jifunze na zoea AWS Hacking: Mafunzo ya HackTricks AWS Timu Nyekundu Mtaalam (ARTE) Jifunze na zoea GCP Hacking: Mafunzo ya HackTricks GCP Timu Nyekundu Mtaalam (GRTE)