13 najlepszych praktyk w zakresie zabezpieczania mikrousług

Architektura oparta na mikrousługach oferuje dużą elastyczność, skalowalność i umożliwia modyfikację, dodawanie oraz usuwanie poszczególnych elementów oprogramowania bez zakłócania pracy innych części systemu.

Poza skróceniem cykli rozwoju oprogramowania, umożliwieniem pracy w mniejszych zespołach oraz zapewnieniem elastyczności w wyborze języków programowania, mikrousługi pozwalają na skalowanie wybranych funkcji lub usług, a także rozwiązywanie problemów z nimi bez konieczności ingerowania w inne komponenty.

Główną zaletą mikrousług jest możliwość podzielenia rozbudowanych aplikacji monolitycznych na szereg niezależnie wdrażanych, mniejszych usług. Wzrost liczby tych niezależnych komponentów niesie jednak za sobą wzrost złożoności systemu i trudności w zapewnieniu jego bezpieczeństwa.

Ilustracja różnic między architekturą monolityczną a mikrousługami: Red Hat

Typowe wdrożenie mikrousług obejmuje warstwy takie jak: sprzęt, usługi/aplikacje, komunikacja, chmura, wirtualizacja i orkiestracja. Każda z tych warstw posiada specyficzne wymagania, mechanizmy kontroli oraz wyzwania związane z bezpieczeństwem.

Wyzwania związane z bezpieczeństwem mikrousług

Systemy oparte na mikrousługach charakteryzują się rozproszeniem, złożonymi zasadami dostępu, dużym ruchem danych wymagającym monitorowania i rozległą powierzchnią potencjalnych ataków. Co więcej, znaczna część wdrożeń mikrousług ma miejsce w środowiskach chmurowych, które same w sobie posiadają zróżnicowane konfiguracje zabezpieczeń.

Z uwagi na dużą liczbę udostępnianych interfejsów API, portów oraz komponentów, tradycyjne zapory sieciowe mogą okazać się niewystarczające do zapewnienia odpowiedniego poziomu ochrony. Te czynniki sprawiają, że wdrożenia mikrousług są bardziej podatne na różnego rodzaju cyberzagrożenia, takie jak ataki typu man-in-the-middle, iniekcje, skrypty krzyżowe (XSS), ataki DDoS i inne.

Bezpieczeństwo sieci jest kolejnym wyzwaniem w kontekście mikrousług. W szczególności kontrola tożsamości i dostępu nabiera nowego poziomu skomplikowania. Do innych problemów należą niezabezpieczony kod i słabe punkty w systemach wykrywania usług.

Choć zabezpieczenie mikrousług jest bardziej złożone niż w przypadku aplikacji monolitycznych, można skutecznie chronić je poprzez opracowanie przemyślanej strategii i stosowanie się do najlepszych praktyk.

Idealna architektura wymaga podejścia rozproszonego, które obejmuje wszystkie różne komponenty systemu.

Typowe obszary, które wymagają szczególnej uwagi to:

  • Ochrona aplikacji, mikrousług i użytkowników
  • Zabezpieczenie zarządzania tożsamością i dostępem
  • Ochrona danych
  • Wzmocnienie bezpieczeństwa komunikacji między usługami
  • Monitorowanie mikrousług i systemów bezpieczeństwa

Najlepsze praktyki zabezpieczania mikrousług

Skuteczną strategią jest zastosowanie kombinacji najlepszych praktyk, narzędzi i mechanizmów kontroli w celu ochrony całego ekosystemu mikrousług. Konkretne podejście może różnić się w zależności od rodzaju usług, aplikacji, użytkowników, czynników środowiskowych i innych elementów.

Decydując się na implementację mikrousług, należy upewnić się, że wszystkie wymagania dotyczące bezpieczeństwa usług, połączeń i danych są spełnione.

Przyjrzyjmy się teraz kilku skutecznym praktykom bezpieczeństwa w kontekście mikrousług.

#1. Bezpieczeństwo od podstaw

Uczyń bezpieczeństwo integralną częścią cyklu rozwoju oprogramowania. Najlepiej włączyć elementy zabezpieczeń już na etapie projektowania i wdrażania mikrousług. Takie podejście jest łatwiejsze, efektywniejsze i tańsze niż dodawanie zabezpieczeń na późniejszych etapach procesu tworzenia oprogramowania.

#2. Mechanizm obrony warstwowej

Obrona warstwowa (ang. Defense in Depth – DiP) to technika, w której stosuje się wiele warstw zabezpieczeń chroniących usługi i dane. Takie podejście znacząco utrudnia atakującym przeniknięcie przez wiele poziomów ochrony, zapewniając tym samym wysoki poziom bezpieczeństwa usług i przechowywanych danych.

