Kubernetes Pivoting to Clouds
GCP
Jeśli uruchamiasz klaster k8s w GCP, prawdopodobnie chcesz, aby jakaś aplikacja działająca w klastrze miała dostęp do GCP. Istnieją 2 powszechne sposoby, aby to zrobić:
Montowanie kluczy GCP-SA jako sekret
Powszechnym sposobem na nadanie dostępu do aplikacji kubernetes do GCP jest:
Utworzenie konta usługi GCP
Przypisanie do niego pożądanych uprawnień
Pobranie klucza json utworzonego SA
Zamontowanie go jako sekret wewnątrz poda
Ustawienie zmiennej środowiskowej GOOGLE_APPLICATION_CREDENTIALS wskazującej na ścieżkę, gdzie znajduje się json.
Dlatego jako atakujący, jeśli skompromitujesz kontener wewnątrz poda, powinieneś sprawdzić tę zmienną środowiskową i pliki json z poświadczeniami GCP.
Powiązanie json GSA z sekretem KSA
Sposobem na nadanie dostępu do GSA klastrowi GKE jest powiązanie ich w ten sposób:
Utwórz konto usługi Kubernetes w tej samej przestrzeni nazw co twój klaster GKE, używając następującego polecenia:
Utwórz tajny obiekt Kubernetes, który zawiera dane uwierzytelniające konta usługi GCP, do którego chcesz przyznać dostęp do klastra GKE. Możesz to zrobić za pomocą narzędzia wiersza poleceń
gcloud
, jak pokazano w następującym przykładzie:
Powiąż Kubernetes Secret z kontem serwisowym Kubernetes za pomocą następującego polecenia:
W drugim kroku ustawiono poświadczenia GSA jako sekret KSA. Następnie, jeśli możesz odczytać ten sekret z wewnątrz klastra GKE, możesz eskalować do tego konta usługi GCP.
Tożsamość obciążenia GKE
Dzięki Tożsamości Obciążenia możemy skonfigurować konto usługi Kubernetes, aby działało jako konto usługi Google. Podsy działające z kontem usługi Kubernetes będą automatycznie uwierzytelniane jako konto usługi Google podczas uzyskiwania dostępu do interfejsów API Google Cloud.
Pierwsza seria kroków w celu włączenia tego zachowania to włączenie Tożsamości Obciążenia w GCP (kroki) i utworzenie SA GCP, które chcesz, aby k8s udawało.
Włącz Tożsamość Obciążenia na nowym klastrze
Utwórz/Zaktualizuj nową pulę węzłów (klastry Autopilot nie potrzebują tego)
Utwórz konto usługi GCP do impersonacji z K8s z uprawnieniami GCP:
Połącz się z klastrem i utwórz konto usługi, które chcesz użyć
Powiąż GSA z KSA
Uruchom pod z KSA i sprawdź dostęp do GSA:
Sprawdź następujące polecenie, aby uwierzytelnić się w razie potrzeby:
Jako atakujący wewnątrz K8s powinieneś szukać SAs z adnotacją iam.gke.io/gcp-service-account
, ponieważ wskazuje to, że SA może uzyskać dostęp do czegoś w GCP. Inną opcją byłoby spróbować nadużyć każdego KSA w klastrze i sprawdzić, czy ma dostęp.
Z GCP zawsze interesujące jest enumerowanie powiązań i poznanie jakie uprawnienia przyznajesz SAs wewnątrz Kubernetes.
To jest skrypt do łatwego iterowania po wszystkich definicjach podów szukając tej adnotacji:
AWS
Kiam & Kube2IAM (rola IAM dla Podów)
Jednym (przestarzałym) sposobem na przyznanie ról IAM Podom jest użycie serwera Kiam lub Kube2IAM. W zasadzie musisz uruchomić daemonset w swoim klastrze z rodzajem uprzywilejowanej roli IAM. Ten daemonset będzie tym, który przyzna dostęp do ról IAM podom, które tego potrzebują.
Przede wszystkim musisz skonfigurować które role mogą być dostępne wewnątrz przestrzeni nazw, a robisz to za pomocą adnotacji wewnątrz obiektu przestrzeni nazw:
Gdy przestrzeń nazw jest skonfigurowana z rolami IAM, Pods mogą mieć, możesz określić rolę, którą chcesz na każdej definicji podu, używając czegoś takiego jak:
Jako atakujący, jeśli znajdziesz te adnotacje w podach lub przestrzeniach nazw lub działający serwer kiam/kube2iam (prawdopodobnie w kube-system), możesz podrobić każdą rolę, która jest już używana przez pody i więcej (jeśli masz dostęp do konta AWS, wyenumeruj role).
Utwórz Pod z rolą IAM
Rola IAM, którą należy wskazać, musi znajdować się w tym samym koncie AWS co rola kiam/kube2iam, a ta rola musi mieć do niej dostęp.
IAM Role for K8s Service Accounts via OIDC
To jest zalecany sposób przez AWS.
Przede wszystkim musisz utworzyć dostawcę OIDC dla klastra.
Następnie tworzysz rolę IAM z uprawnieniami, które będą wymagane przez SA.
Utwórz relację zaufania między rolą IAM a SA nazwą (lub przestrzeniami nazw, które dają dostęp do roli wszystkim SA w przestrzeni nazw). Relacja zaufania będzie głównie sprawdzać nazwę dostawcy OIDC, nazwę przestrzeni nazw i nazwę SA.
Na koniec utwórz SA z adnotacją wskazującą ARN roli, a podsy działające z tą SA będą miały dostęp do tokena roli. Token jest zapisany w pliku, a ścieżka jest określona w
AWS_WEB_IDENTITY_TOKEN_FILE
(domyślnie:/var/run/secrets/eks.amazonaws.com/serviceaccount/token
)
Aby uzyskać aws za pomocą tokena z /var/run/secrets/eks.amazonaws.com/serviceaccount/token
, uruchom:
Jako atakujący, jeśli możesz enumerować klaster K8s, sprawdź kontrola serwisowe z tym adnotacją, aby eskalować do AWS. Aby to zrobić, po prostu exec/create pod używając jednego z uprzywilejowanych kont serwisowych IAM i ukradnij token.
Ponadto, jeśli jesteś wewnątrz pod, sprawdź zmienne środowiskowe takie jak AWS_ROLE_ARN i AWS_WEB_IDENTITY_TOKEN.
Czasami Polityka Zaufania roli może być źle skonfigurowana i zamiast dawać dostęp AssumeRole do oczekiwanego konta serwisowego, daje go do wszystkich kont serwisowych. Dlatego, jeśli jesteś w stanie napisać adnotację na kontrolowanym koncie serwisowym, możesz uzyskać dostęp do roli.
Sprawdź następującą stronę po więcej informacji:
Znajdź Pod i SA z rolami IAM w klastrze
To jest skrypt do łatwego iterowania po wszystkich podach i definicjach sas szukając tej adnotacji:
Node IAM Role
Poprzednia sekcja dotyczyła kradzieży ról IAM za pomocą podów, ale należy zauważyć, że Węzeł klastra K8s będzie instancją w chmurze. Oznacza to, że Węzeł prawdopodobnie będzie miał nową rolę IAM, którą możesz ukraść (zauważ, że zazwyczaj wszystkie węzły klastra K8s będą miały tę samą rolę IAM, więc może nie warto próbować sprawdzać każdego węzła).
Istnieje jednak ważny wymóg, aby uzyskać dostęp do punktu końcowego metadanych z węzła, musisz być na węźle (sesja ssh?) lub przynajmniej mieć tę samą sieć:
Steal IAM Role Token
Wcześniej omówiliśmy, jak przypisać role IAM do Podów lub nawet jak uciec do Węzła, aby ukraść rolę IAM, którą instancja ma przypisaną.
Możesz użyć następującego skryptu, aby ukraść swoje nowe, ciężko wypracowane poświadczenia roli IAM:
Odniesienia
Last updated