Podsumowanie

Ukończone

W tym module przedstawiono sposób integrowania zabezpieczeń na każdym etapie cyklu życia tworzenia oprogramowania za pomocą zasad i praktyk devSecOps . Tradycyjne podejścia, które traktują zabezpieczenia jako końcowy punkt kontrolny przed wydaniem, tworzą wąskie gardła, zwiększają koszty i często nie wykrywają krytycznych luk w zabezpieczeniach aż do środowiska produkcyjnego. Przesuwając bezpieczeństwo w lewo i zwiększając odpowiedzialność wszystkich, organizacje mogą utrzymywać szybkość opracowywania, a jednocześnie znacząco poprawić stan bezpieczeństwa.

Ataki polegających na wstrzyknięciu kodu SQL

Wiesz już, jak iniekcja SQL pozostaje jedną z najbardziej niebezpiecznych i najpopularniejszych luk w zabezpieczeniach aplikacji internetowych:

  • Mechanizm ataku: Osoby atakujące wstawiają złośliwy kod SQL do danych wejściowych aplikacji, wykorzystując niewystarczającą walidację danych w celu manipulowania zapytaniami bazy danych.
  • Potencjalne uszkodzenia: Udane ataki mogą pomijać uwierzytelnianie, pobierać całą zawartość bazy danych, modyfikować lub usuwać rekordy, wykonywać polecenia systemu operacyjnego lub powodować odmowę usługi.
  • Powszechny wpływ: Wstrzyknięcie kodu SQL wpływa na wszystkie główne systemy baz danych, w tym MySQL, Oracle Database, Microsoft SQL Server, PostgreSQL i SQLite.
  • Podstawowe informacje dotyczące zapobiegania: Ochrona przed wstrzyknięciem kodu SQL przy użyciu zapytań sparametryzowanych, weryfikowania i oczyszczania danych wejściowych, stosowania zasad najniższych uprawnień, przeprowadzania regularnego testowania zabezpieczeń i monitorowania aktywności bazy danych.

Zasady metodyki DevSecOps

Omówiono, jak DevSecOps przekształca bezpieczeństwo z przeszkody w ułatwienie:

  • Luki w zabezpieczeniach w aplikacjach w chmurze: Wiele aplikacji ma luki w szyfrowaniu danych magazynowanych i przesyłanych oraz brakuje odpowiednich mechanizmów ochrony sesji, takich jak nagłówki zabezpieczeń HTTP.
  • Tradycyjne problemy: Konwencjonalne podejścia prowadzą do nieplanowanej pracy na końcu cykli rozwoju, kosztownych przeróbek, wąskich gardeł w procesach wydawniczych oraz obniżenia priorytetu kwestii związanych z bezpieczeństwem.
  • Rozwiązanie DevSecOps: Integrowanie zabezpieczeń od początku programowania, dzięki czemu jest to wspólna odpowiedzialność między zespołami deweloperów, operacji i zabezpieczeń.
  • Rozszerzony zakres zabezpieczeń: Poza tradycyjną kontrolą dostępu i ochroną obwodową usługa DevSecOps zabezpiecza cały potok, w tym repozytoria, serwery kompilacji, magazyn artefaktów, narzędzia wdrażania, infrastrukturę jako kod, zarządzanie konfiguracją i zarządzanie wpisami tajnymi.
  • Zabezpieczenia jako kod: Automatyzuj zarówno zabezpieczenia infrastruktury (skanowanie IaC, zasady jako kod, sprawdzanie zgodności) i zabezpieczenia aplikacji (SAST, DAST, SCA, skanowanie kontenerów), aby umożliwić ciągłą walidację zabezpieczeń.

Bezpieczny ciąg DevOps

Zbadano, jak bezpieczne potoki rozszerzają standardową ciągłą integrację/ciągłe wdrażanie przy użyciu krytycznych funkcji zabezpieczeń:

  • Zarządzanie pakietami z zatwierdzeniem zabezpieczeń: Zaimplementuj przepływy pracy zatwierdzania, które skanują pakiety pod kątem znanych luk w zabezpieczeniach, przeglądają licencje, analizują zależności i stale monitorują nowe problemy z zabezpieczeniami przed zezwoleniem składnikom innych firm na bazę kodu.
  • Skanowanie zabezpieczeń kodu źródłowego: Wdróż statyczne testy bezpieczeństwa aplikacji (SAST) do analizy kodu bez jego uruchamiania, skanowanie w celu ochrony przed ujawnieniem danych uwierzytelniających, oraz analizę jakości kodu, aby zidentyfikować problemy prowadzące do luk w zabezpieczeniach.
  • Czas skanowania: Uruchom testy zabezpieczeń po zakończeniu kompilacji, ale przed rozpoczęciem testowania i wdrażania, zapewniając wczesne wykrywanie, gdy koszty korygowania są najniższe.
  • Integracja narzędzi: Użyj narzędzi takich jak GitHub CodeQL, SonarQube, Checkmarx, Veracode i Microsoft Security Code Analysis, bezpośrednio zintegrowanych z linią procesową.

