Udostępnij za pośrednictwem


Najlepsze rozwiązania dotyczące bezpiecznego łańcucha dostaw oprogramowania

Open Source jest wszędzie. Jest on w wielu zastrzeżonych bazach kodu i projektach społeczności. W przypadku organizacji i osób fizycznych obecnie pytanie nie dotyczy tego, czy używasz kodu open source, ale jakiego kodu typu open source używasz i jak bardzo.

Jeśli nie wiesz, co znajduje się w łańcuchu dostaw oprogramowania, luka w zabezpieczeniach nadrzędnych w jednej z zależności może być śmiertelna, co sprawia, że ty i twoi klienci są narażeni na potencjalne naruszenie zabezpieczeń. W tym dokumencie dowiesz się, co oznacza termin "łańcuch dostaw oprogramowania", dlaczego ma to znaczenie i jak można pomóc w zabezpieczeniu łańcucha dostaw projektu przy użyciu najlepszych rozwiązań.

The State of the Octoverse 2020 - Open Source

Zależności

Termin łańcuch dostaw oprogramowania służy do odwoływania się do wszystkiego, co wchodzi w oprogramowanie i skąd pochodzi. Jest to zależności i właściwości zależności, od których zależy łańcuch dostaw oprogramowania. Zależność jest tym, czego potrzebuje oprogramowanie do uruchomienia. Może to być kod, pliki binarne lub inne składniki, z których pochodzą, takie jak repozytorium lub menedżer pakietów.

Zawiera on informacje o tym, kto napisał kod, kiedy został dodany, w jaki sposób został przejrzyszony pod kątem problemów z zabezpieczeniami, znanych luk w zabezpieczeniach, obsługiwanych wersji, informacji o licencjach oraz o wszystkim, co dotyka go w dowolnym momencie procesu.

Łańcuch dostaw obejmuje również inne części stosu poza pojedynczą aplikację, takie jak skrypty kompilacji i pakowania lub oprogramowanie, na których działa infrastruktura, na którą opiera się aplikacja.

Luki w zabezpieczeniach

Obecnie zależności oprogramowania są wszechobecne. Często zdarza się, że projekty używają setek zależności typu open source dla funkcji, których nie trzeba pisać samodzielnie. Może to oznaczać, że większość aplikacji składa się z kodu, którego nie utworzono.

The State of the Octoverse 2020 - Dependencies

Możliwe luki w zabezpieczeniach w zależnościach innych firm lub open source są prawdopodobnie zależnościami, których nie można kontrolować tak ściśle, jak kod, który piszesz, co może powodować potencjalne zagrożenia bezpieczeństwa w łańcuchu dostaw.

Jeśli jedna z tych zależności ma lukę w zabezpieczeniach, prawdopodobnie masz również lukę w zabezpieczeniach. Może to być przerażające, ponieważ jedna z zależności może się zmienić, nawet nie wiedząc. Nawet jeśli luka w zabezpieczeniach istnieje obecnie w zależności, ale nie jest dostępna do wykorzystania, może być wykorzystywana w przyszłości.

Możliwość wykorzystania pracy tysięcy deweloperów i autorów bibliotek typu open source oznacza, że tysiące obcych może skutecznie przyczynić się bezpośrednio do kodu produkcyjnego. Twój produkt, za pośrednictwem łańcucha dostaw oprogramowania, ma wpływ na niezaznaczone luki w zabezpieczeniach, niewinne błędy, a nawet złośliwe ataki na zależności.

Kompromisy w łańcuchu dostaw

Tradycyjna definicja łańcucha dostaw pochodzi z produkcji; jest to łańcuch procesów wymaganych do tworzenia i dostarczania czegoś. Obejmuje ona planowanie, dostarczanie materiałów, produkcji i sprzedaży detalicznej. Łańcuch dostaw oprogramowania jest podobny, z wyjątkiem materiałów, jest to kod. Zamiast produkcji, jest to rozwój. Zamiast kopać rudę z ziemi, kod jest pozyskiwany od dostawców, komercyjnych lub open source, a ogólnie kod open source pochodzi z repozytoriów. Dodanie kodu z repozytorium oznacza, że produkt przyjmuje zależność od tego kodu.

