Eksplorowanie analizy kompozycji oprogramowania

Ukończone

Analiza kompozycji oprogramowania (SCA) to zautomatyzowany proces identyfikowania składników typu open source i innych firm w aplikacjach, analizowania luk w zabezpieczeniach, zgodności licencji i jakości kodu. Ponieważ nowoczesne aplikacje coraz częściej korzystają z zależności zewnętrznych, usługa SCA stała się niezbędna do zarządzania ryzykiem związanym z łańcuchami dostaw oprogramowania.

Co to jest analiza kompozycji oprogramowania?

Analiza kompozycji oprogramowania to praktyka automatycznego odnajdywania, katalogowania i analizowania wszystkich składników typu open source i innych firm używanych w aplikacji. Narzędzia SCA sprawdzają manifesty pakietów, pliki blokady zależności, kod źródłowy i skompilowane pliki binarne w celu utworzenia kompleksowego rachunku zawartości oprogramowania (SBOM).

Podstawowe możliwości analizy statycznej kodu

Odnajdywanie zależności:

  • Analizowanie manifestu: Narzędzia SCA odczytują pliki manifestu pakietu (package.json, requirements.txt, pom.xml, *.csproj) w celu zidentyfikowania zadeklarowanych zależności.
  • Analiza plików blokady: Analizowanie plików blokady (package-lock.json, Pipfile.lock, Gemfile.lock) wykazujących dokładne wersje zainstalowane, w tym zależności przechodnie.
  • Skanowanie binarne: Zaawansowane narzędzia skanują skompilowane artefakty, obrazy kontenerów i wdrożone aplikacje w celu odnalezienia osadzonych zależności, które nie zostały zadeklarowane w manifestach.
  • Obsługa wielu języków: Kompleksowe narzędzia obsługują dziesiątki języków programowania i ekosystemów pakietów (npm, PyPI, Maven, NuGet, RubyGems, Go modules).

Analiza luk w zabezpieczeniach:

  • Dopasowanie CVE: Porównaj zidentyfikowane zależności z bazami danych Common Vulnerabilities and Exposures (CVE).
  • Ocenianie ważności: Oblicz typowe oceny systemu oceny luk w zabezpieczeniach (CVSS) wskazujące ważność luki w zabezpieczeniach z zakresu od 0 (brak) do 10 (krytyczne).
  • Analiza wykorzystująca luki w zabezpieczeniach: Zidentyfikuj znane luki w zabezpieczeniach aktywnie używane przez osoby atakujące.
  • Zalecenia dotyczące poprawek: Sugerowanie określonych uaktualnień wersji, które usuwają luki w zabezpieczeniach przy zachowaniu zgodności.

Zgodność licencji:

  • Wykrywanie licencji: Zidentyfikuj licencje dla wszystkich zależności, analizując pliki licencji, metadane pakietu i nagłówki kodu źródłowego.
  • Wymuszanie zasad: Automatycznie flaguj zależności naruszające zasady licencji organizacji.
  • Analiza zgodności: Wykrywanie konfliktów licencji, które nie mogą być prawnie połączone w tej samej aplikacji.
  • Śledzenie obowiązku: Dokumentowanie wymagań licencyjnych, takich jak powiadomienia o autorstwie, ujawnienie kodu źródłowego lub ograniczenia pracy pochodnej.

Ocena jakości:

  • Stan konserwacji: Oceń, czy zależności są aktywnie utrzymywane, czy porzucone.
  • Zdrowie społeczności: Ocena działań współautorów, rozmiaru społeczności i zrównoważonego rozwoju projektu.
  • Rozwiązania w zakresie zabezpieczeń: Sprawdź, czy projekty mają procesy odpowiedzialnego ujawniania informacji i biuletyny zabezpieczeń.
  • Zalecenia dotyczące aktualizacji: Zidentyfikuj nieaktualne zależności i zasugeruj bezpieczniejsze, bardziej aktualne alternatywy.