Kluczowe punkty weryfikacji

Wykryto krytyczne punkty kontrolne zabezpieczeń w całym procesie programowania:

  • Testy zabezpieczeń na poziomie środowiska IDE: Wychwytywanie luk w zabezpieczeniach podczas pisania kodu z informacji zwrotnej w czasie rzeczywistym, natychmiastowe możliwości nauki i poprawki przed zatwierdzeniem — co skraca pętlę informacji zwrotnej do sekund.
  • Mechanizmy zatwierdzania repozytorium: Zaimplementuj polityki gałęzi Git wymagające przeglądów kodu, powiązania elementów roboczych dla ścieżek audytowych oraz pomyślne kompilacje ciągłej integracji przed scaleniem zmian.
  • Wymagania dotyczące przeglądu kodu: Zapewnienie ręcznej weryfikacji problemów z zabezpieczeniami, w tym mechanizmów weryfikacji danych wejściowych, uwierzytelniania i autoryzacji, obsługi poufnych danych, użycia biblioteki zabezpieczeń i braku zakodowanych wpisów tajnych.
  • Automatyczne kontrole żądań pull: Uruchom analizę statyczną, sprawdzanie luk w zabezpieczeniach zależności, wykrywanie wprowadzeń tajnych i analizę jakości kodu źródłowego z wynikami wyświetlanymi bezpośrednio w interfejsie żądania pull.
  • Stopniowe wdrażanie: W przypadku produktów dojrzałych należy stopniowo wdrażać punkty weryfikacji, ustalać priorytety punktów kontrolnych o dużym wpływie i budować kulturę zabezpieczeń w czasie.

Ciągła weryfikacja zabezpieczeń

Wiesz już, jak ciągła walidacja utrzymuje bezpieczeństwo w całym cyklu życia oprogramowania:

  • Czynniki ryzyka składników innych firm: Nowoczesne aplikacje są w dużym stopniu zależne od pakietów typu open source i innych firm, wprowadzając luki w zabezpieczeniach, problemy ze zgodnością licencji i wektory ataków łańcucha dostaw.
  • Wartość wczesnego wykrywania: Znalezienie luk w zabezpieczeniach podczas tworzenia jest 10-100 razy tańsze niż ich naprawianie w środowisku produkcyjnym, co sprawia, że automatyczne skanowanie ma kluczowe znaczenie ekonomiczne.
  • Analiza kodu statycznego: Użyj narzędzi takich jak SonarQube, Visual Studio Code Analysis, Checkmarx, BinSkim i analizatory specyficzne dla języka, aby zapewnić, że kod jest zgodny z regułami zabezpieczeń i konserwacji.
  • Skanowanie luk w zabezpieczeniach: Automatyzowanie wykrywania znanych luk w zabezpieczeniach w zależnościach przy użyciu narzędzi takich jak Mend (WhiteSource), GitHub Dependabot, Snyk i Azure Artifacts, które ciągle monitorują, priorytetyzują zagrożenia i zapewniają wskazówki dotyczące korygowania.
  • Korzyści z analizy kompozycji oprogramowania: Uzyskiwanie kompleksowego wglądu we wszystkie zależności, śledzenie wersji, identyfikowanie niezamierzonych pakietów, określanie priorytetów zagrożeń za pomocą wyników CVSS, utrzymywanie ciągłego monitorowania i generowanie dokumentacji zgodności.

Metodologia modelowania zagrożeń