Jeden z przykładów ataku łańcucha dostaw oprogramowania występuje, gdy złośliwy kod jest celowo dodawany do zależności przy użyciu łańcucha dostaw tej zależności w celu dystrybucji kodu do jego ofiar. Ataki łańcucha dostaw są prawdziwe. Istnieje wiele metod ataku na łańcuch dostaw, od bezpośredniego wstawiania złośliwego kodu jako nowego współautora do przejęcia konta współautora bez zauważenia przez innych, a nawet naruszenie klucza podpisywania w celu dystrybucji oprogramowania, które nie jest oficjalnie częścią zależności.

Atak łańcucha dostaw oprogramowania jest rzadko celem końcowym, a raczej na początku szansy na wstawienie złośliwego oprogramowania lub zapewnienie backdoor na potrzeby przyszłego dostępu.

The State of the Octoverse 2020 - Vulnerability Lifecycle

Oprogramowanie niezaznaczone

Korzystanie z oprogramowania open source jest obecnie znaczące i nie powinno spowalniać w najbliższym czasie. Biorąc pod uwagę, że nie przestaniemy korzystać z oprogramowania typu open source, zagrożenie dla bezpieczeństwa łańcucha dostaw nie jest oprogramowaniem niezaznaczone. Wiedząc, że jak można rozwiązać ryzyko, że zależność projektu ma lukę w zabezpieczeniach?

  • Znajomość tego, co znajduje się w twoim środowisku. Wymaga to odnalezienia zależności i wszelkich przejściowych zależności w celu zrozumienia ryzyka tych zależności, takich jak luki w zabezpieczeniach lub ograniczenia licencjonowania.
  • Zarządzanie zależnościami. Po wykryciu nowej luki w zabezpieczeniach należy określić, czy ma to wpływ, a jeśli tak, należy zaktualizować do najnowszej dostępnej wersji i poprawki zabezpieczeń. Jest to szczególnie ważne, aby przejrzeć zmiany, które wprowadzają nowe zależności lub regularnie przeprowadzają inspekcję starszych zależności.
  • Monitoruj łańcuch dostaw. Jest to spowodowane inspekcją kontrolek, które są używane do zarządzania zależnościami. Pomoże to wymusić bardziej restrykcyjne warunki, które będą spełnione dla zależności.

The State of the Octoverse 2020 - Advisories

Omówimy różne narzędzia i techniki zapewniane przez narzędzia NuGet i GitHub, których można użyć dzisiaj w celu rozwiązania potencjalnych zagrożeń w projekcie.

Wiedza na temat tego, co znajduje się w twoim środowisku

Wykres zależności Narzędzia NuGet

📦 Odbiorca pakietu

Zależności NuGet można wyświetlić w projekcie, przeglądając bezpośrednio odpowiedni plik projektu.

Zazwyczaj znajduje się to w jednym z dwóch miejsc:

W zależności od metody używanej do zarządzania zależnościami NuGet można również użyć programu Visual Studio, aby wyświetlić zależności bezpośrednio w Eksplorator rozwiązań lub Menedżer pakietów NuGet.

W przypadku środowisk interfejsu dotnet list package wiersza polecenia możesz użyć polecenia , aby wyświetlić listę zależności projektu lub rozwiązania.

Aby uzyskać więcej informacji na temat zarządzania zależnościami NuGet, zobacz poniższą dokumentację.

Wykres zależności usługi GitHub

📦 Odbiorca pakietu | 📦🖊 Autor pakietu

Możesz użyć grafu zależności usługi GitHub, aby wyświetlić pakiety, od których zależy projekt, oraz repozytoria, które od niego zależą. Może to pomóc w wykryciu wszelkich luk w zabezpieczeniach wykrytych w jego zależnościach.

Aby uzyskać więcej informacji na temat zależności repozytorium GitHub, zobacz poniższą dokumentację.

Wersje zależności

📦 Odbiorca pakietu | 📦🖊 Autor pakietu