Dlaczego analiza składu oprogramowania ma kluczowe znaczenie dla metodyki DevOps

Nowoczesne praktyki programistyczne sprawiają, że SCA jest niezbędna:

Eksplozja zależności

Aplikacje zawierają setki zależności:

  • Zależności bezpośrednie: Typowa aplikacja bezpośrednio odwołuje się do 20–50 pakietów zewnętrznych.
  • Zależności przechodnie: Każda bezpośrednia zależność przynosi własne zależności, tworząc drzewa zależności z 200–500 całkowitymi pakietami.
  • Wiele ekosystemów: Aplikacje często łączą zależności z wielu ekosystemów językowych (fronton JavaScript, zaplecze języka Python, mikrousługi Java).
  • Zależności kontenera: Konteneryzowane aplikacje obejmują zależności obrazu podstawowego oraz zależności aplikacji.

Śledzenie ręczne jest niemożliwe:

  • Skala: Ręczne śledzenie setek zależności w dziesiątkach aplikacji jest niepraktyczne.
  • Prędkość: Nowe luki w zabezpieczeniach są ujawniane codziennie, co sprawia, że wszelka ręczna inwentaryzacja od razu staje się przestarzała.
  • Złożoność: Zrozumienie przejściowych łańcuchów zależności i ich interakcji wymaga zautomatyzowanej analizy.
  • Własność rozproszona: Zależności utrzymywane przez tysiące niezależnych projektów open source na całym świecie.

Imperatyw zabezpieczeń

Luki w zabezpieczeniach w zależnościach są aktywnie wykorzystywane:

  • Naruszenia wysokiego profilu: Główne zdarzenia zabezpieczeń regularnie obejmują wykorzystanie znanych luk w zabezpieczeniach w popularnych pakietach typu open source.
  • Ataki łańcucha dostaw: Atakujący kompromitują legalne pakiety, aby dystrybuować złośliwe oprogramowanie do odbiorców końcowych.
  • Luki w zabezpieczeniach zero-dniowych: Wcześniej nieznane luki w zabezpieczeniach w powszechnie używanych pakietach mogą mieć wpływ na tysiące organizacji jednocześnie.
  • Pilność poprawek: Krytyczne luki w zabezpieczeniach wymagają szybkiej identyfikacji i korygowania we wszystkich aplikacjach, których dotyczy problem.

Tradycyjne narzędzia zabezpieczeń pomijają luki w zabezpieczeniach zależności:

  • Analiza statyczna: Narzędzia do skanowania kodu źródłowego analizują kod, ale nie kod zależności.
  • Testowanie dynamiczne: Testy penetracyjne mogą nie wykrywać luk w zabezpieczeniach w elementach zależnych, które nie są aktywowane podczas testów.
  • Przegląd ręczny: Zespoły ds. zabezpieczeń nie mogą łatwo przeglądać kodu źródłowego setek pakietów innych firm.
  • Wykrywanie wyspecjalizowane: Narzędzia SCA zaprojektowane specjalnie do identyfikowania luk w zabezpieczeniach zależności są wymagane.

Wymaganie dotyczące zgodności

Naruszenia licencji niosą ze sobą znaczne ryzyko:

  • Odpowiedzialność prawna: Korzystanie z zależności bez przestrzegania postanowień licencyjnych może spowodować pozwy i szkody.
  • Wymuszone udostępnienie źródła: Silne licencje copyleft (GPL, AGPL) mogą wymagać udostępnienia kodu źródłowego całych aplikacji.
  • Ograniczenia dystrybucji: Niektóre licencje uniemożliwiają dystrybucję komercyjną lub nakładają ograniczenia użycia.
  • Wymagania dotyczące audytu: Struktury regulacyjne coraz częściej wymagają od organizacji utrzymania precyzyjnej listy składników oprogramowania.

