Kubernetes Pivoting to Clouds
GCP
Ako pokrećete k8s klaster unutar GCP-a, verovatno ćete želeti da neka aplikacija koja se pokreće unutar klastera ima pristup GCP-u. Postoje 2 uobičajena načina za to:
Montiranje GCP-SA ključeva kao tajne
Uobičajeni način da se dodeli pristup kubernetes aplikaciji GCP-u je:
Kreirajte GCP Service Account
Dodelite mu željene dozvole
Preuzmite json ključ kreiranog SA
Montirajte ga kao tajnu unutar poda
Postavite GOOGLE_APPLICATION_CREDENTIALS okruženjsku promenljivu koja pokazuje putanju do json fajla.
Stoga, kao napadač, ako kompromitujete kontejner unutar poda, trebali biste proveriti da li postoji ta env promenljiva i json fajlovi sa GCP akreditacijama.
Povezivanje GSA json sa KSA tajnom
Način da se omogući pristup GSA GKE klasteru je da ih povežete na sledeći način:
Kreirajte Kubernetes service account u istom namespace-u kao vaš GKE klaster koristeći sledeću komandu:
Kreirajte Kubernetes tajnu koja sadrži podatke za prijavljivanje na GCP servisni nalog kojem želite dati pristup GKE klasteru. To možete uraditi koristeći
gcloud
alatku komandne linije, kao što je prikazano u sledećem primeru:
Povežite Kubernetes tajnu sa Kubernetes servisnim nalogom koristeći sledeću komandu:
U drugom koraku postavljene su poverljive informacije o GSA kao tajna KSA. Ako možete pročitati tu tajnu iz unutrašnjosti GKE klastera, možete preći na taj GCP servisni nalog.
GKE Workload Identity
Pomoću Workload Identity, možemo konfigurisati Kubernetes servisni nalog da deluje kao Google servisni nalog. Podovi koji rade sa Kubernetes servisnim nalogom će se automatski autentifikovati kao Google servisni nalog prilikom pristupa Google Cloud API-ima.
Prva serija koraka za omogućavanje ove funkcionalnosti je omogućavanje Workload Identity u GCP-u (koraci) i kreiranje GCP SA koji želite da k8s predstavlja.
Omogući Workload Identity na novom klasteru
Kreiraj/Ažuriraj novi nodepool (Autopilot klasteri ne zahtevaju ovo)
Kreirajte GCP servisni nalog za impersonaciju iz K8s sa GCP dozvolama:
Povežite se sa klasterom i kreirajte nalog za servis koji će se koristiti
Povežite GSA sa KSA
Pokrenite pod sa KSA i proverite pristup GSA:
Proverite sledeću komandu za autentifikaciju ako je potrebno:
Kao napadač unutar K8s-a, trebali biste tražiti SA sa iam.gke.io/gcp-service-account
anotacijom, jer to ukazuje da SA može pristupiti nečemu u GCP-u. Druga opcija bila bi pokušati zloupotrijebiti svaki KSA u klasteru i provjeriti ima li pristup.
Iz GCP-a je uvijek zanimljivo nabrojati veze i znati koji pristup dajete SA unutar Kubernetesa.
Ovo je skripta koja olakšava iteriranje kroz sve definicije podova u potrazi za tom anotacijom:
AWS
Kiam & Kube2IAM (IAM uloge za Podove)
Jedan (zastareo) način da se dodeljuju IAM uloge Podovima je korišćenje Kiam ili Kube2IAM servera. U osnovi, trebaće vam da pokrenete daemonset u vašem klasteru sa vrstom privilegovane IAM uloge. Taj daemonset će biti taj koji će omogućiti pristup IAM ulogama podovima kojima je to potrebno.
Prvo, trebate konfigurisati koje uloge mogu biti dostupne unutar namespace-a, a to radite sa anotacijom unutar objekta namespace-a:
Jednom kada je namespace konfigurisan sa IAM ulogama koje mogu imati Podovi, možete navesti ulogu koju želite na svakoj definiciji poda na sledeći način:
Kao napadač, ako pronađete ove anotacije u podovima ili namespace-ima ili pokrenutom kiam/kube2iam serveru (verovatno u kube-system), možete preuzeti identitet svake uloge koju već koriste podovi i još više (ako imate pristup AWS nalogu, možete nabrojati uloge).
Kreiranje Pod-a sa IAM ulogom
IAM uloga koju treba navesti mora biti u istom AWS nalogu kao i kiam/kube2iam uloga i ta uloga mora imati pristup njoj.
IAM uloga za K8s servisne naloge putem OIDC
Ovo je preporučeni način od strane AWS-a.
Prvo trebate kreirati OIDC provajdera za klaster.
Zatim kreirate IAM ulogu sa dozvolama koje će SA zahtevati.
Kreirajte poverenjski odnos između IAM uloge i SA imena (ili namespace-ova koji daju pristup ulozi svim SA-ovima u namespace-u). Poverenjski odnos će uglavnom proveriti ime OIDC provajdera, ime namespace-a i ime SA-a.
Na kraju, kreirajte SA sa anotacijom koja ukazuje na ARN uloge, a podovi koji se pokreću sa tim SA-om će imati pristup token-u uloge. Token je upisan u datoteku, a putanja je specificirana u
AWS_WEB_IDENTITY_TOKEN_FILE
(podrazumevano:/var/run/secrets/eks.amazonaws.com/serviceaccount/token
)
Da biste dobili aws koristeći token iz /var/run/secrets/eks.amazonaws.com/serviceaccount/token
, pokrenite:
Kao napadač, ako možete da nabrojite K8s klaster, proverite da li postoje servisni nalozi sa tom anotacijom kako biste se povezali na AWS. Da biste to uradili, jednostavno izvršite/kreirajte pod koristeći jedan od IAM privilegovanih servisnih naloga i ukradite token.
Osim toga, ako se nalazite unutar poda, proverite promenljive okruženja poput AWS_ROLE_ARN i AWS_WEB_IDENTITY_TOKEN.
Ponekad polisa poverenja uloge može biti loše konfigurisana i umesto što daje pristup AssumeRole očekivanom servisnom nalogu, daje pristup svim servisnim nalozima. Stoga, ako možete da napišete anotaciju na kontrolisanom servisnom nalogu, možete pristupiti ulozi.
Proverite sledeću stranicu za više informacija:
Pronalaženje Podova i SAs sa IAM ulogama u Klasteru
Ovo je skripta koja olakšava iteriranje kroz sve podove i definicije sa SAS kako bi se pronašla ta anotacija:
IAM uloga čvora
Prethodni odeljak se odnosio na to kako ukrasti IAM uloge sa podovima, ali treba napomenuti da je čvor K8s klastera instanca unutar oblaka. To znači da je vrlo verovatno da će čvor imati novu IAM ulogu koju možete ukrasti (napomena: obično svi čvorovi K8s klastera imaju istu IAM ulogu, pa možda nije vredno proveravati svaki čvor).
Međutim, postoji važan zahtev za pristupanje metapodacima sa čvora, morate biti na čvoru (ssh sesija?) ili barem imati istu mrežu:
Ukradi IAM Role Token
Prethodno smo razgovarali o tome kako dodati IAM Role na Podove ili čak kako pobegnuti na Node i ukrasti IAM Role koji je povezan sa instancom.
Možete koristiti sledeći skript da ukradete nove, naporno stečene IAM role podatke:
Reference
Last updated