Aby zapewnić bezpieczny łańcuch dostaw zależności, należy upewnić się, że wszystkie zależności i narzędzia są regularnie aktualizowane do najnowszej stabilnej wersji, ponieważ często będą zawierać najnowsze funkcje i poprawki zabezpieczeń do znanych luk w zabezpieczeniach. Zależności mogą zawierać kod, od których zależysz, używane pliki binarne, używane narzędzia i inne składniki. Mogą to być na przykład:

Zarządzanie zależnościami

Przestarzałe i podatne na zagrożenia zależności narzędzia NuGet

📦 Odbiorca pakietu | 📦🖊 Autor pakietu

Interfejs wiersza polecenia dotnet umożliwia wyświetlenie listy znanych przestarzałych lub podatnych na zagrożenia zależności, które mogą znajdować się w projekcie lub rozwiązaniu. Możesz użyć polecenia dotnet list package --deprecated lub dotnet list package --vulnerable podać listę znanych wycofań lub luk w zabezpieczeniach.

Zależności podatne na zagrożenia w usłudze GitHub

📦 Odbiorca pakietu | 📦🖊 Autor pakietu

Jeśli projekt jest hostowany w usłudze GitHub, możesz użyć zabezpieczeń usługi GitHub, aby znaleźć luki w zabezpieczeniach i błędy w projekcie, a narzędzie Dependabot naprawi je, otwierając żądanie ściągnięcia względem bazy kodu.

Przechwytywanie wrażliwych zależności przed ich wprowadzeniem jest jednym z celów ruchu "Shift w lewo". Możliwość posiadania informacji o zależnościach, takich jak ich licencja, zależności przechodnie i wiek zależności, pomaga to zrobić.

Aby uzyskać więcej informacji na temat alertów i aktualizacji zabezpieczeń dependabot, zobacz poniższą dokumentację.

Źródła danych NuGet

📦 Odbiorca pakietu

W przypadku korzystania z wielu publicznych i prywatnych źródeł źródłowych NuGet można pobrać pakiet z dowolnego źródła danych. Aby upewnić się, że kompilacja jest przewidywalna i bezpieczna przed znanymi atakami, takimi jak Błąd zależności, wiedza o konkretnych kanałach informacyjnych, z których pochodzą pakiety, jest najlepszym rozwiązaniem. Do ochrony można użyć pojedynczego źródła danych lub kanału informacyjnego prywatnego z funkcjami nadrzędnymi.

Aby uzyskać więcej informacji na temat zabezpieczania kanałów informacyjnych pakietów, zobacz 3 sposoby ograniczania ryzyka podczas korzystania z prywatnych kanałów informacyjnych pakietów.

W przypadku korzystania z kanału informacyjnego prywatnego zapoznaj się z najlepszymi rozwiązaniami w zakresie zabezpieczeń dotyczącymi zarządzania poświadczeniami.

Zasady zaufania klienta

📦 Odbiorca pakietu

Istnieją zasady, do których można wyrazić zgodę, w których wymagane są pakiety, których używasz do podpisania. Dzięki temu można ufać autorowi pakietu, o ile jest podpisany przez autora lub ufać pakietowi, jeśli jest własnością określonego użytkownika lub konta podpisanego przez NuGet.org.

Aby skonfigurować zasady zaufania klientów, zapoznaj się z następującą dokumentacją.

Blokowanie plików

📦 Odbiorca pakietu

Zablokuj pliki przechowują skrót zawartości pakietu. Jeśli skrót zawartości pakietu, który chcesz zainstalować, jest zgodny z plikiem blokady, zapewni powtarzalność pakietu.

Aby włączyć pliki blokady, zapoznaj się z następującą dokumentacją.

Mapowanie źródła pakietu

📦 Odbiorca pakietu

Mapowanie źródła pakietów umożliwia centralne deklarowanie źródła, z którego każdy pakiet w rozwiązaniu powinien zostać przywrócony w pliku nuget.config.

Aby włączyć mapowanie źródła pakietu, zapoznaj się z następującą dokumentacją.

Monitorowanie łańcucha dostaw

Skanowanie wpisów tajnych usługi GitHub