Złożoność licencji:

  • Setki typów licencji: Ekosystem open source obejmuje setki odrębnych licencji z różnymi obowiązkami.
  • Problemy ze zgodnością: Różne licencje mają sprzeczne warunki, które zabraniają ich wspólnego używania.
  • Licencjonowanie przejściowe: Zobowiązania licencyjne wynikające z przejściowych zależności muszą być śledzone i spełnione.
  • Zmiany licencji: Projekty czasami zmieniają licencje między wersjami, co wymaga ciągłego monitorowania.

Jak działają narzędzia SCA

Narzędzia SCA wykorzystują wiele technik do odnajdywania i analizowania zależności:

Mechanizmy odnajdywania

Analizowanie pliku manifestu:

  • Formaty specyficzne dla języka: Narzędzia rozumieją formaty manifestu pakietu dla każdego języka (package.json dla programu npm, requirements.txt dla języka Python, pom.xml for Maven).
  • Rozwiązywanie zależności: Przeanalizuj specyfikacje wersji zależności, w tym zakresy, ograniczenia i reguły rozwiązywania problemów.
  • Skanowanie obszaru roboczego: Cykliczne skanowanie katalogów projektów w celu znalezienia wszystkich plików manifestu w obszarach roboczych monorepos i wieloprojektowych.
  • Rozpoznawanie konfiguracji: Należy rozważyć zależności specyficzne dla środowiska (programowanie, testowanie, produkcja) oddzielnie.

Analiza pliku blokującego zależności:

  • Dokładne wersje: Pliki blokady zapisują dokładne wersje wszystkich zależności, w tym zależności przechodnich.
  • Stan instalacji: Reprezentują rzeczywiste zainstalowane zależności, a nie abstrakcyjne.
  • Rozdzielczość deterministyczna: Pliki blokady zapewniają spójność wersji zależności w różnych środowiskach.
  • Ukończ wykresy zależności: Uwzględnij pełne przejściowe drzewo zależności z rozwiązaniami wersji.

Skanowanie danych binarnych i artefaktów:

  • Skompilowane artefakty: Skanuj pliki JAR, pliki kołowe, biblioteki DLL i pliki wykonywalne, aby zidentyfikować osadzone zależności.
  • Warstwy obrazu kontenera: Analizowanie warstw obrazu kontenera w celu odnajdywania podstawowych składników obrazu i zależności aplikacji.
  • Skanowanie systemu plików: Sprawdź wdrożone systemy plików aplikacji, aby znaleźć zależności, które nie zostały zadeklarowane w manifestach.
  • Fingerprinting: Użyj skrótów kryptograficznych, aby zidentyfikować określone wersje pakietów nawet bez metadanych.

Integracja kompilacji:

  • Wtyczki narzędzi kompilacji: Integruje się z systemami kompilacji (Maven, Gradle, webpack, pip) w celu przechwytywania informacji o zależnościach podczas kompilacji.
  • Hooki do rozwiązywania zależności: Zintegruj się z procesami rozwiązywania zależności, aby rejestrować dokładne wersje zainstalowane.
  • Generowanie artefaktów: Generowanie artefaktów związanych z listą materiałów oprogramowania (SBOM) podczas budowania, do dalszego przetwarzania.
  • Integracja z pipeline: Uruchamiaj jako zautomatyzowane kroki w potokach CI/CD, aby analizować każdą kompilację.

Możliwości analizy

Dopasowywanie luk w zabezpieczeniach:

  • Zapytania dotyczące baz danych: Zapytania do krajowej bazy danych luk w zabezpieczeniach (NVD), bazy doradztwa GitHub i zastrzeżonych baz danych luk w zabezpieczeniach.
  • Dopasowywanie zakresu wersji: Ustal, czy określone wersje pakietów należą do zakresów wersji podatnych na zagrożenia.
  • Walidacja poprawek: Sprawdź, czy zastosowane poprawki rzeczywiście rozwiążą zgłoszone luki w zabezpieczeniach.
  • Priorytetyzacja: Klasyfikacja luk w zabezpieczeniach według ważności, możliwości wykorzystania i wpływu na działalność biznesową.

