< Powrót do Artykułów
◆ Case study · Audyt bezpieczeństwa Kubernetes

Jeden pod z internetu.
Klucze do całego klastra.

Klaster Kubernetes w produkcji: dziesiątki zasobów, mikroserwisy, CI/CD, dane klientów. Domyślne ustawienia wyglądały „normalnie" — bo Kubernetes domyślnie jest wygodny, nie bezpieczny. Pokazujemy, jak audyt wg CIS Benchmark i wytycznych NSA/CISA zamienia listę „failed controls" w realną ścieżkę: od jednego kontenera do przejęcia węzła i sekretów całego klastra.

TRYB Config review + pentest POWIERZCHNIA klaster produkcyjny STANDARD CIS · NSA/CISA · MITRE NARZĘDZIA kube-bench · kubescape
RBAC
Nadmiarowe uprawnienia
kont serwisowych
priv
Kontenery z dostępem
do hosta
0
Polityk sieciowych
w całym klastrze
node
Ucieczka z poda
na węzeł

Kubernetes nie jest niebezpieczny. Jest domyślnie wygodny — a to jest dużo gorsze, bo wygoda wygląda jak działający system, podczas gdy bezpieczeństwo trzeba świadomie dołożyć. Większość firm wdraża klaster, „bo działa", i nigdy nie wraca do ustawień, które domyślnie są pootwierane.

Domyślny klaster pozwala kontenerom rozmawiać ze sobą bez ograniczeń, nadaje kontom serwisowym szersze uprawnienia, niż potrzeba, i z radością uruchomi poda z dostępem do systemu plików węzła, jeśli ktoś o to poprosi w manifeście. Każda z tych rzeczy z osobna wygląda niewinnie. Razem tworzą prostą drogę od jednego przejętego kontenera do kontroli nad całym klastrem.

Engagement był w pełni autoryzowany. Połączyliśmy automatyczny przegląd konfiguracji (CIS Kubernetes Benchmark przez kube-bench, postura i RBAC przez kubescape z profilami NSA/CISA i MITRE ATT&CK) z manualnym pentestem, który zamienia surowe „failed controls" w realny scenariusz ataku. Wszystko poniżej jest zanonimizowane.

Najpierw mierzymy, co jest pootwierane

Audyt zaczynamy od twardych danych, nie od przeczuć. Dwa narzędzia, dwie perspektywy: kube-bench sprawdza klaster względem CIS Kubernetes Benchmark (konfiguracja API servera, kubeleta, etcd, polityk), a kubescape mapuje posturę na frameworki NSA/CISA Hardening Guide oraz MITRE ATT&CK for Containers, ze szczególnym naciskiem na RBAC i workloady.

posture scan — kube-bench + kubescape
# CIS Kubernetes Benchmark $ kube-bench run --targets master,node,etcd [FAIL] kontrole na poziomie API server / kubelet [WARN] polityki audytu i logowania niepełne # Postura wg NSA/CISA + MITRE (workloady, RBAC) $ kubescape scan framework nsa [FAIL] kontenery uprzywilejowane / dostęp do hosta [FAIL] brak NetworkPolicy — ruch east-west bez ograniczeń [FAIL] konta serwisowe z nadmiarowym RBAC # Skan daje LICZBY. Pentest daje ZNACZENIE tych liczb.
Skan ≠ audyt

Raport z samego skanera to lista setek „failed controls" bez priorytetów — łatwo w niej utonąć i nic nie naprawić. Wartość audytu polega na tym, że łączymy te kontrolki w łańcuchy: które trzy „średnie" znaleziska razem tworzą jedną krytyczną ścieżkę ataku. To jest różnica między raportem do szuflady a planem działania.

Wejście przez aplikację, którą i tak masz w klastrze