Przedstawiono modelowanie zagrożeń jako ustrukturyzowane podejście do zrozumienia zagrożeń:

  • Proces pięcioetapowy: Definiowanie wymagań dotyczących zabezpieczeń (poufności, integralności, dostępności, zgodności), tworzenia diagramów aplikacji (składników, przepływów danych, granic zabezpieczeń), identyfikowania zagrożeń przy użyciu metodologii STRIDE, opracowywania strategii ograniczania ryzyka (eliminowania, zapobiegania, wykrywania, reagowania) i weryfikowania, czy środki zaradcze pozostają skuteczne.
  • Metodologia STRIDE: Systematycznie rozważaj zagrożenia w sześciu kategoriach — fałszowanie tożsamości, manipulowanie danymi, odrzucanie akcji, ujawnianie informacji, odmowa usługi i podniesienie uprawnień.
  • Typowe zagrożenia i środki zaradcze: Rozwiązywanie problemów z wstrzyknięciem kodu SQL za pomocą sparametryzowanych zapytań i walidacji danych wejściowych, zapobieganie przejęciu sesji przy użyciu bezpiecznego zarządzania sesjami i protokołu HTTPS, ochrona przed atakami typu man-in-the-middle przy użyciu protokołu TLS i przypinania certyfikatów oraz eliminowania ataków DDoS przy użyciu usług ochrony w chmurze i ograniczania szybkości.
  • Integracja cyklu życia: Przeprowadzanie kompleksowego modelowania zagrożeń podczas początkowego projektowania, powtarzanie znaczących nowych funkcji, przeprowadzanie okresowych przeglądów nawet bez istotnych zmian, aktualizowanie po zdarzeniach zabezpieczeń i stopniowe zmniejszanie ryzyka w czasie.
  • Narzędzie do modelowania zagrożeń firmy Microsoft: Użyj tego bezpłatnego narzędzia, aby wizualizować składniki systemowe ze standardową notacją, automatycznie generować potencjalne zagrożenia na podstawie struktury systemu, dokumentować decyzje zaradcze, śledzić stan implementacji i integrować się z usługą Azure DevOps.

Automatyczna analiza zabezpieczeń codeQL

Wiesz już, jak usługa GitHub CodeQL umożliwia zaawansowaną automatyczną analizę zabezpieczeń:

  • Analiza kodu semantycznego: CodeQL traktuje kod jako dane, konwertując go na bazę danych, która przechwytuje drzewa składni, wykresy przepływu sterowania i ścieżki przepływu danych — umożliwiając dokładne wykrywanie luk w zabezpieczeniach, które rozumie kontekst kodu, a nie tylko dopasowywanie wzorców.
  • Analiza trójfazowa: Utwórz bazę danych CodeQL reprezentującą strukturę kodu, uruchom zapytania względem bazy danych, aby znaleźć problemy z zabezpieczeniami, i zinterpretuj wyniki z priorytetyzacji, informacji kontekstowych i wskazówek dotyczących korygowania.
  • Język zapytań CodeQL: Pisanie zapytań deklaratywnych przy użyciu programowania logiki obiektowej, które opisuje, co należy znaleźć, a nie jak je znaleźć, z rozbudowanymi standardowymi bibliotekami zapytań dla kategorii OWASP Top 10 i CWE.
  • Integracja z usługą GitHub: Włącz skanowanie kodu jednym kliknięciem, otrzymuj wbudowane adnotacje przy żądaniach ściągnięcia pokazujących wrażliwe wiersze kodu, konfiguruj CodeQL jako wymagane sprawdzenie, które musi zostać zaliczone przed scaleniem, i wyświetlaj wszystkie ustalenia na karcie Zabezpieczenia ze szczegółowymi wyjaśnieniami.
  • Integracja potoku CI/CD: Użyj narzędzia CodeQL w GitHub Actions, Azure Pipelines, Jenkins, GitLab CI/CD, CircleCI oraz w systemach niestandardowych za pomocą interfejsu wiersza polecenia, konfigurując bramy zabezpieczeń, które przerywają kompilacje po wykryciu luk o wysokiej wadze w zabezpieczeniach.
  • Narzędzia programistyczne: Pisanie i testowanie zapytań w programie Visual Studio Code za pomocą rozszerzenia CodeQL zapewniającego wyróżnianie składni, autouzupełnianie, analizę lokalną i obsługę debugowania.

Kluczowe wnioski

Podczas implementowania metodyki DevSecOps w organizacji pamiętaj o następujących podstawowych zasadach:

Bezpieczeństwo to odpowiedzialność wszystkich: Wykraczanie poza sposób myślenia, który należy wyłącznie do zespołu ds. zabezpieczeń. Deweloperzy, inżynierowie operacyjni, testerzy i uczestnicy projektu biznesowego przyczyniają się do zabezpieczeń aplikacji. Gdy zabezpieczenia stają się częścią codziennej pracy wszystkich osób, a nie oddzielnej funkcji, należy utworzyć kulturę, w której bezpieczne praktyki są domyślne.

