Eksplorowanie analizy kompozycji oprogramowania
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.