9 najlepszych praktyk dotyczących bezpieczeństwa kontenerów w DevOps

Photo of author

By maciekx

Bezpieczeństwo kontenerów w DevOps: kompleksowy przewodnik

Kontenery w środowisku DevOps to koncepcja, która istnieje już od pewnego czasu. Są one niczym wirtualne piaskownice, w których gromadzi się wszystkie potrzebne elementy do uruchomienia mikroserwisów, w tym rozbudowanych aplikacji.

Można o nich myśleć jako o systemach pakowania, umożliwiających programistom przechowywanie wszystkich komponentów niezbędnych do uruchomienia aplikacji – od środowisk wykonawczych po binaria – w jednym, centralnym punkcie.

Kontenery ułatwiają programistom przenoszenie aplikacji między różnymi środowiskami (np. z lokalnej maszyny do środowiska w chmurze lub z fazy testowej do produkcyjnej). Eliminuje to problemy wynikające z rozbieżności w konfiguracji oprogramowania pomiędzy różnymi środowiskami.

Według raportu Statista dotyczącego technologii kontenerowych, 50% firm na świecie wdrożyło orkiestrację kontenerów. Pomimo popularności wynikającej z wielu zalet, kontenery, jeśli nie są odpowiednio zabezpieczone, mogą stać się furtką dla cyberataków.

CVE Details, będące obszernym zbiorem danych o lukach w zabezpieczeniach, wymienia 62 podatności związane z Dockerem. Czyż nie jest to wystarczający powód, aby wdrożyć najlepsze praktyki programistyczne w celu zabezpieczenia kontenerów dla płynnych procesów DevOps?

W tym artykule omówimy koncepcję bezpieczeństwa kontenerów, wskażemy potencjalne wyzwania oraz zaprezentujemy rekomendowane działania podczas korzystania z tej technologii.

Czym jest bezpieczeństwo kontenerów?

Bezpieczeństwo kontenerów to nieustanny proces wdrażania protokołów bezpieczeństwa – narzędzi i zasad – w celu ochrony kontenerów i ich środowisk przed potencjalnymi zagrożeniami.

Niezaadresowane zagrożenia mogą negatywnie wpłynąć na aplikację, jej infrastrukturę, czas pracy, biblioteki systemowe, system operacyjny i jądro, a także inne funkcje.

Biorąc pod uwagę, że kontenery mają charakter przejściowy i są projektowane z myślą o dynamicznym wdrażaniu i skalowaniu, konieczne jest zautomatyzowane zabezpieczanie na każdym etapie cyklu życia oprogramowania (SDLC).

Przeczytaj również: Wprowadzenie do Kubernetes Kops dla początkujących

Jakie wyzwania niesie bezpieczeństwo kontenerów?

Mimo licznych zalet (np. przyspieszenie dostarczania oprogramowania), kontenery nie są wolne od wyzwań, głównie z powodu braku wbudowanych mechanizmów bezpieczeństwa.

Kontenery uzyskują dostęp do sprzętu za pośrednictwem systemu operacyjnego hosta. Oznacza to, że jeden kontener może korzystać z wielu obrazów bazowych, co zwiększa potencjalną powierzchnię ataku.

Pierwszym problemem jest nieprawidłowa konfiguracja kontenera. Programiści mogą zapomnieć o dostosowaniu domyślnych ustawień, które zawierają pewne pułapki, takie jak odsłonięte, niezabezpieczone porty, które mogą nie być odpowiednie dla danej aplikacji, ujawnione dane uwierzytelniające (hasła, tokeny) oraz nadmierne uprawnienia przyznawane środowisku uruchomieniowemu kontenera (gdy działa jako root). Takie domyślne konfiguracje stwarzają potencjalne możliwości ataku.

Kolejnym wyzwaniem są luki w zabezpieczeniach infrastruktury kontenerowej. Pakiety wbudowane w kontener – kod aplikacji, biblioteki, konfiguracje – lub te w systemie operacyjnym hosta, wprowadzają podatności. Podatności mogą pojawić się na każdym etapie cyklu życia aplikacji, np. podczas włączania zależności zewnętrznych do obrazu kontenera, instalacji bibliotek open source, pobierania obrazów bazowych z zewnętrznych rejestrów, czy wykorzystania hostów poprzez sieć.

