Kubernetes Pivoting to Clouds
GCP
Jeśli uruchamiasz klaster k8s wewnątrz GCP, prawdopodobnie chcesz, aby niektóre aplikacje uruchomione wewnątrz klastra miały dostęp do GCP. Istnieją 2 powszechne sposoby, aby to osiągnąć:
Montowanie kluczy GCP-SA jako sekretu
Powszechnym sposobem udzielenia dostępu aplikacji kubernetes do GCP jest:
Utwórz konto usługi GCP
Przypisz do niego pożądane uprawnienia
Pobierz klucz json utworzonego SA
Zamontuj go jako sekret wewnątrz poda
Ustaw zmienną środowiskową GOOGLE_APPLICATION_CREDENTIALS wskazującą ścieżkę, gdzie znajduje się plik json.
Dlatego, jako atakujący, jeśli skompromitujesz kontener wewnątrz poda, powinieneś sprawdzić tę zmienną środowiskową i pliki json z danymi uwierzytelniającymi GCP.
Powiązanie json GSA z sekretem KSA
Sposób udzielenia dostępu GSA do klastra GKE polega na ich powiązaniu w następujący sposób:
Utwórz konto usługi Kubernetes w tej samej przestrzeni nazw co Twój klaster GKE, używając następującej komendy:
Utwórz tajemnicę Kubernetes, która zawiera dane uwierzytelniające konta usługi GCP, do którego chcesz udzielić dostępu do klastra GKE. Możesz to zrobić za pomocą narzędzia wiersza poleceń
gcloud
, jak pokazano w poniższym przykładzie:
Przypisz tajemnicę Kubernetes do konta usługi Kubernetes za pomocą następującej komendy:
W drugim kroku ustawiono poświadczenia GSA jako tajemnicę KSA. Następnie, jeśli możesz odczytać tę tajemnicę z wnętrza 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 tak, aby działało jako konto usługi Google. Pojemniki uruchamiane z kontem usługi Kubernetes automatycznie uwierzytelniają się jako konto usługi Google podczas dostępu do interfejsów API Google Cloud.
Pierwsza seria kroków do włączenia tego zachowania polega na włączeniu Tożsamości Obciążenia w GCP (kroki) i utworzeniu konta GCP SA, które chcesz, aby k8s podawał się za nie.
Włącz Tożsamość Obciążenia w nowym klastrze
Utwórz/Zaktualizuj nowy nodepool (Klastry Autopilot nie potrzebują tego)
Utwórz Konto usługi GCP do podrobienia z K8s z uprawnieniami GCP:
Połącz się z klastrzem i utwórz konto usługi do użycia
Połącz GSA z KSA
Uruchom pod z KSA i sprawdź dostęp do GSA:
Sprawdź poniższą komendę w celu uwierzytelnienia, jeśli jest to konieczne:
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 próbowanie nadużyć każdego KSA w klastrze i sprawdzenie, czy ma dostęp.
Zawsze interesujące jest wyliczenie powiązań z GCP i zrozumienie, jakie uprawnienia nadajesz SAs wewnątrz Kubernetes.
To skrypt umożliwia łatwe iterowanie po definicjach wszystkich modułów w poszukiwaniu tej adnotacji:
AWS
Kiam & Kube2IAM (IAM role for Pods)
Jednym (przestarzałym) sposobem przyznawania ról IAM dla modułów jest użycie Kiam lub Kube2IAM serwera. W zasadzie musisz uruchomić daemonset w swoim klastrze z rodzajem uprzywilejowanej roli IAM. Ten daemonset będzie odpowiedzialny za udzielenie dostępu do ról IAM modułom, które go potrzebują.
Po pierwsze musisz skonfigurować które role mogą być dostępne wewnątrz przestrzeni nazw, i robisz to za pomocą adnotacji w obiekcie przestrzeni nazw:
Gdy przestrzeń nazw jest skonfigurowana z rolami IAM, możesz wskazać rolę, którą chcesz przypisać do każdej definicji poda za pomocą czegoś w rodzaju:
Jako atakujący, jeśli znajdziesz te adnotacje w podach lub przestrzeniach nazw lub uruchomionym serwerze kiam/kube2iam (prawdopodobnie w kube-system), możesz podawać się za każdą rolę, która jest już używana przez pody i więcej (jeśli masz dostęp do konta AWS, wylicz 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 i ta rola musi mieć do niej dostęp.
Rola IAM dla kont usług K8s za pomocą OIDC
Jest to zalecany sposób przez AWS.
Po pierwsze musisz utworzyć dostawcę OIDC dla klastra.
Następnie tworzysz rolę IAM z uprawnieniami, których będzie wymagał SA.
Utwórz relację zaufania między rolą IAM a SA nazwą (lub przestrzeniami nazw, które umożliwiają 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.
Wreszcie, utwórz SA z adnotacją wskazującą ARN roli, a pody działające z tym SA będą miały dostęp do tokenu 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ć dostęp do aws za pomocą tokena z /var/run/secrets/eks.amazonaws.com/serviceaccount/token
, uruchom:
Jako atakujący, jeśli możesz wyliczyć klaster K8s, sprawdź konta usług z tą adnotacją, aby eskalować do AWS. Aby to zrobić, po prostu wykonaj/utwórz pod używając jednego z uprzywilejowanych kont usług IAM i skradnij token.
Co więcej, jeśli jesteś wewnątrz poda, sprawdź zmienne środowiskowe takie jak AWS_ROLE_ARN i AWS_WEB_IDENTITY_TOKEN.
Czasami Polityka Zaufania roli może być źle skonfigurowana i zamiast udzielać dostępu AssumeRole oczekiwanemu kontu usługi, udziela go wszystkim kontom usług. Dlatego jeśli jesteś w stanie napisać adnotację na kontrolowanym koncie usługi, możesz uzyskać dostęp do roli.
Sprawdź następną stronę po więcej informacji:
Znajdź Pody i Konta Usług z Rolami IAM w Klasterze
To jest skrypt do łatwego iterowania po wszystkich podach i definicjach kont usług szukając tej adnotacji:
Rola IAM węzła
Poprzedni rozdział dotyczył sposobów kradzieży ról IAM za pomocą kubków, ale zauważ, ż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żna ukraść (zauważ, że zazwyczaj wszystkie węzły klastra K8s będą miały tę samą rolę IAM, więc może nie warto sprawdzać każdego węzła).
Jednak istnieje ważne wymaganie dotyczące dostępu do punktu końcowego metadanych z węzła, musisz być na węźle (sesja ssh?) lub przynajmniej mieć tę samą sieć:
Skradnij token roli IAM
Wcześniej omówiliśmy, jak dołączyć role IAM do modułów lub nawet jak uciec do węzła, aby ukraść rolę IAM, którą instancja ma dołączoną do siebie.
Możesz użyć poniższego skryptu, aby ukraść nowo zdobyte poświadczenia roli IAM:
Odnośniki
Last updated