Kubernetes Pivoting to Clouds
GCP
As jy 'n k8s-tros in GCP hardloop, wil jy waarskynlik hê dat 'n toepassing wat binne die tros hardloop, toegang tot GCP het. Daar is 2 algemene maniere om dit te doen:
Monteer GCP-SA-sleutels as geheim
'n Algemene manier om toegang tot 'n kubernetes-toepassing tot GCP te gee, is as volg:
Skep 'n GCP-diensrekening
Bind die gewenste toestemmings daaraan
Laai 'n json-sleutel van die geskepte SA af
Monteer dit as 'n geheim binne die houer
Stel die omgewingsveranderlike GOOGLE_APPLICATION_CREDENTIALS in wat na die pad wys waar die json is.
Daarom, as 'n aanvaller, as jy 'n houer binne 'n tros kompromitteer, moet jy kyk vir daardie omgewingsveranderlike en json-lêers met GCP-legitimasie.
Verwantskap tussen GSA-json en KSA-geheim
'n Manier om 'n GSA toegang tot 'n GKE-tros te gee, is deur hulle so te bind:
Skep 'n Kubernetes-diensrekening in dieselfde naamruimte as jou GKE-tros deur die volgende opdrag te gebruik:
Skep 'n Kubernetes-geheim wat die geloofsbriewe van die GCP-diensrekening bevat waartoe jy toegang tot die GKE-cluster wil verleen. Jy kan dit doen deur die
gcloud
-opdraglyn-hulpmiddel te gebruik, soos getoon in die volgende voorbeeld:
Bind die Kubernetes Geheim aan die Kubernetes-diensrekening deur die volgende bevel te gebruik:
In die tweede stap is die volmagte van die GSA as 'n geheim van die KSA ingestel. As jy dan daardie geheim van binne-in die GKE-kluster kan lees, kan jy opgradeer na daardie GCP-diensrekening.
GKE Werklasidentiteit
Met Werklasidentiteit kan ons 'n Kubernetes-diensrekening configureer om as 'n Google-diensrekening op te tree. Pods wat met die Kubernetes-diensrekening loop, sal outomaties as die Google-diensrekening geverifieer word wanneer hulle toegang tot Google Cloud API's verkry.
Die eerste reeks stappe om hierdie gedrag in te skakel, is om Werklasidentiteit in GCP te aktiveer (stappe) en die GCP-diensrekening te skep wat jy wil hê k8s moet voorstel.
Aktiveer Werklasidentiteit op 'n nuwe kluster
Skep/opdateer 'n nuwe nodepool (Autopilot-klusters het dit nie nodig nie)
Skep die GCP-diensrekening om te verteenwoordig vanaf K8s met GCP-toestemmings:
Verbind met die kluster en skep die diensrekening om te gebruik
Bind die GSA met die KSA
Voer 'n pod uit met die KSA en kontroleer die toegang tot die GSA:
Kyk na die volgende bevel om te verifieer in geval dit nodig is:
As 'n aanvaller binne K8s moet jy soek na SAs met die iam.gke.io/gcp-service-account
annotasie, aangesien dit aandui dat die SA toegang het tot iets in GCP. 'n Ander opsie sou wees om elke KSA in die cluster te misbruik en te kyk of dit toegang het.
Vanuit GCP is dit altyd interessant om die bindings op te som en te weet watter toegang jy gee aan SAs binne Kubernetes.
Hierdie is 'n skrip om maklik oor al die pod-definisies te iterasie en te soek na daardie annotasie:
AWS
Kiam & Kube2IAM (IAM rol vir Pods)
'n (verouderde) manier om IAM-rolle aan Pods te gee, is om 'n Kiam of 'n Kube2IAM bediener te gebruik. Jy moet basies 'n daemonset in jou groep met 'n soort bevoorregte IAM-rol laat loop. Hierdie daemonset sal die een wees wat toegang tot IAM-rolle aan die pods wat dit nodig het, gee.
Eerstens moet jy configureer watter rolle binne die namespace toeganklik kan wees, en jy doen dit met 'n annotasie binne die namespace-objek:
Sodra die namespace gekonfigureer is met die IAM-rolle wat die Pods kan hê, kan jy die rol wat jy wil hê op elke pod definisie aandui met iets soos:
As 'n aanvaller, as jy hierdie annotasies in pods of namespaces of 'n kiam/kube2iam bediener vind (waarskynlik in kube-system), kan jy elke rol naboots wat reeds deur pods gebruik word en meer (as jy toegang het tot die AWS-rekening, tel die rolle op).
Skep Pod met IAM Rol
Die IAM-rol wat aangedui moet word, moet in dieselfde AWS-rekening as die kiam/kube2iam-rol wees en daardie rol moet toegang daartoe hê.
IAM Rol vir K8s-diensrekeninge via OIDC
Dit is die aanbevole metode deur AWS.
Eerstens moet jy 'n OIDC-verskaffer vir die groep skep. Sien hierdie skakel vir instruksies.
Skep dan 'n IAM-rol met die nodige toestemmings vir die diensrekening.
Skep 'n vertrouensverhouding tussen die IAM-rol en die diensrekening naam (of die name van die name spaces wat toegang tot die rol gee vir al die diensrekeninge van die name space). Die vertrouensverhouding sal hoofsaaklik die OIDC-verskaffer se naam, die name space se naam en die diensrekening se naam nagaan.
Laastens, skep 'n diensrekening met 'n annotasie wat die ARN van die rol aandui, en die houers wat met daardie diensrekening loop, sal toegang tot die token van die rol hê. Die token word geskryf na 'n lêer en die pad word gespesifiseer in
AWS_WEB_IDENTITY_TOKEN_FILE
(verstek:/var/run/secrets/eks.amazonaws.com/serviceaccount/token
).
Om aws te kry deur die token vanaf /var/run/secrets/eks.amazonaws.com/serviceaccount/token
uit te voer, voer die volgende bevel uit:
As 'n aanvaller, as jy 'n K8s-tros kan opspoor, kyk vir diensrekeninge met daardie annotasie om na AWS te eskalasie. Om dit te doen, voer/net 'n hokkie uit/skep met behulp van een van die IAM bevoorregte diensrekeninge en steel die token.
Verder, as jy binne 'n hokkie is, kyk vir omgewingsveranderlikes soos AWS_ROLE_ARN en AWS_WEB_IDENTITY_TOKEN.
Soms kan die Vertrouensbeleid van 'n rol sleg geconfigureer wees en in plaas daarvan om AssumeRole-toegang aan die verwagte diensrekening te gee, gee dit dit aan alle diensrekeninge. Daarom, as jy in staat is om 'n annotasie op 'n beheerde diensrekening te skryf, kan jy toegang verkry tot die rol.
Kyk na die volgende bladsy vir meer inligting:
Vind Hokkies en Diensrekeninge met IAM-rolle in die Tros
Hierdie is 'n skripsie om maklik oor al die hokkies en diensrekeninge definisies te iterasie en te soek na daardie annotasie:
Node IAM Rol
Die vorige afdeling het gegaan oor hoe om IAM-rolle met pods te steel, maar let daarop dat 'n Node van die K8s-cluster 'n instansie binne die wolk gaan wees. Dit beteken dat die Node hoogs waarskynlik 'n nuwe IAM-rol gaan hê wat jy kan steel (let daarop dat gewoonlik al die nodes van 'n K8s-cluster dieselfde IAM-rol sal hê, so dit mag nie die moeite werd wees om op elke node te probeer kyk nie).
Daar is egter 'n belangrike vereiste om toegang te verkry tot die metadata-eindpunt vanaf die node, jy moet in die node wees (ssh-sessie?) of ten minste dieselfde netwerk hê:
Steel IAM Rolle Token
Vroeër het ons bespreek hoe om IAM-rolle aan Pods te heg of selfs hoe om na die Node te ontsnap om die IAM-rol te steel wat aan die instansie geheg is.
Jy kan die volgende skrip gebruik om jou nuwe hard gewerkte IAM-rollegitimasie te steel:
Hierdie skrip sal die volgende doen:
Kry die instansie metadata.
Kry die IAM-rolnaam.
Kry die IAM-rollegitimasie.
Druk die IAM-rollegitimasie.
Verwysings
Last updated