W przeciwieństwie do rozwiązań ochrony obwodowej, takich jak zapory ogniowe, koncepcja obrony warstwowej opiera się na kombinacji różnorodnych narzędzi. Wykorzystuje się na przykład programy antywirusowe, zapory ogniowe, systemy zarządzania poprawkami, oprogramowanie antyspamowe i inne, aby zapewnić wielopoziomową ochronę w całym systemie.

Zaawansowana, wielowarstwowa ochrona Źródło: Imperva

W praktyce należy najpierw zidentyfikować najbardziej wrażliwe usługi, a następnie zastosować wokół nich odpowiednie warstwy zabezpieczeń.

#3. Zabezpieczenia na poziomie kontenera

Mikrousługi bardzo często opierają się na technologii konteneryzacji. Dlatego też zabezpieczenie kontenerów, zarówno wewnętrzne, jak i zewnętrzne, jest kluczowe dla zmniejszenia powierzchni ataku i ryzyka. Dążenie do zasady minimalnych uprawnień jest dobrą praktyką, która wymaga zastosowania kombinacji różnych strategii, w tym m.in.:

  • Ograniczenie uprawnień do absolutnego minimum.
  • Unikanie uruchamiania usług lub innych procesów z wykorzystaniem sudo lub kont z uprawnieniami administratora.
  • Ograniczanie lub kontrolowanie dostępu i wykorzystania dostępnych zasobów. Na przykład ograniczenie dostępu kontenerów do zasobów systemu operacyjnego pomaga zapobiec kradzieży lub naruszeniu bezpieczeństwa danych.
  • Nieprzechowywanie tajnych danych na dysku kontenera.
  • Używanie odpowiednich reguł do izolowania dostępu do zasobów.

Konieczne jest również, aby obrazy kontenerów były wolne od wszelkich luk i problemów z bezpieczeństwem. Regularne skanowanie kontenerów pod kątem zagrożeń i podatności pomaga w identyfikacji potencjalnych problemów.

Typowe narzędzia do skanowania obrazów to Clair, Anchore oraz inne.

#4. Uwierzytelnianie wieloskładnikowe

Włączenie uwierzytelniania wieloskładnikowego (MFA) znacząco zwiększa bezpieczeństwo dostępu do interfejsów użytkownika.

Użytkownicy uzyskujący dostęp będą musieli podać swoją nazwę użytkownika i hasło, a dodatkowo inną formę weryfikacji, taką jak kod wysłany na ich telefon lub na określony adres e-mail. Technika ta utrudnia atakującym, którzy mogą wykorzystać skradzione lub przejęte dane uwierzytelniające, dostęp do mikrousług, ponieważ nie będą oni w stanie przejść przez dodatkowy etap uwierzytelnienia.

#5. Tokeny tożsamości użytkownika i dostępu

Przy wdrażaniu mikrousług wiele aplikacji i usług będzie wymagać bezpiecznej autoryzacji i kontroli dostępu. Struktury autoryzacji, takie jak OAuth 2.0 i OpenID, umożliwiają bezpieczne zarządzanie tokenami, a co za tym idzie ochronę mikrousług. W rezultacie umożliwiają one aplikacjom stron trzecich bezpieczny dostęp do innych usług lub danych użytkowników.

W typowym wdrożeniu, główna aplikacja poprosi użytkownika o autoryzację usługi innej firmy. Po zaakceptowaniu tego żądania, aplikacja generuje token dostępu dla danej sesji.

W szczególności OAuth jest jedną z najefektywniejszych strategii kontroli tożsamości użytkownika i dostępu. Chociaż istnieje kilka innych protokołów autoryzacji, a także można tworzyć własne, najlepszą praktyką jest korzystanie z OAuth, ponieważ jest to standard stabilny i powszechnie akceptowany.

#6. Brama API

Mikrousługi często składają się z wielu komponentów rozproszonych w różnych sieciach i dostępnych z szerokiej gamy systemów i klientów. Bezpośrednie udostępnianie mikrousług zwiększa ryzyko wystąpienia luk w zabezpieczeniach. Jednym ze sposobów na ich ochronę jest stworzenie pojedynczego i bezpiecznego punktu wejścia, który pomaga scentralizować cały dostęp z zewnętrznych systemów i klientów.

W tym celu wdraża się bramę API, aby analizować wszystkie przychodzące żądania pod kątem problemów z bezpieczeństwem, zanim zostaną one przekierowane do odpowiednich mikrousług. Brama API znajduje się pomiędzy aplikacjami klienckimi a mikrousługami. Ogranicza ona ujawnianie mikrousług, zapewniając jednocześnie dodatkowe funkcje zarządzania żądaniami, takie jak uwierzytelnianie, zakończenie SSL, translacja protokołów, monitorowanie, kierowanie żądań, buforowanie i inne.

