Docker Security

Jifunze AWS hacking kutoka sifuri hadi shujaa na htARTE (HackTricks AWS Red Team Expert)!

Njia nyingine za kusaidia HackTricks:

Tumia Trickest kujenga na kutumia mchakato kwa urahisi uliosukumwa na zana za jamii za juu zaidi duniani. Pata Ufikiaji Leo:

Usalama wa Msingi wa Docker Engine

Docker engine hutumia Namespaces na Cgroups ya kernel ya Linux kuisolate kontena, kutoa safu ya msingi ya usalama. Ulinzi wa ziada unatolewa kupitia Capabilities dropping, Seccomp, na SELinux/AppArmor, kuimarisha kuisolotea kontena. Plugin ya uthibitishaji inaweza kuzuia vitendo vya mtumiaji zaidi.

Upatikanaji Salama wa Docker Engine

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 uwakilishi.

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 juu ya soketi ya HTTP kwa kuongeza mipangilio ifuatayo:

DOCKER_OPTS="-D -H unix:///var/run/docker.sock -H tcp://192.168.56.101:2376"
sudo service docker restart

Hata hivyo, kufunua Docker daemon kupitia HTTP sio kupendekezwa kutokana na wasiwasi wa usalama. Ni vyema kusimamia uhusiano kwa kutumia HTTPS. Kuna njia kuu mbili za kusimamia uhusiano:

  1. Mteja anathibitisha utambulisho wa seva.

  2. Mteja na seva wanathibitisha utambulisho wao kwa kila mmoja.

Vyeti hutumiwa kuthibitisha utambulisho wa seva. Kwa mifano kamili ya njia zote mbili, tazama mwongozo huu.

Usalama wa Picha za Kontena

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: Huduma ya usajili ya biashara ya Docker, ikionyesha uthibitishaji wa mtumiaji kulingana na jukumu na ushirikiano na huduma za saraka za LDAP.

Uchunguzi wa Picha

Kontena zinaweza kuwa na mapungufu ya usalama kutokana na picha ya msingi au kutokana na 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.

Kwa mashauri zaidi soma hii.

  • docker scan

Amri ya docker scan inaruhusu kuchunguza picha za Docker zilizopo kwa kutumia jina au ID ya picha. Kwa mfano, endesha amri ifuatayo kuchunguza picha ya hello-world:

docker scan hello-world

Testing hello-world...

Organization:      docker-desktop-test
Package manager:   linux
Project name:      docker-image|hello-world
Docker image:      hello-world
Licenses:          enabled

 Tested 0 dependencies for known issues, no vulnerable paths found.

Note that we do not currently have vulnerability data for your image.
trivy -q -f json <container_name>:<tag>
snyk container test <image> --json-file-output=<output file> --severity-threshold=high
clair-scanner -w example-alpine.yaml --ip YOUR_LOCAL_IP alpine:3.5

Kusaini Picha za Docker

Kusaini picha za Docker hutoa uhakika na uadilifu wa picha zinazotumiwa kwenye makontena. Hapa kuna maelezo mafupi:

  • Uaminifu wa Yaliyomo ya Docker hutumia mradi wa Notary, uliojengwa kwenye The Update Framework (TUF), kusimamia usaini wa picha. Kwa maelezo zaidi, angalia Notary na TUF.

  • 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 kimeamilishwa, picha zilizosainiwa pekee ndizo zinaweza kupakuliwa. Kusukuma picha ya kwanza kunahitaji kuweka nywila za mizizi na ufunguo wa alama, na Docker pia inaunga mkono Yubikey kwa usalama ulioboreshwa. Maelezo zaidi yanaweza kupatikana hapa.

  • Kujaribu kupakua picha isiyosainiwa na uaminifu wa yaliyomo 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 funguo zako za kibinafsi, tumia amri:

tar -zcvf private_keys_backup.tar.gz ~/.docker/trust/private

Wakati wa kubadili wenyeji wa Docker, ni muhimu kuhamisha funguo za msingi na za hazina ili kudumisha shughuli.