Identyfikacja licencji:

  • Wiele źródeł: Wyodrębnij informacje o licencji z metadanych pakietu, plików licencji, nagłówków źródłowych i dokumentów readme.
  • Normalizacja licencji: Mapowanie różnych nazw licencji i identyfikatorów (SPDX, OSI) na standardowe typy licencji.
  • Podwójne licencjonowanie: Obsługa pakietów wydanych w ramach wielu alternatywnych licencji.
  • Licencje niestandardowe: Zidentyfikuj nietypowe licencje wymagające przeglądu prawnego.

Analiza dostępności:

  • Konstrukcja grafu wywołań: Kompiluj wykresy wywołań pokazujące, który kod zależności jest rzeczywiście wykonywany przez aplikację.
  • Wykrywanie nieaktywnego kodu: Zidentyfikuj zależności, które są związane, ale nigdy nieużywane.
  • Analiza ścieżki wykorzystania: Ustal, czy ścieżki kodu podatnego na zagrożenia są osiągalne z punktów wejścia aplikacji.
  • Uściślenie ryzyka: Zmniejsz szum, koncentrując się na lukach w zabezpieczeniach z możliwością wykorzystania w faktycznie używanym kodzie.

Ciągłe monitorowanie:

  • Alerty w czasie rzeczywistym: Otrzymywanie natychmiastowych powiadomień, gdy zostaną ujawnione nowe luki w zabezpieczeniach wpływające na zależności.
  • Zaplanowane skanowanie: Regularne ponowne skanowanie aplikacji w celu wykrywania nowo odnalezionych luk w zabezpieczeniach w niezmienionych zależnościach.
  • Porównanie linii bazowej: Śledzenie zmian stanu luk w zabezpieczeniach i zgodności w czasie.
  • Zapobieganie regresji: Alert, gdy nowe zależności wprowadzają luki w zabezpieczeniach lub naruszenia licencji.

Wzorce integracji SCA

Efektywna implementacja SCA obejmuje integrację w wielu punktach w cyklu projektowania:

Stacja robocza dla deweloperów

Integracja środowiska IDE:

  • Opinie w czasie rzeczywistym: Skanuj zależności, gdy deweloperzy dodają je do projektów.
  • Ostrzeżenia wbudowane: Wyświetlanie ostrzeżeń dotyczących luk w zabezpieczeniach i licencji bezpośrednio w środowisku IDE.
  • Sugestie dotyczące korygowania: Zasugeruj alternatywne wersje pakietów lub pakiety zastępcze.
  • Wymuszanie zasad: Zapobiegaj dodawaniu zależności naruszających zasady organizacji.

Walidacja przed zatwierdzeniem:

  • Haki git: Uruchom kontrole SCA przed zatwierdzeniami, aby zapobiec wprowadzeniu zależności podatnych na zagrożenia.
  • Skanowanie lokalne: Przeanalizuj zmiany lokalnie przed wypchnięciem do repozytoriów zdalnych.
  • Szybka opinia: Przekaż natychmiastową opinię deweloperom podczas aktywnego opracowywania.
  • Wczesne wykrywanie: Przechwytuj problemy zanim dotrą do udostępnionych gałęzi i potoków CI/CD.

Kontrola źródła

Walidacja pull requesta:

  • Testy automatyczne: Przeprowadź analizę SCA dla wszystkich pull requestów, aby wykryć zmiany zależności.
  • Przejrzyj komentarze: Opublikuj wyniki jako komentarze do żądania ściągnięcia na potrzeby widoczności recenzenta.
  • Blokowanie scalania: Zapobiegaj scalaniu żądań ściągnięcia, które wprowadzają krytyczne luki w zabezpieczeniach lub naruszenia licencji.
  • Śledzenie zmian zależności: Ujawnić, jakie zmiany zależności wprowadza każde żądanie ściągnięcia.

Integracja z usługą GitHub Dependabot:

  • Aktualizacje automatyczne: Automatycznie twórz żądania pull, gdy dostępne są aktualizacje zabezpieczeń zależności.
  • Alerty dotyczące luk w zabezpieczeniach: Otrzymywanie alertów zabezpieczeń usługi GitHub dla zależności podatnych na zagrożenia.
  • Wykres zależności: Wizualizowanie relacji zależności w funkcji grafu zależności usługi GitHub.
  • Przejrzyj przepływy pracy: Korzystaj z procesów przeglądu i zatwierdzania usługi GitHub na potrzeby aktualizacji zależności.

Potoki CI/CD

Skanowanie w czasie kompilacji:

  • Etapy potoku: Dodaj skanowanie SCA jako zautomatyzowane kroki kompilacji w potokach CI/CD.
  • Bramy jakości: Zatrzymuj kompilacje, które nie spełniają wymagań dotyczących zabezpieczeń i zgodności.
  • Generowanie SBOM: Tworzenie artefaktów listy materiałowej oprogramowania wraz z danymi wyjściowymi kompilacji.
  • Dzienniki inspekcji: Rejestruj wyniki skanowania pod kątem zgodności i celów kryminalistycznych.

Bramy wdrażania:

  • Weryfikacja przed wdrożeniem: Skanuj artefakty przed wdrożeniem w środowiskach produkcyjnych.
  • Zasady specyficzne dla środowiska: Stosowanie bardziej rygorystycznych zasad dla wdrożeń produkcyjnych niż wdrożenia programistyczne.
  • Wyzwalacze wycofywania: Automatyczne wycofywanie wdrożeń wykrytych jako zawierające krytyczne luki w zabezpieczeniach.
  • Zatwierdzenia wdrożenia: Wymagaj ręcznego zatwierdzania wdrożeń ze znanymi, ale akceptowanymi zagrożeniami.

Monitorowanie środowiska uruchomieniowego

Skanowanie produkcyjne:

  • Analiza wdrożonych aplikacji: Skanuj rzeczywiście wdrożone aplikacje w celu wykrywania zależności środowiska uruchomieniowego.
  • Skanowanie rejestru kontenerów: Stale skanuj obrazy kontenerów przechowywane w rejestrach.
  • Analiza funkcji bezserwerowych: Skanuj wdrożone funkcje bezserwerowe i ich zależności.
  • Wykrywanie dryfu: Identyfikowanie różnic między zamierzonymi a rzeczywistymi zależnościami wdrożonymi.

Ciągłe monitorowanie luk w zabezpieczeniach:

  • Ciągła inwigilacja: Monitoruj wdrożone aplikacje pod kątem nowo ujawnionych luk w zabezpieczeniach wpływających na bieżące zależności.
  • Reagowanie na zdarzenia: Wyzwalanie przepływów pracy reagowania na zdarzenia w przypadku wykrycia krytycznych luk w zabezpieczeniach w środowisku produkcyjnym.
  • Planowanie poprawek: Generowanie planów wdrażania poprawek na potrzeby rozwiązywania luk w zabezpieczeniach wdrożonych aplikacji.
  • Zgodność z SLA: Śledzenie okresów naprawczych w celu zapewnienia zgodności z SLA dotyczącymi zabezpieczeń.

Najlepsze rozwiązania dotyczące przepływu pracy SCA

Pomyślna implementacja SCA jest zgodna ze sprawdzonymi przepływami pracy:

Ustanów punkt odniesienia

Początkowy spis:

  • Kompleksowe odnajdywanie: Uruchom narzędzia SCA dla wszystkich aplikacji, aby utworzyć kompletny spis zależności.
  • Ocena ryzyka: Omówienie bieżącej ekspozycji na luki w zabezpieczeniach i problemów ze zgodnością licencji.
  • Priorytetyzacja: Określenie, które aplikacje i luki w zabezpieczeniach wymagają natychmiastowej uwagi.
  • Dokumentacja punktu odniesienia: Dokumentowanie bieżącego stanu jako punktu odniesienia do mierzenia poprawy.

Definiowanie zasad

Zasady zabezpieczeń:

  • Progi ważności dla luk w zabezpieczeniach: Określ, które poziomy ważności są akceptowalne (np. bez krytycznego poziomu, ograniczony poziom wysoki).
  • Przedziały czasowe korygowania: Ustal SLA dotyczące naprawy luk o różnej wadze (krytyczne w ciągu 7 dni, wysokie w ciągu 30 dni).
  • Procesy wyjątków: Tworzenie przepływów pracy do akceptowania ryzyka, gdy natychmiastowe korygowanie nie jest możliwe.
  • Śledzenie wykluczeń: Zabezpiecz ślad audytu akceptowanych ryzyk, biorąc pod uwagę uzasadnienia biznesowe.

Zasady zgodności:

  • Listy dozwolonych licencji: Określ, które licencje są zawsze akceptowalne (MIT, Apache 2.0, BSD).
  • Listy odmowy licencji: Uniemożliwianie określonych licencji niezgodnych z modelem biznesowym (GPL dla oprogramowania własnościowego).
  • Przepływy pracy zatwierdzania: Wymagają oceny prawnej dla zależności z określonymi licencjami (LGPL, MPL, licencje niestandardowe).
  • Wymagania dotyczące autorstwa: Zdefiniuj sposób przypisywania licencji w oprogramowaniu rozproszonym.

Automatyzowanie wymuszania

Integracja potoku:

  • Automatyczne skanowanie: Uruchom automatyczne sprawdzanie SCA przy każdej kompilacji i wniosku ściągnięcia.
  • Bramy jakości: Skonfiguruj bramy potoku, które blokują kompilacje lub wdrożenia naruszające zasady.
  • Zautomatyzowane korygowanie: Użyj narzędzi, takich jak GitHub Dependabot, aby automatycznie tworzyć żądania pull w celu aktualizacji zabezpieczeń.
  • Reporting: Generowanie raportów zgodności na potrzeby widoczności inspekcji i zarządzania.

Ciągłe doskonalenie

Śledzenie metryk:

  • Średni czas korygowania (MTTR): Zmierz, jak szybko luki w zabezpieczeniach są poprawiane po odnalezieniu.
  • Zmniejszenie luk w zabezpieczeniach: Śledzenie malejących liczby luk w zabezpieczeniach w czasie.
  • Współczynnik zgodności: Monitoruj procent zależności spełniających zasady licencji.
  • Pokrycia: Upewnij się, że narzędzia SCA skanują wszystkie aplikacje i zależności.

Uściślenie procesów:

  • Zarządzanie fałszywymi alarmami: Konfiguracja narzędzi w celu zmniejszenia liczby fałszywych alarmów przez ustawienia i wyjątki.
  • Szkolenie dla deweloperów: Poinformuj deweloperów o bezpiecznym wyborze zależności i zarządzaniu nimi.
  • Ewolucja zasad: Aktualizuj zasady na podstawie pojawiających się zagrożeń i wymagań biznesowych.
  • Ocena narzędzia: Okresowo oceniaj nowe narzędzia i funkcje SCA.

Analiza kompozycji oprogramowania zapewnia zautomatyzowane możliwości niezbędne do zarządzania zagrożeniami bezpieczeństwa i zgodności w nowoczesnych aplikacjach, które w dużym stopniu zależą od składników typu open source. W następnej lekcji dowiesz się, jak zaimplementować narzędzie GitHub Dependabot, określone narzędzie SCA zintegrowane z usługą GitHub.