Wgląd w obciążenia kontenerów to kolejne poważne wyzwanie. Dynamiczna natura kontenerów utrudnia narzędziom monitorowania lokalizowanie aktywnych kontenerów i analizę ich zachowania w sieci. Lepsza widoczność pozwala uniknąć naruszeń i skrócić czas reakcji w przypadku incydentów.

Ponadto, kontener staje się podatny na ataki, gdy jakakolwiek faza potoku CI/CD jest niezabezpieczona, zarówno w kodzie aplikacji, jak i w infrastrukturze. Podczas gdy programiści często zajmują się bezpieczeństwem na końcu cyklu życia aplikacji, proaktywne administrowanie na każdym etapie chroni aplikacje przed takimi zagrożeniami.

Jakie narzędzia pomagają w zabezpieczaniu kontenerów?

Bezpieczeństwo wdrożonych rozwiązań korporacyjnych można poprawić poprzez wprowadzenie zabezpieczeń i kontroli integralności kontenerów za pomocą specjalistycznych narzędzi. Skanują one pod kątem luk i na bieżąco monitorują aktywność w poszukiwaniu ataków, błędów lub innych problemów.

Niezależnie od tego, czy szukamy narzędzi open source, czy komercyjnych, ich cel jest ten sam – audyt infrastruktury kontenerowej i przeciwdziałanie typowym lukom w zabezpieczeniach i zagrożeniom (CVE).

Oto kilka narzędzi, które warto rozważyć: Pingsafe Editors Choice, Datadog Cloud SIEM, Anchore, Sophos Cloud-Native Security, Bitdefender GravityZone, Sysdig Secure, Aqua Security oraz RedHat Advanced Cluster Security for Kubernetes.

Przeczytaj również: 11 skanerów bezpieczeństwa kontenerów do znajdowania luk w zabezpieczeniach

Najlepsze praktyki w zakresie bezpieczeństwa kontenerów

Pomimo wspomnianych wyzwań, przedstawiamy zbiór najlepszych praktyk, które można wdrożyć, aby zoptymalizować bezpieczeństwo kontenerów na każdym etapie cyklu życia aplikacji.

Zabezpieczanie obrazów

Obrazy kontenerów są wykorzystywane do tworzenia kontenerów. Najmniejsza błędna konfiguracja lub złośliwe działanie może wywołać luki w wyprodukowanych kontenerach. Można temu przeciwdziałać poprzez:

  • Używanie zaufanych obrazów – jeśli nie tworzysz obrazów od podstaw, zawsze wybieraj obrazy z zaufanych źródeł. Publiczne repozytoria, takie jak Docker Hub, zawierają obrazy, w tym te ze złośliwym oprogramowaniem i błędną konfiguracją.
  • Zawieranie tylko niezbędnych komponentów – jeśli istnieją komponenty, których Twoja aplikacja nie potrzebuje, najlepiej je usunąć. Na przykład system UNIX zawiera pliki binarne „awk” i „sed”.
  • Dołączanie aplikacji do obrazu kontenera – obraz kontenera zawiera podzbiór systemu operacyjnego i uruchomioną aplikację. Każde narzędzie i biblioteka wciągnięte do kontenera stanowi potencjalne zagrożenie. Najlepiej dołączyć aplikację do obrazu kontenera, korzystając ze statycznie skompilowanego pliku binarnego ze wszystkimi wymaganymi zależnościami.

Automatyzacja skanowania i zarządzania lukami w zabezpieczeniach

Regularne skanowanie i zarządzanie kontenerami i hostami pomaga wykryć luki w zabezpieczeniach na każdym etapie cyklu życia aplikacji.

Warto przeprowadzać skanowanie kodu w celu wykrywania błędów oraz statyczne testy bezpieczeństwa aplikacji (SAST) w celu znalezienia luk w kodzie. Analiza składu oprogramowania (SCA) dostarcza wglądu w komponenty open source, tworząc zestawienie materiałów, które można porównać z udokumentowanymi lukami w zabezpieczeniach.

