AuthZ& AuthN - Docker Access Authorization Plugin
Docker-ov podrazumevani model autorizacije je sve ili ništa. Svaki korisnik sa dozvolom za pristup Docker demonu može izvršiti bilo koju Docker klijent komandu. Isto važi i za pozivatelje koji koriste Docker-ov Engine API da bi kontaktirali demon. Ako zahtevate veću kontrolu pristupa, možete kreirati pluginske za autorizaciju i dodati ih u konfiguraciju vašeg Docker demona. Korišćenjem pluginske za autorizaciju, Docker administrator može konfigurisati granularne pristupne politike za upravljanje pristupom Docker demonu.
Osnovna arhitektura
Docker Auth plugini su eksterni plugini koje možete koristiti da dozvolite/odbijete akcije koje su zatražene od Docker Demona u zavisnosti od korisnika koji je to zatražio i akcije koja je zatražena.
Sledeće informacije su iz dokumentacije
Kada se HTTP zahtev napravi Docker demonu putem CLI-ja ili putem Engine API-ja, podsistem za autentifikaciju prosleđuje zahtev instaliranim pluginskim za autentifikaciju. Zahtev sadrži korisnika (pozivaoca) i kontekst komande. Plugin je odgovoran za odlučivanje da li dozvoliti ili odbijati zahtev.
Dole prikazani dijagrami sekvence prikazuju tok dozvole i odbijanja autorizacije:
Svaki zahtev poslat pluginu uključuje autentifikovanog korisnika, HTTP zaglavlja i telo zahteva/odgovora. Pluginu se prosleđuju samo korisničko ime i metoda autentifikacije koja je korišćena. Najvažnije, ne prosleđuju se korisnički podaci ili tokeni. Na kraju, ne sva zahteva/odgovora se šalju pluginskoj za autorizaciju. Samo ona zahteva/odgovora gde je Content-Type
ili text/*
ili application/json
se šalju.
Za komande koje potencijalno mogu preuzeti HTTP konekciju (HTTP Upgrade
), kao što je exec
, pluginska za autorizaciju se poziva samo za početne HTTP zahteve. Kada plugin odobri komandu, autorizacija se ne primenjuje na ostatak toka. Konkretno, podaci u toku strimovanja se ne prosleđuju pluginskim za autorizaciju. Za komande koje vraćaju HTTP odgovor u delovima, kao što su logs
i events
, samo HTTP zahtev se šalje pluginskim za autorizaciju.
Tokom obrade zahteva/odgovora, neki tokovi autorizacije mogu zahtevati dodatne upite Docker demonu. Da bi se završili takvi tokovi, plugini mogu pozvati API demona slično kao redovan korisnik. Da bi omogućili ove dodatne upite, plugin mora obezbediti način da administrator konfiguriše odgovarajuće autentifikaciju i sigurnosne politike.
Više Pluginova
Vi ste odgovorni za registrovanje vašeg plugina kao deo pokretanja Docker demona. Možete instalirati više pluginova i povezati ih zajedno. Ovaj lanac može biti uređen. Svaki zahtev demonu prolazi kroz lanac redom. Samo kada svi pluginovi odobre pristup resursu, pristup je odobren.
Primeri Pluginova
Twistlock AuthZ Broker
Plugin authz vam omogućava da kreirate jednostavan JSON fajl koji će plugin čitati kako bi autorizovao zahteve. Na taj način vam pruža mogućnost da veoma lako kontrolišete koje API tačke mogu dostići svaki korisnik.
Ovo je primer koji će dozvoliti Alice i Bob-u da kreiraju nove kontejnere: {"name":"policy_3","users":["alice","bob"],"actions":["container_create"]}
Na stranici route_parser.go možete pronaći vezu između traženog URL-a i akcije. Na stranici types.go možete pronaći vezu između imena akcije i akcije.
Jednostavan Tutorijal za Plugin
Možete pronaći lako razumljiv plugin sa detaljnim informacijama o instalaciji i debagovanju ovde: https://github.com/carlospolop-forks/authobot
Pročitajte README
i kod plugin.go
da biste razumeli kako radi.
Bypass Docker Auth Plugin
Nabrojavanje pristupa
Glavne stvari koje treba proveriti su koje tačke su dozvoljene i koje vrednosti HostConfig su dozvoljene.
Da biste izvršili ovu nabrojavanje, možete koristiti alat https://github.com/carlospolop/docker_auth_profiler.
Nedozvoljen run --privileged
run --privileged
Minimalne privilegije
Pokretanje kontejnera i dobijanje privilegovanog sesije
U ovom slučaju, sistem administrator onemogućio je korisnicima da montiraju volumene i pokreću kontejnere sa --privileged
zastavicom ili daju bilo kakvu dodatnu sposobnost kontejneru:
Međutim, korisnik može kreirati shell unutar pokrenutog kontejnera i dati mu dodatne privilegije:
Sada korisnik može da pobegne iz kontejnera koristeći bilo koju od prethodno diskutovanih tehnika i poveća privilegije unutar hosta.
Montiranje foldera sa dozvolom pisanja
U ovom slučaju, sistem administrator je onemogućio korisnicima da pokreću kontejnere sa --privileged
zastavicom ili daje bilo kakve dodatne mogućnosti kontejneru, i dozvolio je samo montiranje /tmp
foldera:
Imajte na umu da možda ne možete montirati direktorijum /tmp
, ali možete montirati drug direktorijum za pisanje. Možete pronaći direktorijume za pisanje koristeći: find / -writable -type d 2>/dev/null
Imajte na umu da neće svi direktorijumi na Linux mašini podržavati suid bit! Da biste proverili koji direktorijumi podržavaju suid bit, pokrenite mount | grep -v "nosuid"
. Na primer, obično /dev/shm
, /run
, /proc
, /sys/fs/cgroup
i /var/lib/lxcfs
ne podržavaju suid bit.
Takođe imajte na umu da ako možete montirati /etc
ili bilo koji drugi direktorijum koji sadrži konfiguracione fajlove, možete ih promeniti iz Docker kontejnera kao root kako biste ih zloupotrebili na hostu i eskalirali privilegije (možda izmenom /etc/shadow
).
Neproverena API tačka
Odgovornost sistem administratora koji konfiguriše ovaj plugin je da kontroliše koje akcije i sa kojim privilegijama svaki korisnik može izvršiti. Stoga, ako administrator koristi crnu listu za pristupne tačke i atribute, može se desiti da zaboravi neke od njih koje bi omogućile napadaču da eskalira privilegije.
Možete proveriti Docker API na https://docs.docker.com/engine/api/v1.40/#
Neproverena JSON struktura
Binds u root-u
Moguće je da je sistem administrator prilikom konfigurisanja Docker firewall-a zaboravio na neki važan parametar API-ja kao što je "Binds". U sledećem primeru moguće je iskoristiti ovu konfiguraciju da se kreira i pokrene kontejner koji montira root (/) folder hosta:
Primetite kako u ovom primeru koristimo Binds
parametar kao ključ na nivou korena u JSON-u, ali u API-ju se pojavljuje pod ključem HostConfig
Binds u HostConfig-u
Sledite iste instrukcije kao i za Binds u korenu izvršavajući ovaj zahtev prema Docker API-ju:
Montaže u korenu
Pratite iste instrukcije kao i za Veze u korenu izvršavajući ovaj zahtev prema Docker API-ju:
Montaže u HostConfig-u
Pratite iste instrukcije kao i za Veze u root-u izvršavajući ovaj zahtev prema Docker API-ju:
Neprovereni JSON atribut
Moguće je da je sistem administrator prilikom konfigurisanja docker firewall-a zaboravio na neki važan atribut parametra API-ja kao što je "Capabilities" unutar "HostConfig". U sledećem primeru je moguće iskoristiti ovu lošu konfiguraciju kako bi se kreirao i pokrenuo kontejner sa SYS_MODULE sposobnostima:
HostConfig
je ključ koji obično sadrži zanimljive privilegije za bekstvo iz kontejnera. Međutim, kao što smo već diskutovali, primetite kako korišćenje Binds izvan njega takođe funkcioniše i može vam omogućiti da zaobiđete ograničenja.
Onemogućavanje dodatka
Ako je sistemski administrator zaboravio da zabrani mogućnost onemogućavanja dodatka, možete iskoristiti to da ga potpuno onemogućite!
Zapamtite da ponovo omogućite dodatak nakon eskalacije, inače restartovanje docker servisa neće raditi!
Bypass writeups za Auth Plugin
Reference
Last updated