Pierwszy kontener rzadko zdobywa się „hakując Kubernetesa". Zdobywa się go przez aplikację, która w tym klastrze działa — podatność w usłudze webowej, wystawiony panel, niezałatana zależność. W momencie, gdy mamy wykonanie kodu wewnątrz jednego poda, zaczyna się prawdziwy audyt: co ten pod widzi i co może zrobić dalej.

foothold — rozpoznanie z wnętrza poda
# Jesteśmy w środku jednego kontenera. Co widać? $ ls /var/run/secrets/kubernetes.io/serviceaccount/ [+] token ← poświadczenia konta serwisowego poda [+] ca.crt namespace # Czy ten token może rozmawiać z API klastra? $ kubectl auth can-i --list (jako konto poda) [!] uprawnienia szersze niż potrzebuje aplikacja [!] możliwość listowania zasobów spoza namespace # Domyślnie KAŻDY pod dostaje token. Większość go nie używa # — ale napastnik w środku już tak.

Domyślnie Kubernetes montuje token konta serwisowego do każdego poda. Jeśli to konto ma szersze uprawnienia, niż aplikacja realnie potrzebuje (a w domyślnych wdrożeniach prawie zawsze ma), napastnik wewnątrz kontenera dostaje gotowe poświadczenia do rozmowy z API klastra. To jest pierwszy mnożnik zasięgu.

Trzy „średnie" ustawienia = jedna ucieczka na węzeł

Tu materializuje się sens audytu. Pojedyncze znaleziska ze skanera (kontener uprzywilejowany, brak polityk sieciowych, nadmiarowy RBAC) raportowane są często jako „medium". Ale złożone w łańcuch prowadzą do ucieczki z kontenera na węzeł — a węzeł to już nie jedna aplikacja, to wszystkie pody, które na nim działają, wraz z ich sekretami.

privilege escalation — pod → node
# Łańcuch eskalacji (zanonimizowany, bez gotowego payloadu) [1] kontener z nadmiernymi przywilejami / dostępem do hosta [2] brak NetworkPolicy → swobodny ruch do innych podów [3] nadmiarowy RBAC → odczyt Secrets z innych namespace operator ▸ wykorzystanie dostępu do warstwy węzła [CRIT] ucieczka z kontenera na węzeł (node) ▸ dostęp do wszystkich podów na tym węźle ▸ odczyt sekretów, tokenów i danych aplikacji ▸ ścieżka w stronę przejęcia płaszczyzny sterowania
⚠ Severity: Critical — kompromitacja klastra

Kontrola nad węzłem oznacza dostęp do wszystkiego, co na nim działa: cudzych podów, ich zmiennych środowiskowych, zamontowanych sekretów i tokenów. Stąd, przez wykradzione poświadczenia uprzywilejowanych kont serwisowych, prowadzi już krótka droga do płaszczyzny sterowania — czyli do kontroli nad całym klastrem.

Kubernetes domyślnie jest wygodny, nie bezpieczny.
Różnicę dokłada się świadomie — albo wcale.

Co naprawdę leży w Secrets

Finałem nie jest „mam roota w kontenerze". Finałem jest to, co dzięki temu można przeczytać. Obiekty Secret w Kubernetes są domyślnie kodowane Base64 — co wiele osób myli z szyfrowaniem. To nie jest szyfrowanie. Każdy, kto może je odczytać przez API lub z węzła, ma je w postaci jawnej.

impact — dostęp do sekretów
# Base64 ≠ szyfrowanie. Odczyt = jawny sekret. [!] poświadczenia do baz danych [!] klucze API integracji zewnętrznych [!] tokeny dostępu do rejestrów i chmury [!] certyfikaty i klucze prywatne # Jeden klaster bez izolacji Secrets = # wyciek poświadczeń do połowy infrastruktury firmy.

To moment, w którym incydent w jednym klastrze przestaje być „problemem DevOps" i staje się ryzykiem dla całej organizacji — bo sekrety z klastra otwierają drzwi do baz danych, chmury i systemów, które z Kubernetesem pozornie nie mają nic wspólnego.