Ponadto, skanowanie obrazu analizuje zawartość i proces tworzenia pod kątem podatności. Z narzędziami takimi jak Clair, można wyszukiwać znane luki w zabezpieczeniach. Alternatywnie, dynamiczne testy bezpieczeństwa aplikacji (DAST) wskazują zagrożenia na podstawie zachowania kontenera. Narzędzia DAST mogą również skanować hosty kontenerów, weryfikując konfigurację jądra i systemu operacyjnego.

Choć powyższe działania są częścią ciągłego procesu cyklu życia kontenera, warto przyjąć filozofię „shift-left”, czyli wdrożenie zabezpieczeń już na wczesnym etapie rozwoju. Dobrym narzędziem w tym podejściu jest Trivy.

Zabezpieczanie rejestrów kontenerów

Rejestry kontenerów to efektywny sposób na centralne przechowywanie i dystrybucję obrazów. Organizacje często przechowują tysiące obrazów w rejestrach publicznych lub prywatnych. Istnieje kilka sposobów, aby zapewnić, że wszyscy członkowie zespołu korzystają z obrazów wolnych od luk.

Po pierwsze, wdrożenie kontroli dostępu użytkownika (dla rejestrów prywatnych) określa, kto może publikować i uzyskiwać dostęp do obrazów. To podstawowe zabezpieczenie uniemożliwia nieautoryzowanym osobom publikowanie, modyfikowanie lub usuwanie obrazów.

Kolejnym środkiem jest podpisywanie obrazów, które łączy obraz z osobą, która go podpisała, utrudniając podmienienie obrazu na skompromitowany. Można użyć Docker Content Trust do dodawania podpisów cyfrowych. Na koniec, ciągłe skanowanie obrazów pomaga w wykrywaniu krytycznych luk w zabezpieczeniach.

Monitorowanie kontenerów

Wgląd w obciążenia kontenerów można zoptymalizować za pomocą narzędzi do monitoringu, które powinny umożliwiać testowanie luk we wszystkich komponentach i rejestrowanie zdarzeń w środowiskach kontenerowych w czasie rzeczywistym.

Narzędzia monitorujące wykrywają zagrożenia poprzez analizę metryk i dzienników ze wszystkich składników stosu kontenerów, identyfikując nieprawidłowości. Dzięki temu można natychmiast korygować błędne konfiguracje.

Do zbierania metryk użycia zasobów warto użyć cAdvisor lub kube-state-metrics. Do monitorowania aktywności i wydajności klastrów warto wykorzystać Grafana lub Prometheus.

Analizę ruchu sieciowego pomiędzy kontenerami ułatwią Wireshark lub tcpdump. Jeśli korzystasz z zarządzanej usługi Kubernetes, takiej jak (AKS), użyj Azure Monitor do śledzenia zasobów i zagrożeń bezpieczeństwa.

Usługa Azure Log Analytics może również zbierać i analizować zasoby AKS. W przypadku Amazon EKS, dobrym rozwiązaniem do logowania i monitoringu będzie Amazon CloudTrail i Amazon Cloud Watch.

Wdrażanie bezpieczeństwa sieci

Środki kontroli bezpieczeństwa sieci pomagają chronić przed nieautoryzowanym dostępem do kontenerów. Kluczowym elementem jest segmentacja sieci, która izoluje kontenery, ograniczając im dostęp tylko do niezbędnych usług.

W przypadku aplikacji kontenerowych na Kubernetes, można użyć zasad sieciowych K8s do konfiguracji ruchu przychodzącego i wychodzącego w klastrach, ograniczając ruch do określonych podów na podstawie etykiet.

Zabezpieczenia warstwy transportowej (TLS) można rozszerzyć na komunikację między podami. Można użyć TLS lub Secure Sockets Layer (SSL) do bezpiecznej komunikacji między serwerem API a innymi komponentami. Moduły równoważenia obciążenia są przydatne, gdy chcemy kontrolować ruch wprowadzany do klastrów.

W przypadku mikrousług, bezpieczny ruch można zapewnić za pomocą narzędzi Service Mesh, takich jak Meshery lub Linkerd. Na koniec, należy zabezpieczyć sieć, jeśli wykorzystujemy narzędzia chmurowe do hostowania klastrów.