Dzięki takiemu podejściu, brama API kieruje cały ruch zewnętrzny do mikrousług, realizując jednocześnie zasadę obrony warstwowej.

Schemat bramy API w architekturze mikrousług Źródło: Manning Livebook

Popularne bramy API to między innymi NGINX, Kong, Tyk, Ambassador, AWS API Gateway i inne.

Aby dowiedzieć się więcej o bezpieczeństwie API, zapoznaj się z naszym przewodnikiem „Dlaczego i jak zabezpieczyć punkt końcowy API”.

#7. Profilowanie API oparte na strefie wdrożenia

Wdrażaj ograniczenia dostępu oparte na rolach, zapewniając użytkownikom dostęp tylko do tych interfejsów API i usług, których rzeczywiście potrzebują. Większość złośliwego oprogramowania często rozprzestrzenia się do większej liczby usług. Ograniczenie dostępu tylko do autoryzowanych użytkowników zmniejsza ryzyko związane z takim zagrożeniem. Jedną z technik zmniejszania ekspozycji na zagrożenia jest oznaczanie interfejsów API na podstawie użytkowników, którzy powinni mieć do nich dostęp. Zasadniczo interfejsy API można podzielić na:

  • Interfejsy API sieci Ethernet – dla usług udostępnianych światu zewnętrznemu spoza centrum danych.
  • Interfejsy API strefy korporacyjnej – przeznaczone do wewnętrznego, prywatnego ruchu sieciowego.
  • Interfejsy API DMZ – do obsługi ruchu pochodzącego z Internetu.
  • Interfejsy API strefy hybrydowej – do wdrożeń w centrach danych.

#8. Zabezpieczenie komunikacji między usługami

Dobre praktyki obejmują uwierzytelnianie i autoryzację żądań w komunikacji między dwoma mikrousługami.

Zasadniczo istnieją trzy główne techniki, które można wykorzystać do zabezpieczenia komunikacji między usługami. Są to: zaufanie sieci, JSON Web Token (JWT) i Mutual Transport Layer Security (mTLS lub Mutual TLS).

Zabezpieczanie komunikacji między usługami za pomocą JWT Źródło: Manning Livebook

Spośród tych trzech metod, mTLS jest najbardziej popularny. W tym podejściu każda mikrousługa musi posiadać parę kluczy (publiczny i prywatny). Następnie mikrousługa klienta używa tej pary kluczy, aby uwierzytelnić się w mikrousłudze odbierającej za pomocą protokołu mTLS.

Podczas uwierzytelniania każda mikrousługa generuje certyfikat. Następnie każda mikrousługa użyje certyfikatu innej usługi, aby przeprowadzić uwierzytelnienie.

Chociaż protokół TLS zapewnia integralność i poufność przesyłanych danych, pozwala również klientowi na identyfikację mikrousługi. Mikrousługa klienta zazwyczaj zna inną mikrousługę. Ponieważ jednak protokół TLS jest jednokierunkowy, mikrousługa odbierająca nie może zweryfikować mikrousługi klienta, a potencjalni atakujący mogą to wykorzystać. Z drugiej strony mTLS zapewnia mechanizmy, w których każda z mikrousług może zweryfikować tożsamość drugiej.

#9. Ograniczenie szybkości (Rate Limiting) ruchu klientów

Ograniczenie ruchu zewnętrznego zapobiega problemom, takim jak ataki typu „odmowa usługi” (DoS), a także sytuacjom, w których niektórzy klienci wykorzystują większość dostępnej przepustowości aplikacji. Jednym ze sposobów jest zastosowanie różnych reguł, które mogą monitorować i kontrolować szybkość ruchu wysyłanego lub odbieranego od klienta na podstawie jego adresu IP, czasu i innych parametrów.

Skonfiguruj swoje usługi tak, aby zwalniały swoje działanie, jeśli wykryją kilka nieudanych prób logowania do interfejsów API lub jakąkolwiek inną podejrzaną aktywność.

Spowolnienie działania systemu zniechęca potencjalnych napastników i prawdopodobnie skłoni ich do rezygnacji z dalszych prób uzyskania dostępu do usług. Ograniczenie szybkości można zaimplementować przy użyciu bramy API, odpowiedniego kodu lub innej techniki. Większość środowisk SaaS posiada mechanizmy ograniczeń szybkości API, aby minimalizować nadużycia ze strony użytkowników oraz ataki.

#10. Menedżery orkiestracji