Tumia Trickest kujenga na kutumia mifumo ya kazi kwa urahisi inayotumia zana za jamii za juu zaidi duniani. Pata Ufikiaji Leo:

Vipengele vya Usalama wa Kontena

Maelezo ya Vipengele vya Usalama wa Kontena

Vipengele Kuu vya Kufungia Mchakato

Katika mazingira ya kontena, kufunga miradi na michakato yake ni muhimu kwa usalama na usimamizi wa rasilimali. Hapa kuna maelezo rahisi ya dhana muhimu:

Namespaces

  • Lengo: Kuhakikisha kufungwa kwa rasilimali kama michakato, mtandao, na mfumo wa faili. Hasa katika Docker, namespaces huzuia michakato ya kontena kutoka kwa mwenyeji na kontena nyingine.

  • Matumizi ya unshare: Amri ya unshare (au syscall inayofanana) hutumiwa kuunda namespaces mpya, kutoa safu ya ziada ya kufungwa. Hata hivyo, ingawa Kubernetes haizuili hii kwa asili, Docker inafanya.

  • Kizuizi: Kuunda namespaces mpya haimruhusu mchakato kurejea kwa namespaces za msingi za mwenyeji. Ili kuingia kwenye namespaces za mwenyeji, kawaida mtu atahitaji ufikiaji wa saraka ya /proc ya mwenyeji, kutumia nsenter kwa kuingia.

Vikundi vya Kudhibiti (CGroups)

  • Kazi: Kutumika kuu kwa kugawanya rasilimali kati ya michakato.

  • Upande wa Usalama: CGroups wenyewe hawatoi usalama wa kufungwa, isipokuwa kwa kipengele cha release_agent, ambacho, ikiwa hakijasakinishwa vizuri, kinaweza kutumiwa kwa ufikiaji usiohalali.

Kupunguza Uwezo (Capability Drop)

  • Umuhimu: Ni kipengele muhimu cha usalama kwa kufunga michakato.

  • Utendaji: Inazuia vitendo ambavyo mchakato wa msingi unaweza kufanya kwa kudondosha uwezo fulani. Hata kama mchakato unakimbia na mamlaka ya msingi, kukosa uwezo muhimu kunazuia utekelezaji wa vitendo vya mamlaka, kwani syscalls zitashindwa kutokana na idhini duni.

Hizi ni uwezo uliobaki baada ya mchakato kudondosha wengine:

Current: cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=ep

Seccomp

Imewezeshwa kwa chaguo-msingi kwenye Docker. Inasaidia kupunguza zaidi wito wa syscalls ambao mchakato unaweza kuita. Profaili ya Seccomp ya chaguo-msingi ya Docker inaweza kupatikana kwenye https://github.com/moby/moby/blob/master/profiles/seccomp/default.json

AppArmor

Docker ina kiolesura ambacho unaweza kuamsha: https://github.com/moby/moby/tree/master/profiles/apparmor

Hii itaruhusu kupunguza uwezo, syscalls, ufikiaji wa faili na folda...

Namespaces

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 kujitenga kwa Kontena:

  • pid namespace

  • mount namespace

  • network namespace

  • ipc namespace

  • UTS namespace

Kwa mashauri zaidi kuhusu namespaces angalia ukurasa ufuatao:

pageNamespaces

cgroups

Kipengele 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 iliyoumbwa 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.

docker run -it -m 500M --kernel-memory 50M --cpu-shares 512 --blkio-weight 400 --name ubuntu1 ubuntu bash

Ili kupata cgroup ya kontena unaweza kufanya:

docker run -dt --rm denial sleep 1234 #Run a large sleep inside a Debian container
ps -ef | grep 1234 #Get info about the sleep process
ls -l /proc/<PID>/ns #Get the Group and the namespaces (some may be uniq to the hosts and some may be shred with it)

Kwa maelezo zaidi angalia:

pageCGroups

Uwezo

Uwezo huruhusu udhibiti mzuri 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:

pageLinux Capabilities

Seccomp katika Docker