📦🖊 Autor pakietu

Usługa GitHub skanuje repozytoria kluczy interfejsu API NuGet, aby zapobiec fałszywym użyciu wpisów tajnych, które zostały przypadkowo zatwierdzone.

Aby dowiedzieć się więcej na temat skanowania wpisów tajnych, zobacz About secret scanning (Informacje o skanowaniu wpisów tajnych).

Tworzenie podpisywania pakietów

📦🖊 Autor pakietu

Podpisywanie autorów umożliwia autorowi pakietu sygnaturę tożsamości w pakiecie, a użytkownik może zweryfikować, czy pochodzi od Ciebie. Chroni to przed manipulowaniem zawartością i służy jako jedno źródło prawdy o pochodzeniu pakietu i autentyczności pakietu. W połączeniu z zasadami zaufania klienta można sprawdzić, czy pakiet pochodzi od określonego autora.

Aby utworzyć podpis pakietu, zobacz Podpisywanie pakietu.

Odtwarzalne kompilacje

📦🖊 Autor pakietu

Odtwarzalne kompilacje tworzą pliki binarne, które są bajtami dla bajtów identyczne przy każdym kompilowaniu i zawierają linki kodu źródłowego i metadane kompilatora, które umożliwiają użytkownikowi pakietu ponowne utworzenie pliku binarnego bezpośrednio i sprawdzenie, czy środowisko kompilacji nie zostało naruszone.

Aby dowiedzieć się więcej na temat powtarzalnych kompilacji, zobacz Tworzenie pakietów za pomocą linku źródłowego i specyfikację weryfikacji powtarzalnej kompilacji .

Uwierzytelnianie dwuskładnikowe (2FA)

📦🖊 Autor pakietu

Każde konto na nuget.org ma włączoną uwierzytelnianie 2FA. Spowoduje to dodanie dodatkowej warstwy zabezpieczeń podczas logowania się do konta usługi GitHub lub konta NuGet.org.

Rezerwowanie prefiksów identyfikatorów pakietów

📦🖊 Autor pakietu

Aby chronić tożsamość pakietów, możesz zarezerwować prefiks identyfikatora pakietu z odpowiednią przestrzenią nazw, aby skojarzyć pasującego właściciela, jeśli prefiks identyfikatora pakietu prawidłowo mieści się w określonych kryteriach.

Aby dowiedzieć się więcej o rezerwowaniu prefiksów identyfikatorów, zobacz Rezerwacja prefiksu identyfikatora pakietu.

Oznaczanie i usuwanie listy pakietów podatnych na zagrożenia

📦🖊 Autor pakietu

Aby chronić ekosystem pakietów platformy .NET, gdy masz świadomość luki w zabezpieczeniach pakietu, który został utworzony, wykonaj najlepsze czynności, aby wycofać i usunąć listę pakietu, aby był ukryty przed użytkownikami wyszukującymi pakiety. Jeśli korzystasz z pakietu, który jest przestarzały i nie ma go na liście, należy unikać korzystania z pakietu.

Aby dowiedzieć się, jak wycofać i usunąć listę pakietów, zobacz następującą dokumentację dotyczącą przestarzałego i wyrejecjonowania pakietów.

Podsumowanie

Łańcuch dostaw oprogramowania to wszystko, co wchodzi w kod lub wpływa na twój kod. Mimo że kompromisy w łańcuchu dostaw są prawdziwe i rosnące popularności, nadal są rzadkie; najważniejszą rzeczą, jaką można zrobić, jest ochrona łańcucha dostaw przez informowanie o zależnościach, zarządzanie zależnościami i monitorowanie łańcucha dostaw.

Wiesz już o różnych metodach, które zapewniają narzędzia NuGet i GitHub , które są dostępne dla Ciebie dzisiaj, aby być bardziej skuteczne w wyświetlaniu, zarządzaniu i monitorowaniu łańcucha dostaw.

Aby uzyskać więcej informacji na temat zabezpieczania oprogramowania na świecie, zobacz The State of the Octoverse 2020 Security Report (Raport o stanie październikowego 2020 r.).