Od skanu do scenariusza ataku

Dzień 1

Skan postury

kube-bench (CIS) + kubescape (NSA/CISA, MITRE). Zbieramy twarde dane o konfiguracji, RBAC i workloadach.

Dzień 1–2

Triage znalezisk

Setki „failed controls" porządkujemy w łańcuchy. Szukamy kombinacji, które razem tworzą realną ścieżkę.

Dzień 2

Przyczółek w podzie

Wejście przez aplikację działającą w klastrze. Rozpoznanie z wnętrza kontenera: token konta serwisowego, zasięg RBAC.

Dzień 2–3

Eskalacja pod → node

Łańcuch: kontener uprzywilejowany + brak polityk sieciowych + nadmiarowy RBAC. Ucieczka na węzeł.

Dzień 3

Sekrety i wpływ

Odczyt Secrets, tokenów i danych. Mapowanie realnego wpływu biznesowego poza sam klaster.

Dzień 3+

Raport + hardening

Priorytetyzowane znaleziska, dowody (PoC) i konkretny plan utwardzenia. Retest po wdrożeniu poprawek.

Co najczęściej znajdujemy w klastrach Kubernetes

Te kategorie powtarzają się w niemal każdym audycie — od małych klastrów po środowiska produkcyjne dużych firm. To jednocześnie nasza lista kontrolna i najszybsza mapa do utwardzenia Twojego klastra.

KategoriaTypowe znaleziskoSeverity
Kontenery uprzywilejowaneprivileged, hostPath, hostNetwork, hostPID — droga na węzełCritical
Nadmiarowy RBACKonta serwisowe i role z uprawnieniami znacznie szerszymi niż potrzebaHigh
Sekrety bez izolacjiSecrets jako Base64, brak szyfrowania at-rest, brak ograniczeń dostępuHigh
Brak NetworkPolicyNieograniczony ruch east-west — każdy pod gada z każdymHigh
Brak Pod Security StandardsBrak admission control wymuszającego bezpieczne ustawienia podówMedium
Niezałatane komponentyStare wersje Kubernetes, kubelet, runtime kontenerówMedium
Słaby audyt i logowanieBrak audit logów API servera, brak detekcji nietypowych zapytańLow

Cztery rzeczy do utwardzenia w pierwszej kolejności

1. Ogranicz RBAC do absolutnego minimum. Każde konto serwisowe powinno mieć dokładnie tyle uprawnień, ile potrzebuje aplikacja — i ani jednego więcej. Wyłącz automatyczne montowanie tokenów tam, gdzie nie są używane.

2. Zablokuj kontenery uprzywilejowane. Wymuszaj Pod Security Standards przez admission control. Żaden pod produkcyjny nie powinien mieć dostępu do hosta bez bardzo dobrego, udokumentowanego powodu.

3. Wprowadź NetworkPolicy. Domyślny brak izolacji sieciowej to autostrada dla ruchu bocznego. Polityka „default deny" plus jawne wyjątki zatrzymuje napastnika w pojedynczym podzie.

4. Traktuj Secrets jak sekrety. Włącz szyfrowanie at-rest, ogranicz kto może je odczytać i rozważ zewnętrzny menedżer sekretów. Base64 to nie zabezpieczenie.

◆ BSTA · testpenetracyjny.pl

Twój klaster Kubernetes działa. Ale czy jest bezpieczny?

Robimy pełne audyty bezpieczeństwa Kubernetes — przegląd konfiguracji wg CIS Benchmark i wytycznych NSA/CISA (kube-bench, kubescape) połączony z manualnym pentestem, który pokazuje realne ścieżki ataku, nie tylko listę kontrolek. Raport z priorytetami, dowodami i planem hardeningu, plus retest po poprawkach. Zakres i wycena w 2 dni robocze.

Zamów audyt Kubernetes →
BSTA · bezpieczeństwo kontenerów i klastrów · CIS · NSA/CISA · MITRE ATT&CK