Jeśli korzystasz z Azure Kubernetes Service (AKS), użyj sieciowych grup zabezpieczeń (NSG) do zarządzania ruchem. W przypadku Amazon Elastic Kubernetes Service (EKS) najlepszym rozwiązaniem będą grupy zabezpieczeń Virtual Private Cloud (VPC) Amazon.

Zmniejszanie powierzchni ataku

Minimalizowanie powierzchni ataku przynosi dwie korzyści – zwiększenie szybkości obsługi i zmniejszenie możliwości naruszeń bezpieczeństwa.

Wieloetapowa kompilacja pozwala tworzyć lekkie obrazy o małej powierzchni ataku oraz lepszym czasie uruchamiania i wydajności. Istnieje kilka rozwiązań w tym zakresie. W Linuksie można użyć Alpine Linux, BusyBox lub Tiny Core Linux.

W przypadku Ubuntu, istnieje Ubuntu Minimal. Można również użyć Scratch, specjalnego obrazu Dockera – kontenera „startowego” – do tworzenia minimalistycznych obrazów od podstaw.

Ograniczanie uprawnień kontenera

Zasada polega na przyznawaniu minimalnych uprawnień niezbędnych do wykonania zadania. Kontenery uruchamiane jako root uzyskują dostęp do różnych operacji, takich jak instalowanie pakietów czy uprawnienia odczytu i zapisu w systemie operacyjnym.

Ryzyko polega na tym, że atakujący mogą wykorzystać eskalację uprawnień, jeśli kontener zostanie naruszony. Rozwiązaniem jest uruchamianie kontenerów w trybie bez rootowania lub ograniczenie możliwości jądra LINUX tylko do tych, które są potrzebne do obsługi kontenera.

Bezpieczne zarządzanie poufnymi informacjami

Pliki konfiguracyjne kontenera i Dockerfile powinny być wolne od poufnych informacji (sekretów), takich jak certyfikaty, hasła, klucze API i tokeny. Pomimo, że jest to podstawowa zasada, często spotyka się je zaszyte w procesie kompilacji lub w obrazach kodu źródłowego.

W takich przypadkach wrażliwe dane trafiają do kontenerów i są buforowane w pośrednich warstwach, nawet po usunięciu kontenerów. Najlepszym rozwiązaniem jest wdrożenie rozwiązania do zarządzania sekretami, np. AWS Secrets Manager i Vault, do bezpiecznego przechowywania i zarządzania poufnymi danymi.

Wzmacnianie zespołu

Edukacja zespołu w zakresie najlepszych praktyk bezpieczeństwa jest kluczowa. Wszyscy członkowie zespołu powinni umieć rozpoznawać i reagować na zagrożenia bezpieczeństwa.

Dobrym sposobem na wdrożenie tego jest włączenie bezpieczeństwa kontenerów do procesów wdrażania zespołu. Oferowanie szkoleń, ciągłego uczenia się i regularnych ocen bezpieczeństwa wyróżnia Twój zespół DevOps, wyposażając go w wiedzę o aktualnych trendach w zakresie bezpieczeństwa.

Podsumowanie

Bezpieczeństwo kontenerów jest kluczowym elementem ciągłego cyklu życia oprogramowania. Najlepsze podejście to włączenie zabezpieczeń bezpośrednio w kod aplikacji, środowisko uruchomieniowe kontenera, system operacyjny hosta i infrastrukturę sieciową.

Można to osiągnąć, przestrzegając strategii weryfikacji kontenerów i korzystania tylko z zaufanych źródeł. Hartowanie kontenerów zapewnia, że zawierają tylko niezbędne usługi. Rejestrowanie można wdrożyć łatwo za pomocą narzędzi monitorujących. Segmentacja sieci oddziela kontenery od całej infrastruktury.

Obrazy należy podpisywać, aby weryfikować dane wejściowe i wyjściowe. Regularne skanowanie i testy penetracyjne wykrywają luki w zabezpieczeniach, umożliwiając natychmiastowe działania naprawcze. Ponieważ technologia się rozwija, należy być na bieżąco z najnowszymi praktykami bezpieczeństwa.

Sprawdź, jak zautomatyzować zabezpieczenia.


newsblog.pl