Kubernetes Pivoting to Clouds
GCP
Jeśli uruchamiasz klastra k8s w GCP, prawdopodobnie chcesz, aby niektóre aplikacje uruchomione wewnątrz klastra miały dostęp do GCP. Istnieją 2 powszechne sposoby, aby to zrobić:
Montowanie kluczy GCP-SA jako tajemnicy
Powszechnym sposobem udostępnienia dostępu do aplikacji Kubernetes do GCP jest:
Utwórz konto usługi GCP (GCP Service Account)
Przypisz do niego odpowiednie uprawnienia
Pobierz klucz JSON utworzonego konta usługi (SA)
Zamontuj go jako tajemnicę wewnątrz poda
Ustaw zmienną środowiskową GOOGLE_APPLICATION_CREDENTIALS wskazującą ścieżkę do pliku JSON.
Dlatego jako atakujący, jeśli przejmiesz kontener wewnątrz poda, powinieneś sprawdzić tę zmienną środowiskową i pliki JSON z danymi uwierzytelniającymi GCP.
Powiązanie pliku JSON GSA z tajemnicą KSA
Sposób udostępnienia dostępu do GSA w klastrze GKE polega na powiązaniu ich w następujący sposób:
Utwórz konto usługi Kubernetes (Kubernetes service account) 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ącego polecenia:
W drugim kroku ustawiono poświadczenia GSA jako tajemnica KSA. Jeśli możesz odczytać tę tajemnicę z wnętrza klastra GKE, możesz przejść do tego konta usługi GCP.
Tożsamość obciążeniowa GKE
Dzięki tożsamości obciążeniowej możemy skonfigurować konto usługi Kubernetes tak, aby działało jako konto usługi Google. Pojedyncze konta uruchomione 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 to włączenie tożsamości obciążeniowej w GCP (kroki) i utworzenie konta usługi GCP, które chcesz, aby k8s udawał.
Włącz tożsamość obciążeniową w nowym klastrze
Utwórz/aktualizuj nowy nodepool (Klastry Autopilot nie wymagają tego)
Utwórz Konto usługi GCP do udawania z K8s z uprawnieniami GCP:
Połącz się z klastrzem i utwórz konto usługi, które zostanie użyte
Połącz GSA z KSA
Uruchom pod z KSA i sprawdź dostęp do GSA:
Sprawdź poniższą komendę, aby uwierzytelnić się w razie potrzeby:
Jako atakujący wewnątrz K8s powinieneś szukać SA z adnotacją iam.gke.io/gcp-service-account
, ponieważ wskazuje to, że SA ma dostęp do czegoś w GCP. Inną opcją jest próba wykorzystania każdego KSA w klastrze i sprawdzenie, czy ma dostęp.
Zawsze interesujące jest wyliczenie powiązań z GCP i dowiedzenie się, jakie uprawnienia przypisujesz SA wewnątrz Kubernetes.
Oto skrypt, który umożliwia iterację po definicjach wszystkich podów w celu wyszukania tej adnotacji:
AWS
Kiam & Kube2IAM (IAM role dla Pods)
Przestarzały sposób na przypisanie ról IAM do Pods polega na użyciu serwera Kiam lub Kube2IAM. Ogólnie rzecz biorąc, musisz uruchomić daemonset w klastrze z rodzajem uprzywilejowanej roli IAM. Ten daemonset będzie odpowiedzialny za udostępnianie dostępu do ról IAM dla potrzebujących tego podów.
Przede wszystkim musisz skonfigurować jakie role mogą być dostępne wewnątrz przestrzeni nazw, a robisz to za pomocą adnotacji w obiekcie przestrzeni nazw:
Po skonfigurowaniu przestrzeni nazw z rolami IAM, które mogą mieć pody, możesz wskazać rolę, którą chcesz przypisać do każdej definicji poda, używając czegoś takiego jak:
Jako atakujący, jeśli znajdziesz te adnotacje w podach lub przestrzeniach nazw lub działającym serwerze kiam/kube2iam (prawdopodobnie w kube-system), możesz udawać każdą rolę, która jest już używana przez pod i więcej (jeśli masz dostęp do konta AWS, wyliczaj 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.
IAM Role dla kont usług K8s za pomocą 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 konta usług.
Tworzysz relację zaufania między rolą IAM a kontem usługi o nazwie (lub przestrzeniach nazw, które dają dostęp do roli wszystkim kontom usług w przestrzeni nazw). Relacja zaufania będzie głównie sprawdzać nazwę dostawcy OIDC, nazwę przestrzeni nazw i nazwę konta usługi.
Na koniec, tworzysz konto usługi z adnotacją wskazującą ARN roli, a pojemniki uruchamiane z tym kontem usługi będą miały dostęp do tokenu roli. Token jest zapisywany 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
, wykonaj następujące polecenie:
Jako atakujący, jeśli możesz wyliczyć klastra K8s, sprawdź konta usług z tą adnotacją, aby przejść do AWS. Aby to zrobić, po prostu wykonaj/utwórz pod używając jednego z uprzywilejowanych kont usług IAM i kradnij token.
Ponadto, 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 do 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ępującą stronę po więcej informacji:
Znajdź Pody i konta usług z rolami IAM w klastrze
To jest skrypt, który iteruje po wszystkich podach i definicjach kont usług, szukając tej adnotacji:
Rola IAM węzła
Poprzedni rozdział dotyczył kradzieży ról IAM z podów, ale należy zauważyć, że węzeł klastra K8s jest instancją w chmurze. Oznacza to, że węzeł prawdopodobnie będzie posiadał nową rolę IAM, którą można ukraść (należy jednak zauważyć, ż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ć taką samą sieć:
Kradnij token roli IAM
Wcześniej omówiliśmy, jak dołączyć role IAM do Podów lub nawet jak uciec do Node, aby ukraść rolę IAM, którą instancja ma dołączoną.
Możesz użyć poniższego skryptu, aby ukraść nowo zdobyte poświadczenia roli IAM:
Odwołania
Last updated