3 minute read

Praca dla dużych przedsiębiorstw używających chmury wymaga sporej ilości pracy związanej z zapewnieniem wysokich standardów bezpieczeństwa usług. Zwykle w firmach zdefiniowane są restrykcyjne polityki, powiązane z typem czy klasyfikacją danych. Mamy więc do czynienia z danymi osobowymi, medycznymi, finansowymi, czy chociażby takimi, które po ujawnieniu pozbawią firmę przewagi konkurencyjnej. Nie oznacza to bynajmniej, że nie powinniśmy dbać o bezpieczeństwo w mniejszych organizacjach. Te zwykle nie mają wystarczających zasobów, czasu, lub też błędnie uważają, że ryzyko ich nie dotyczy.

Jakiś czas temu u jednego z moich klientów konfigurowaliśmy ASE (App Service Environment) i AKS (Azure Kubernetes Service) w sieci prywatnej. Kluczowe jest nie tylko zapewnienie poprawnego filtrowania ruchu na wejściu do klastra, dalej pomiędzy usługami, ale też na ruchu wychodzącym. W takiej sytuacji punktem wyjścia mogą być następujące artykuły:

Dlaczego warto filtrować ruch wychodzący?

Standardowa konfiguracja ASE i AKS nie filtruje ruchu wychodzącego. Dużo się mówi o wystawianiu portów, load balancerów oraz publikacji API na świat. Równie popularna jest tematyka mikrosegmentacji sieci i usług. O ruchu wychodzącym (egress) informacji jest znacznie mniej.

Załóżmy jednak, że z powodu niedopatrzenia, podatności czy celowego działania kod naszej usługi (hostowanej na ASE lub AKS) mając dostęp do danych wrażliwych zaczyna je transferować poza naszą infrastrukturę. Ostatecznie przecież w dużej ilości ataków na firmy chodzi o to, by coś z nich ukraść, a nie popsuć dla zabawy. W przeciwnym razie taki atak byłby po prostu nieopłacalny. Mając otwarte porty narażamy się właśnie na wycieki czy też tak zwaną eksfiltrację danych.

Problemy z NTP w ASE

Przeanalizujmy dwa przytoczone artykuły. Na pierwszy rzut oka wszystko wygląda jak należy (przyznam, że było kilka braków na liście, które musieliśmy dodać poprzez support i grupy produktowe). W artykule o ASE niestety rzuca się w oczy następująca tabela:

Endpoint Details
*:123 NTP clock check. Traffic is checked at multiple endpoints on port 123
*:12000 This port is used for some system monitoring. If blocked, then some issues will be harder to triage but your ASE will continue to operate

Tak jak port 12000 można zablokować kosztem bliżej nieokreślonych funkcji monitorowania klastra, tak port 123 musi być otwarty. To z kolei jest w pełni nieakceptowalne. Nasze dane mogą wyciekać właśnie po tym porcie do infrastruktury atakującego, bez najmniejszej weryfikacji docelowych adresów IP i FQDN.

Zaryzykowaliśmy blokadę i po paru tygodniach mieliśmy rozsynchronizowany czas na węzłach klastra, w niektórych przypadkach sięgający kilku minut. To z kolei wróciło w postaci bugów, jak chociażby:

  • “Przedłużony” czas życia tokenów JWT
  • Przedwczesne wygasanie SAS (Shared Access Signature) do Azure Storage
  • Brak synchronizacji czasu w logach i telemetrii

Z jakiegoś powodu ASE nie używa VMICTimeSync, usługi odpowiedzialnej za synchronizację czasu pomiędzy maszynami wirtualnymi i ich hostem. Jeżeli nawet wykorzystuje tryb mieszany (domyślny), to nie tłumaczy to tak dużych różnic pomimo braku dostępu do zewnętrznych usług NTP. Więcej na ten temat znajdziesz tutaj i tutaj dla Linuxów.

Częściowym rozwiązaniem problemu jest podkręcenie reguł opisanych w dokumentacji dla zabezpieczenia ASE i zamiast wypuszczania całego ruchu na porcie 123, wystarczy wypuścić ruch do serwerów NTP Windows i Ubuntu (jeśli używasz Linuxowych workerów w ASE):

ntp.ubuntu.com
    - 91.189.89.199
    - 91.189.89.198
    - 91.189.94.4
    - 91.189.91.157
# Pool Twojego regionu, w którym działa VMka: https://www.ntppool.org/zone/@
    - IP1
    - IP2
    - IP3
    - IP4
# time.windows.com
    - Bez statycznych adresów...

Problemy w AKS

Zdecydowaną gwiazdą w opisie blokowania ruchu wychodzącego jest reguła związana z ACR (Azure Container Registry). Pozostaje się tylko zastanowić czy nie dało się tego lepiej zaprojektować :)

FQDN Port Use
*.blob.core.windows.net HTTPS:443 This address is the backend store for images stored in ACR.

Obecnie nie mamy innej możliwości niż wypuścić ruch do dowolnego Storage Account w Azure! Aż trudno w to uwierzyć. Microsoft wie o tym ograniczeniu ale jak widać nie zostało to dotychczas zmienione. Tutaj przykład wesołych komentarzy…

Podsumowanie

Kontrola ruchu wychodzącego w obecnych czasach jest niezbędna. Dane mogą wyciekać na nietypowych portach jak NTP, czy nawet przez DNS. Warto w tym miejscu stosować metody, które przez wielu mogą być uznane za paranoję. Blokujemy wszystko i stopniowo budujemy swoją whitelistę.

Dobrą metodą jest cykliczne przeglądanie logów zapory z celu odnalezienia powtarzających się wzorców. Z czasem, poza oficjalną dokumentacją, znajdziemy adresy do których próbują się dostać nasze usługi. Po analizie wystarczy je odblokować i dodać na listę dozwolonych adresów czy FQDNów.

Comments