AuthZ& AuthN - Docker Access Authorization Plugin
Docker se out-of-the-box outorisasiemodel is alles of niks. Enige gebruiker met toestemming om die Docker-daemon te gebruik, kan enige Docker-kliënt opdrag uitvoer. Dieselfde geld vir oproepers wat die Docker Engine API gebruik om die daemon te kontak. As jy groter toegangsbeheer benodig, kan jy outorisasie-plugins skep en dit by jou Docker-daemon-konfigurasie voeg. Met behulp van 'n outorisasie-plugin kan 'n Docker-administrator fynkorrelige toegangspolisse instel om toegang tot die Docker-daemon te bestuur.
Basiese argitektuur
Docker Auth-plugins is eksterne plugins wat jy kan gebruik om aksies wat aan die Docker Daemon gevra word, toe te laat/weier afhangende van die gebruiker wat dit gevra het en die gevraagde aksie.
Die volgende inligting is van die dokumentasie
Wanneer 'n HTTP-aanvraag deur die CLI of via die Engine API na die Docker-daemon gestuur word, stuur die outentiseringsondersteuning die aanvraag na die geïnstalleerde outentiseringsplugin(s). Die aanvraag bevat die gebruiker (oproeper) en opdragkonteks. Die plugin is verantwoordelik vir die besluit of die aanvraag toegelaat of geweier moet word.
Die volgende sekansdiagramme toon 'n toelaat- en weieringsvloei vir outorisasie:
Elke aanvraag wat na die plugin gestuur word, bevat die geoutentiseerde gebruiker, die HTTP-koppe, en die aanvraag/antwoordliggaam. Slegs die gebruikersnaam en die outentiseringsmetode wat gebruik is, word aan die plugin oorgedra. Belangrik is dat geen gebruikers vollegetuigskrifte of tokens oorgedra word nie. Laastens word nie alle aanvraag/antwoordliggame na die outorisasie-plugin gestuur nie. Slegs daardie aanvraag/antwoordliggame waar die Content-Type
óf text/*
óf application/json
is, word gestuur.
Vir opdragte wat die HTTP-verbinding kan oorneem (HTTP Upgrade
), soos exec
, word die outorisasie-plugin slegs geroep vir die aanvanklike HTTP-aanvrae. Sodra die plugin die opdrag goedkeur, word outorisasie nie op die res van die vloei toegepas nie. Spesifiek word die stroomdata nie aan die outorisasie-plugins oorgedra nie. Vir opdragte wat 'n stuksgewyse HTTP-antwoord teruggee, soos logs
en events
, word slegs die HTTP-aanvraag na die outorisasie-plugins gestuur.
Tydens die verwerking van aanvrae/antwoorde kan sommige outorisasievloei moontlik addisionele navrae aan die Docker-daemon doen. Om sulke vloei te voltooi, kan plugins die daemon API oproep soos 'n gewone gebruiker. Om sulke addisionele navrae moontlik te maak, moet die plugin die middels voorsien om 'n administrateur in staat te stel om behoorlike outentisering- en sekuriteitsbeleide te konfigureer.
Verskeie Plugins
Jy is verantwoordelik vir die registreer van jou plugin as deel van die Docker-daemon se beginproses. Jy kan verskeie plugins installeer en aanmekaar koppel. Hierdie ketting kan georden word. Elke aanvraag aan die daemon gaan in volgorde deur die ketting. Slegs as alle plugins toegang verleen tot die hulpbron, word die toegang verleen.
Plugin-voorbeelde
Twistlock AuthZ Broker
Die plugin authz stel jou in staat om 'n eenvoudige JSON-lêer te skep wat die plugin sal lees om die aanvrae te outoriseer. Dit gee jou dus die geleentheid om baie maklik te beheer watter API-eindpunte elke gebruiker kan bereik.
Hier is 'n voorbeeld wat Alice en Bob in staat stel om nuwe houers te skep: {"name":"policy_3","users":["alice","bob"],"actions":["container_create"]}
Op die bladsy route_parser.go kan jy die verband tussen die gevraagde URL en die aksie vind. Op die bladsy types.go kan jy die verband tussen die aksienaam en die aksie vind.
Eenvoudige Plugin-tutoriaal
Jy kan 'n maklik verstaanbare plugin met gedetailleerde inligting oor installasie en foutopsporing hier vind: https://github.com/carlospolop-forks/authobot
Lees die README
en die plugin.go
-kode om te verstaan hoe dit werk.
Docker Auth Plugin-omseiling
Toegang opspoor
Die belangrikste dinge om te ondersoek is watter eindpunte toegelaat word en watter waardes van HostConfig toegelaat word.
Om hierdie opsporing uit te voer, kan jy die instrument https://github.com/carlospolop/docker_auth_profiler gebruik.
Verbode run --privileged
run --privileged
Minimumvoorregte
Uitvoer van 'n houer en dan 'n bevoorregte sessie kry
In hierdie geval het die stelseladministrateur gebruikers verhinder om volumes te monteer en houers met die --privileged
vlag uit te voer, of enige ekstra vermoë aan die houer te gee:
Een gebruiker kan egter 'n skulp binne die lopende houer skep en dit die ekstra voorregte gee:
Nou kan die gebruiker ontsnap uit die houer deur enige van die voorheen bespreekte tegnieke te gebruik en voorregte binne die gasheer te verhoog.
Monteer Skryfbare Vouer
In hierdie geval het die stelseladministrateur gebruikers verhoed om houers met die --privileged
vlag te hardloop of enige ekstra vermoë aan die houer te gee, en hy het slegs toegelaat om die /tmp
vouer te monteer:
Let daarop dat jy dalk nie die /tmp
-vouer kan koppel nie, maar jy kan 'n ander skryfbare vouer koppel. Jy kan skryfbare gidslys vind deur die volgende te gebruik: find / -writable -type d 2>/dev/null
Let daarop dat nie alle gidslysies in 'n Linux-masjien die suid-bit sal ondersteun nie! Om te bepaal watter gidslysies die suid-bit ondersteun, voer jy mount | grep -v "nosuid"
uit. Byvoorbeeld, gewoonlik ondersteun /dev/shm
, /run
, /proc
, /sys/fs/cgroup
en /var/lib/lxcfs
nie die suid-bit nie.
Let ook daarop dat as jy /etc
of enige ander vouer wat konfigurasie-lêers bevat kan koppel, jy dit as root vanuit die Docker-houer kan wysig om privileges te verhoog (dalk deur /etc/shadow
te wysig).
Ongekontroleerde API-eindpunt
Die verantwoordelikheid van die stelseladministrateur wat hierdie invoegtoepassing konfigureer, sou wees om te beheer watter aksies en met watter bevoegdhede elke gebruiker kan uitvoer. Daarom, as die administrateur 'n swartlys-benadering volg met die eindpunte en die eienskappe, kan hy dalk sommige daarvan vergeet wat 'n aanvaller in staat sou stel om privileges te verhoog.
Jy kan die Docker API nagaan by https://docs.docker.com/engine/api/v1.40/#
Ongekontroleerde JSON-Struktuur
Bind in die wortel
Dit is moontlik dat die stelseladministrateur, toe hy die Docker-firewall gekonfigureer het, 'n belangrike parameter van die API soos "Binds" vergeet het. In die volgende voorbeeld is dit moontlik om van hierdie konfigurasiefout gebruik te maak om 'n houer te skep en uit te voer wat die wortel (/) vouer van die gasheer koppel:
Let daarop hoe ons in hierdie voorbeeld die Binds
param gebruik as 'n sleutel op die hoofvlak in die JSON, maar in die API verskyn dit onder die sleutel HostConfig
Binds in HostConfig
Volg dieselfde instruksies soos met Binds in root deur hierdie versoek na die Docker API te doen:
Monteerings in die wortel
Volg dieselfde instruksies soos met Bind in die wortel deur hierdie versoek na die Docker API uit te voer:
Monteer in HostConfig
Volg dieselfde instruksies soos met Binds in root deur hierdie versoek na die Docker API te doen:
Ongekontroleerde JSON-attribuut
Dit is moontlik dat toe die stelseladministrateur die docker-firewall gekonfigureer het, hy vergeet het van 'n belangrike attribuut van 'n parameter van die API soos "Capabilities" binne "HostConfig". In die volgende voorbeeld is dit moontlik om van hierdie verkeerde konfigurasie misbruik te maak om 'n houer met die SYS_MODULE-vermoë te skep en uit te voer:
Die HostConfig
is die sleutel wat gewoonlik die interessante voorregte bevat om uit die houer te ontsnap. Let egter daarop dat die gebruik van Binds buite dit ook werk en jou mag toelaat om beperkings te omseil.
Plugin Deaktivering
As die sysadmin die vermoë om die plugin te deaktiveer vergeet het, kan jy hiervan gebruik maak om dit heeltemal te deaktiveer!
Onthou om die invoegtoepassing weer te aktiveer nadat jy toegang verkry het, anders sal 'n herlaai van die docker-diens nie werk nie!
Auth Plugin Bypass writeups
Verwysings
Last updated