Udostępnij za pośrednictwem


Integralność kodu platformy

Istotnym wyzwaniem w obsłudze złożonego systemu, takiego jak Platforma Microsoft Azure, jest zapewnienie, że w systemie działa tylko autoryzowane oprogramowanie. Nieautoryzowane oprogramowanie stwarza kilka zagrożeń dla dowolnej firmy:

  • Zagrożenia bezpieczeństwa, takie jak dedykowane narzędzia do ataków, niestandardowe złośliwe oprogramowanie i oprogramowanie innych firm ze znanymi lukami w zabezpieczeniach
  • Zagrożenia zgodności, gdy zatwierdzony proces zarządzania zmianami nie jest używany do wprowadzenia nowego oprogramowania
  • Ryzyko związane z jakością oprogramowania opracowanego zewnętrznie, które może nie spełniać wymagań operacyjnych firmy

Na platformie Azure stoimy przed tym samym wyzwaniem i ze znaczną złożonością. Mamy tysiące serwerów z oprogramowaniem opracowanym i obsługiwanym przez tysiące inżynierów. Przedstawia to dużą powierzchnię ataków, której nie można zarządzać tylko za pośrednictwem procesów biznesowych.

Dodawanie bramy autoryzacji

Platforma Azure korzysta z zaawansowanego procesu inżynieryjnego, który implementuje bramy w zakresie zabezpieczeń, zgodności i jakości wdrażanego oprogramowania. Ten proces obejmuje kontrolę dostępu do kodu źródłowego, przeprowadzanie przeglądów kodu równorzędnego, przeprowadzanie analizy statycznej pod kątem luk w zabezpieczeniach, po cyklu projektowania zabezpieczeń (SDL) firmy Microsoft oraz przeprowadzanie testów funkcjonalnych i jakościowych. Musimy zagwarantować, że wdrożone oprogramowanie przepływa przez ten proces. Integralność kodu pomaga nam w osiągnięciu tej gwarancji.

Integralność kodu jako brama autoryzacji

Integralność kodu to usługa na poziomie jądra, która stała się dostępna od systemu Windows Server 2016. Integralność kodu może stosować ścisłe zasady kontroli wykonywania za każdym razem, gdy sterownik lub dynamicznie połączona biblioteka (DLL) jest ładowana, jest wykonywany plik binarny wykonywalny lub jest uruchamiany skrypt. Podobne systemy, takie jak DM-Verity, istnieją dla systemu Linux. Zasady integralności kodu składają się z zestawu wskaźników autoryzacji, certyfikatów podpisywania kodu lub skrótów plików SHA256 , które jądra są zgodne przed załadowaniem lub wykonaniem pliku binarnego lub skryptu.

Integralność kodu umożliwia administratorowi systemu zdefiniowanie zasad, które autoryzują tylko pliki binarne i skrypty podpisane przez określone certyfikaty lub pasują do określonych skrótów SHA256. Jądro wymusza te zasady, blokując wykonywanie wszystkich elementów, które nie spełniają ustawionych zasad.

Problemem z zasadami integralności kodu jest to, że chyba że zasady są całkowicie poprawne, może zablokować krytyczne oprogramowanie w środowisku produkcyjnym i spowodować awarię. Biorąc pod uwagę ten problem, można zapytać, dlaczego nie wystarczy użyć monitorowania zabezpieczeń, aby wykryć, kiedy nieautoryzowane oprogramowanie zostało wykonane. Integralność kodu ma tryb inspekcji, który zamiast uniemożliwiać wykonywanie, może otrzymywać alerty po uruchomieniu nieautoryzowanego oprogramowania. Alerty z pewnością mogą dodać dużą wartość w rozwiązywaniu problemów ze zgodnością, ale w przypadku zagrożeń bezpieczeństwa, takich jak oprogramowanie wymuszające okup lub niestandardowe złośliwe oprogramowanie, opóźnienie odpowiedzi nawet przez kilka sekund może być różnicą między ochroną a przeciwnikiem uzyskującym trwałe przyczółek w twojej flocie. Na platformie Azure zainwestowaliśmy znacząco, aby zarządzać ryzykiem integralności kodu przyczyniającym się do awarii klienta.

Proces kompilacji

Jak wspomniano powyżej, system kompilacji platformy Azure ma bogaty zestaw testów, aby zapewnić bezpieczeństwo i zgodność zmian oprogramowania. Po zakończeniu walidacji kompilacji system kompilacji podpisuje go przy użyciu certyfikatu kompilacji platformy Azure. Certyfikat wskazuje, że kompilacja przeszła przez cały proces zarządzania zmianami. Ostatni test, który przechodzi kompilacja, nosi nazwę Code Signature Validation (CSV). Plik CSV potwierdza, że nowo utworzone pliki binarne spełniają zasady integralności kodu przed wdrożeniem w środowisku produkcyjnym. Daje to nam duże zaufanie, że nie spowoduje to awarii klienta z powodu niepoprawnie podpisanych plików binarnych. Jeśli plik CSV wykryje problem, przerwy kompilacji i odpowiednie inżynierowie zostaną stronicowane w celu zbadania i rozwiązania problemu.

Bezpieczeństwo podczas wdrażania

Mimo że wykonujemy woluminy CSV dla każdej kompilacji, nadal istnieje prawdopodobieństwo, że niektóre zmiany lub niespójności w środowisku produkcyjnym mogą spowodować awarię związaną z integralnością kodu. Na przykład maszyna może uruchamiać starą wersję zasad integralności kodu lub być w złej kondycji, która generuje fałszywie dodatnie wyniki w integralności kodu. (Na dużą skalę platformy Azure widzieliśmy to wszystko). W związku z tym musimy nadal chronić przed ryzykiem awarii podczas wdrażania.

Wszystkie zmiany na platformie Azure są wymagane do wdrożenia w ramach serii etapów. Pierwsze z nich to wewnętrzne wystąpienia testowania platformy Azure. Następny etap jest używany tylko do obsługi innych zespołów produktów firmy Microsoft. Ostatni etap służy klientom innych firm. Po wdrożeniu zmiany następuje przejście do każdego z tych etapów i wstrzymanie w celu zmierzenia kondycji etapu. Jeśli zmiana nie ma negatywnego wpływu, zostanie przeniesiona do następnego etapu. Jeśli wprowadzimy nieprawidłową zmianę w zasadach integralności kodu, zmiana zostanie wykryta podczas tego etapowego wdrożenia i wycofana.

Reagowanie na zdarzenia

Nawet w przypadku ochrony warstwowej nadal istnieje możliwość, że niektóre serwery w floty mogą zablokować prawidłowo autoryzowane oprogramowanie i spowodować problem klienta, jeden z naszych najgorszych scenariuszy. Nasza ostatnia warstwa obrony to ludzkie dochodzenie. Za każdym razem, gdy integralność kodu blokuje plik, zgłasza alert dla inżynierów na wezwanie do zbadania. Alert pozwala nam rozpocząć badania zabezpieczeń i interweniować, niezależnie od tego, czy problem jest wskaźnikiem rzeczywistego ataku, fałszywie dodatniego lub innej sytuacji wpływającej na klienta. Minimalizuje to czas potrzebny na ograniczenie wszelkich problemów związanych z integralnością kodu.

Następne kroki

Aby dowiedzieć się więcej o tym, co robimy, aby zwiększyć integralność i bezpieczeństwo platformy, zobacz: