Jak zabieczyć dockery i kubernetes - garść porad

Jak zwiększyć bezpieczeństwo w infrastrukturze Kubernetes i zmniejszyć ryzyko cyberataków.

Niewielu ludzi zdaje sobie sprawę z tego że kontenery mogą generować większą ilość ryzyka niż inne maszyny wirtualne. Dzieje się tak, ponieważ obrazy kontenerów mogą być podatne na luki bezpieczeństwa, które mogą zostać wykorzystane przez przestępców w celu uzyskania dostępu do środowiska, na którym stoją same kontenery. Dodatkowo kontenery mogą w swoim środowisku posiadać różnego typu uprawnienia, które mogą pozwolić atakującemu na pełne przemieszczanie się w środowisku w którym kontenery zostały zainstalowane. Na sam koniec należy pamiętać o tym, że same obrazy kontenerów mogą zawierać poufne dane organizacji, które mogą zostać ujawnione jeśli same kontenery zostaną naruszone.

Dlatego samo wdrożenie kontenerów nie jest takie proste. Większość firm, w jakich pracowałem, poświęcało dużo swojego czasu na działania związane z bezpieczeństwem Kubernetes, ale głównie zajmowały się zabezpieczeniem kontenerów podczas fazy kompilacji, wdrażania i przygotowywania środowiska wykonawczego. Ale tak naprawdę wszystkie te wysiłki mogą być o kant tyłka rozbić, jeśli nie poświęcimy odpowiednio dużej uwagi problemom związanym z samą infrastrukturą Kubernetes, ponieważ tutaj powinniśmy upatrywać większości problemów z bezpieczeństwem kontenerów.

Przykładowe problemy z kontenerami

Aby lepiej zrozumieć problem, weźmy jako przykład poglądowy same klastry. Te elementy środowiska Kubernetes stwarzają różne elementy ryzyka, z których najważniejsze to:

  • Kubernetes wyjaśnia na swojej stronie internetowej, że jądro systemu Linux automatycznie ładuje pewne moduły jądra. A więc nieuprzywilejowane procesy mogą spowodować załadowanie takich modułów jądra, które umożliwią atakującemu wykorzystanie błędów w danym module.
  • Interfejsy API w platformach opartych o chmurę mogą zawierać dane uwierzytelniające dla danego węzła lub dane uwierzytelniające dla usługi kubelet. Napastnicy mogą spróbować nadużyć tych danych uwierzytelniających w celu zwiększania uprawnień w klastrze lub w innych usługach w chmurze.
  • Kubernetes nie nakłada praktycznie żadnych ograniczeń na węzeł, w którym można uruchomić jakiś moduł. Oczywiście można utworzyć i wykorzystywać procedury bezpieczeństwa do kontrolowania kontenerów w węzłach, ale w przypadku braku odpowiednich zasad organizacje mogą pozostać otwarte na dowolny atak.
  • Kolejny problem jest stary jak świat. To same podatności w różnych usługach. Jak zauważyła firma Sumo Logic, kwestia podatności może wpłynąć na obrazy systemów operacyjnych, które są zainstalowane w kontenerach. Przestępcy mogą potem spróbować wykorzystać te podatności, aby uzyskać dostęp do klastrów.
  • Wszystkie te podatności mogą wpłynąć także na inne elementy infrastruktury. Dla przykładu same podatności w zabezpieczeniach warstwy sieciowej środowiska opartego o kontenery mogą pozwolić na eskalację ataków pomiędzy poszczególnymi klastrami. Natomiast wszelkiego typu słabości w API i narzędziu do zarządzania Kubectl mogą pozwolić na nadużycia w danym klastrze.

Jak zabezpieczyć ich klastry i inną infrastrukturę Kubernetes

Jak sami zauważyliście, po bezpośrednim użyciu kontenerów można narazić się na wiele zagrożeń, dlatego zalecane jest, aby organizacje stosowały jak najlepsze praktyki, jeśli chodzi o bezpieczeństwo kontenerów.

Przeglądając Internet trafiłem na stronę StackRox, która zaleca organizacjom zastosowanie się do czterech rekomendacji naprawczych:

Regularnie aktualizuj swoją wersję Kubernetes

Jeśli dana organizacja regularnie aktualizuje swoje wersje Kubernetes, to może zabezpieczyć się przed najnowszymi opublikowanymi podatnościami, jakie mogą wpłynąć na dane środowisko. Dodatkowo jeśli organizacja wie o podatności, to może wdrożyć odpowiednie działania naprawcze. W szczególności biznes wraz z działem IT mogą zdecydować, czy podjąć natychmiast jakiekolwiek działania naprawcze, czy po prostu wydać łatkę zgodnie z wybranym programem zarządzania podatnościami.

Teraz jedna uwaga. Należy pamiętać o jednej bardzo ważnej rzeczy: Kubernetes obsługuje tylko trzy ostatnie wersje swojego oprogramowania, co oznacza, że tylko te wersje będą otrzymywać odpowiednie patche bezpieczeństwa, a więc jeśli organizacja korzysta ze starszej wersji oprogramowania, to jest duża szansa, że pozostanie otwarta na atak.

Skonfiguruj poprawnie swój serwer API

Jeśli serwer API nie jest poprawnie skonfigurowany, to organizacje mogą umożliwić złośliwym podmiotom uzyskanie anonimowego dostępu do swojego środowiska kontenerów. Jeśli przestępcy uda się uzyskać dostęp do API, to może on bez większych problemów poruszać się po całym środowisku, co może skutkować zniszczeniem aplikacji lub ujawnieniem poufnych danych organizacji.

Aby temu zapobiec organizacje powinny się upewnić, że wyłączyły anonimowy dostęp do swojego serwera API. Dodatkowo można się upewnić, czy rzeczywiście stosuje się szyfrowanie TLS do połączeń pomiędzy poszczególnymi kontenerami a interfejsem API.

Zabezpieczenie usług etcd

Jak wspomina dokumentacja Kubernetes, etcd to magazyn wartości kluczowych, który działa tak naprawdę jako magazyn kopii zapasowych oprogramowania dla danych w klastrze. Uzyskanie dostępu do etcd jest równoznaczne do uzyskania uprawnień roota w klastrze. Tak naprawdę etcd powinno być dostępne tylko przez interfejs API.

Dlatego koniecznym posunięciem może być zabezpieczenie etcd za pomocą uwierzytelniania TLS, aby ograniczyć dostęp do węzłów. Poza tym organizacje powinny wykorzystywać funkcje zapory sieciowej i funkcje bezpieczeństwa dostarczane przez etcs, aby dodatkowo zabezpieczyć ten komponent. Na przykład można wygenerować bezpieczne kanały komunikacji z wykorzystaniem infrastruktury klucza publicznego.

Koniecznie należy zabezpieczyć kubelet

Kubelety służą głównie jako agenci węzłów, którzy działają na każdym węźle. W związku z tym jakakolwiek błędna konfiguracja kubelet może spowodować nieautoryzowany dostęp przez backdoora opartego o kubelet.

Jeśli już o tym wemy, powinniśmy kontrolować dostęp do kubeleta. Można to zrobić włączając autoryzację i uwierzytelnianie. Dodatkowo można także użyć kontrolera dostępu, jakim jest NodeRestriction, aby ograniczyć ilość zasobów, do których kubelet ma dostęp.