Menedżery orkiestracji pozwalają na automatyzację konfiguracji, koordynacji i innych zadań związanych z zarządzaniem mikrousługami, a także zwiększają bezpieczeństwo systemu. Zazwyczaj narzędzia te umożliwiają zarządzanie wieloma kontenerami, ograniczanie dostępu do metadanych, segregację obciążeń, zbieranie logów i wiele innych.

Niektóre narzędzia do orkiestracji posiadają dodatkowe funkcje, które pozwalają programistom przechowywać i bezpiecznie udostępniać poufne informacje, takie jak certyfikaty SSL, klucze szyfrowania, hasła i tokeny tożsamości.

Dwie powszechnie stosowane metody efektywnej orkiestracji mikrousług to:

  • Kodowanie orkiestracji jako mikrousługi.
  • Wykorzystanie bram API w celu stworzenia warstwy orkiestracji.

Orkiestracja za pośrednictwem bramy API nie jest zalecana ze względu na wyzwania związane ze skalowaniem usług.

Warstwa orkiestracji mikrousług Źródło: Globallogic

Typowe narzędzia do zarządzania orkiestracją to Kubernetes, Istio, Azure Kubernetes Service (AKS) i inne.

Aby dowiedzieć się więcej, zapoznaj się z zagadnieniem orkiestracji kontenerów w kontekście DeOps.

#11. Monitorowanie wszystkich systemów i usług

Mikrousługi opierają się na systemach rozproszonych, dlatego też niezbędna jest skuteczna strategia monitorowania wszystkich poszczególnych komponentów.

Wdrożenie ciągłego monitoringu umożliwia wykrywanie zagrożeń bezpieczeństwa i odpowiednio szybką na nie reakcję. Istnieje wiele rozwiązań do monitorowania mikrousług, w tym Prometheus, Statsd, InfluxDB, Logstash i inne.

Monitorowanie wewnątrz architektury mikrousług

Wykorzystuj odpowiednie narzędzia do monitorowania wewnętrznych systemów i usług. Niektóre z najlepszych praktyk w tym zakresie to:

  • Włączenie logowania na poziomie aplikacji. Można wykorzystać Splunk, Grafana, stack ELK lub inne narzędzia, które gromadzą logi na poziomie aplikacji, kontenera, sieci i infrastruktury.
  • Monitorowanie metryk wykorzystania zasobów.
  • Analiza trendów metryk, takich jak obciążenie procesora, pamięci, czasy odpowiedzi, błędy, powiadomienia i inne, w celu wykrywania nietypowych aktywności, które mogą wskazywać na trwający lub potencjalny atak.
  • Audyt logów w obszarach takich jak przychodzące żądania klientów, rekordy baz danych, kontenery i inne, w celu zidentyfikowania niespójności lub nietypowych zdarzeń.

#12. Automatyzacja działań związanych z bezpieczeństwem

Automatyzuj procesy związane z bezpieczeństwem, takie jak wdrażanie aktualizacji, skanowanie luk w zabezpieczeniach, monitorowanie, egzekwowanie zasad i inne działania. Dodatkowo należy dokładnie sprawdzać aktualizacje, aby mieć pewność, że są one bezpieczne i nie wprowadzają nowych luk w systemie.

Po aktualizacji, oprogramowanie zabezpieczające powinno w idealnym przypadku przeprowadzić testy na wszystkich kontenerach i mikrousługach, aby upewnić się, że nie pojawiły się żadne nowe luki lub problemy z bezpieczeństwem.

#13. Ochrona danych przez cały czas

Zabezpieczaj dane podczas przesyłania i przechowywania. Najlepiej wymusić stosowanie protokołu HTTPS dla całej komunikacji, aby chronić przesyłane dane i szyfrować wszystkie poufne dane w stanie spoczynku. Unikaj przesyłania i przechowywania haseł, kluczy, danych uwierzytelniających i innych poufnych informacji poza kodem aplikacji.

Najlepszą strategią jest wykorzystanie standardowych technologii do szyfrowania wszystkich wrażliwych danych jak najwcześniej. Ponadto, odszyfrowuj dane tak późno, jak to możliwe, aby zmniejszyć potencjalne ryzyko.

Podsumowanie

Mikrousługi opierają się na rozproszonych komponentach, aby osiągnąć korzyści, takie jak większa elastyczność i różnorodność opcji wdrożenia. Jednak decydując się na korzystanie z mikrousług, organizacje muszą dostosować swoje wewnętrzne zasady i strategie bezpieczeństwa w kierunku podejścia bardziej natywnego dla chmury i rozproszonego środowiska.

Najlepiej dążyć do zmniejszenia powierzchni ataku, ochrony środowiska mikrousług, interfejsów API, aplikacji i danych.


newsblog.pl