Przesunięcie zabezpieczeń w lewo: Rozwiązywać zagadnienia zabezpieczeń na najwcześniejszym możliwym etapie. Znalezienie i naprawienie luki w zabezpieczeniach w procesie tworzenia oprogramowania kosztuje znacznie mniej niż naprawienie jej w środowisku produkcyjnym — często od 10 do 100 razy mniej. Integrując sprawdzenia zabezpieczeń w środowisku IDE, procesu przeglądu kodu i CI pipeline, można przechwytywać problemy, gdy ich rozwiązanie jest najłatwiejsze i najtańsze.

Automatyzowanie weryfikacji zabezpieczeń: Ręczne przeglądy zabezpieczeń nie są skalowane do nowoczesnych cykli wydania. Zautomatyzuj kontrolę zabezpieczeń dla analizy statycznej kodu, skanowania luk w zabezpieczeniach zależności, wykrywania tajnych danych oraz kontroli jakości kodu. Automatyzacja zapewnia spójną walidację zabezpieczeń dla każdego zatwierdzenia bez spowalniania programowania.

Weryfikacja ciągła: Bezpieczeństwo nie jest jednorazową bramą przed wypuszczeniem. Zaimplementuj weryfikację zabezpieczeń na wielu etapach — w środowisku IDE dewelopera podczas przeglądu kodu w kompilacjach ciągłej integracji, przed wdrożeniem i w środowisku produkcyjnym. Ciągła walidacja tworzy wiele możliwości przechwytywania problemów i zapewnia ochronę w głębi systemu.

Proaktywne korzystanie z modelowania zagrożeń: Nie czekaj na zdarzenia zabezpieczeń, aby myśleć o zagrożeniach. Podczas początkowego projektowania i przy dodawaniu istotnych funkcji należy stosować strukturalne modelowanie zagrożeń. Metodologia STRIDE zapewnia systematyczne podejście, które eksperci niezwiązani z zabezpieczeniami mogą zastosować do identyfikowania zagrożeń i planowania środków zaradczych przed napisaniem kodu.

Korzystanie z narzędzi do analizy automatycznej: Narzędzia takie jak CodeQL, SonarQube i Snyk umożliwiają zaawansowaną analizę zabezpieczeń, która byłaby niepraktyczna do ręcznego wykonania. Te narzędzia rozumieją semantyka kodu, śledzą przepływ danych i znajdują złożone luki w zabezpieczeniach w dużych bazach kodu. Zintegruj je z przepływem pracy, aby rutynowo wykonywać zaawansowaną analizę zabezpieczeń.

Śledzenie i zarządzanie zależnościami: Nowoczesne aplikacje są w dużym stopniu zależne od komponentów innych firm. Automatyczne skanowanie zależności identyfikuje znane luki w zabezpieczeniach i problemy ze zgodnością licencji w zależnościach. Analiza kompozycji oprogramowania zapewnia wgląd w łańcuch dostaw i pomaga szybko reagować po ujawnieniu nowych luk w zabezpieczeniach.

Decyzje dotyczące zabezpieczeń dokumentu: Użyj dokumentacji modelowania zagrożeń, wymagań dotyczących zabezpieczeń i zautomatyzowanych danych wyjściowych narzędzi, aby utworzyć ślady inspekcji pokazujące, jak zostały rozwiązane problemy z zabezpieczeniami. Ta dokumentacja pokazuje należytą staranność, pomaga nowym członkom zespołu zrozumieć kontekst zabezpieczeń i zawiera dowody na wymagania dotyczące zgodności.

Zrównoważ szybkość i bezpieczeństwo: Metodyka DevSecOps nie polega na spowolnieniu programowania w celu dodania kontroli zabezpieczeń — chodzi o integrację zabezpieczeń tak wydajnie, że nie utrudnia szybkości. Zautomatyzowane narzędzia, jasne zasady i zabezpieczenia wbudowane w normalne przepływy pracy umożliwiają zespołom szybkie przechodzenie bez naruszania zabezpieczeń.

Iterowanie i ulepszanie: Zacznij od praktyk zabezpieczeń o dużym wpływie i rozszerz się wraz z upływem czasu. Nie trzeba natychmiast implementować każdej kontroli zabezpieczeń. Rozpocznij od automatycznego skanowania zależności lub sprawdzania zabezpieczeń żądań pull request, zaprezentuj wartość i stopniowo dodawaj bardziej zaawansowane punkty weryfikacji. Ciągła poprawa zabezpieczeń odzwierciedla iteracyjne podejście metodyki DevOps.

Stosując te praktyki DevSecOps, tworzysz oprogramowanie, które jest zarówno szybko dostarczane, jak i bezpieczne zgodnie z projektem. Zabezpieczenia stają się elementem umożliwiającym, a nie przeszkodą, dzięki czemu organizacja może wprowadzać innowacje z pewnością.

Dowiedz się więcej