Hii ni kipengele cha usalama kinachoruhusu Docker kupunguza syscalls zinazoweza kutumika ndani ya kontena:

pageSeccomp

AppArmor katika Docker

AppArmor ni nyongeza ya kernel ya kizuia kontena kwa seti ndogo ya rasilimali na mipangilio ya programu:

pageAppArmor

SELinux katika Docker

  • Mfumo wa Lebo: SELinux inaainisha lebo ya kipekee kwa kila mchakato na kila kitu 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.

  • Kuainisha 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 (kusoma, kuandika, kutekeleza) tu na faili zenye lebo kama container_file_t.

Mfumo huu unahakikisha kuwa hata kama mchakato ndani ya kontena unashambuliwa, umefungwa kuingiliana tu na vitu vyenye lebo zinazofanana, ikipunguza kwa kiasi kikubwa uharibifu unaoweza kutokea kutokana na mashambulizi kama hayo.

pageSELinux

AuthZ & AuthN

Katika Docker, programu ya idhini inacheza jukumu muhimu katika usalama kwa kuamua ikiwa kuruhusu au kuzuia maombi kwa daemon ya Docker. Uamuzi huu hufanywa kwa kuchunguza muktadha wa muhimu:

  • 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 operesheni za Docker.

pageAuthZ& AuthN - Docker Access Authorization Plugin

DoS kutoka kwa kontena

Ikiwa hauruhusu ipasavyo rasilimali ambazo kontena inaweza kutumia, kontena iliyoshambuliwa inaweza kufanya DoS kwenye mwenyeji ambapo inaendeshwa.

  • CPU DoS

# stress-ng
sudo apt-get install -y stress-ng && stress-ng --vm 1 --vm-bytes 1G --verify -t 5m

# While loop
docker run -d --name malicious-container -c 512 busybox sh -c 'while true; do :; done'
  • Kupunguza Bandwidth

nc -lvp 4444 >/dev/null & while true; do cat /dev/urandom | nc <target IP> 4444; done

Bendera za Kuvutia za Docker

Bendera ya --privileged

Kwenye ukurasa ufuatao unaweza kujifunza maana ya bendera ya --privileged:

pageDocker --privileged

--security-opt

no-new-privileges

Ikiwa unatekeleza kontena ambapo mshambuliaji anafanikiwa kupata ufikivu kama mtumiaji wa mamlaka ya chini. Ikiwa una binary ya suid iliyopangiliwa vibaya, mshambuliaji anaweza kuitumia na kuongeza mamlaka ndani ya kontena. Hii, inaweza kumruhusu kutoroka kutoka humo.

Kutekeleza kontena na chaguo la no-new-privileges kuwezeshwa kutazuia aina hii ya ongezeko la mamlaka.

docker run -it --security-opt=no-new-privileges:true nonewpriv

Nyingine

#You can manually add/drop capabilities with
--cap-add
--cap-drop

# You can manually disable seccomp in docker with
--security-opt seccomp=unconfined

# You can manually disable seccomp in docker with
--security-opt apparmor=unconfined

# You can manually disable selinux in docker with
--security-opt label:disable

Kwa chaguo zaidi za --security-opt angalia: https://docs.docker.com/engine/reference/run/#security-configuration

Mambo Mengine ya Kuzingatia kuhusu Usalama

Usimamizi wa Siri: Mbinu Bora

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. Walakini, 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:

  1. Kupitia mazingira ya mazingira: export DOCKER_BUILDKIT=1

  2. Kwa kuongeza awali kwenye amri: DOCKER_BUILDKIT=1 docker build .

  3. Kwa kuwezesha kwa chaguo-msingi katika usanidi wa Docker: { "vipengele": { "buildkit": kweli } }, ikifuatiwa na kuanzisha upya kwa Docker.

BuildKit inaruhusu matumizi ya siri za wakati wa kujenga kwa chaguo la --secret, ikihakikisha siri hizi hazijumuishwi katika hifadhi ya kujenga picha au picha ya mwisho, kwa kutumia amri kama vile:

docker build --secret my_key=my_value ,src=path/to/my_secret_file .

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:

version: "3.7"
services:
my_service:
image: centos:7
entrypoint: "cat /run/secrets/my_secret"
secrets:
- my_secret
secrets:
my_secret:
file: ./my_secret_file.txt

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

gVisor ni kiini cha programu, kilichoandikwa kwa Go, ambacho kinafanya sehemu kubwa ya uso wa mfumo wa Linux. Kina OCI (Open Container Initiative) 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 kuzindua kontena zilizofungwa.

Kata Containers

Kata Containers ni jumuiya ya chanzo wazi inayofanya kazi ya kujenga runtime salama wa kontena na mashine za kawaida zenye uzito ambazo hutoa kujitenga kwa mzigo wenye nguvu kwa kutumia teknolojia ya utoaji wa virtualization ya vifaa kama safu ya pili ya ulinzi.

Vidokezo vya Muhtasari

  • Usitumie bendera ya --privileged au uweke soketi ya Docker ndani ya kontena. Soketi ya docker inaruhusu kuzindua kontena, hivyo ni njia rahisi ya kuchukua udhibiti kamili wa mwenyeji, kwa mfano, kwa kuzindua kontena nyingine na bendera ya --privileged.

  • Usitumie akaunti ya mizizi ndani ya kontena. Tumia mtumiaji tofauti na nafasi za mtumiaji na user namespaces. Mizizi ndani ya kontena ni sawa na kwenye mwenyeji isipokuwa imebadilishwa na nafasi za mtumiaji. Inazuiliwa kidogo tu na, kimsingi, nafasi za Linux, uwezo, na vikundi vya kudhibiti.

  • Acha uwezo wote (--cap-drop=all) na wezesha tu wale unaohitaji (--cap-add=...). Mzigo mwingi 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.

  • Punguza rasilimali zilizopo kwa kontena. Vizuizi vya rasilimali vinaweza kulinda mashine kutokana na mashambulizi ya kukataa huduma.

  • Badilisha seccomp, AppArmor (au SELinux) maelezo ya kikomo kuzuia hatua na syscalls zinazopatikana kwa kontena kwa kiwango cha chini kinachohitajika.

  • Tumia picha rasmi za docker na hitaji saini au jenga yako kulingana na hizo. Usirithi au kutumia picha zilizopitishwa nyuma. Pia hifadhi funguo za mizizi, nywila mahali salama. Docker ina mipango ya kusimamia funguo na UCP.

  • Rekebisha mara kwa mara picha zako ili kutekeleza visasa vya usalama kwa mwenyeji na picha.

  • Simamia siri zako kwa busara ili iwe ngumu kwa mshambuliaji kuzipata.

  • Ikiwa unafunua kiini cha docker tumia HTTPS na uthibitishaji wa mteja na seva.

  • Katika Dockerfile yako, pendekeza COPY badala ya ADD. ADD inachambua faili zilizopachikwa 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

Kuvunja / Kuongeza Mamlaka ya Docker

Ikiwa uko ndani ya kontena ya docker au una ufikiaji wa mtumiaji katika kikundi cha docker, unaweza kujaribu kutoroka na kuongeza mamlaka:

pageDocker Breakout / Privilege Escalation

Kupuuza Plugin ya Uthibitishaji wa Docker

Ikiwa una ufikiaji wa soketi ya docker au una ufikiaji wa mtumiaji katika kikundi cha docker lakini vitendo vyako vinazuiliwa na programu ya uthibitishaji wa docker, angalia ikiwa unaweza kuipuuza:

pageAuthZ& AuthN - Docker Access Authorization Plugin

Kufanya Salama ya Docker

Marejeo

Tumia Trickest kujenga na kutumia taratibu za kiotomatiki zinazotumia zana za jumuiya za juu zaidi za ulimwengu. Pata Ufikiaji Leo:

Jifunze kuhusu kuvamia AWS kutoka sifuri hadi shujaa na htARTE (HackTricks AWS Red Team Expert)!

Njia nyingine za kusaidia HackTricks:

Last updated