Podsumowanie
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
- Narzędzia i usługi DevSecOps | Microsoft Azure.
- Włączanie usługi DevSecOps za pomocą platformy Azure i usługi GitHub — DevSecOps | Microsoft Learn.
- Zaawansowana ochrona przed zagrożeniami — Azure SQL Database, SQL Managed Instance i Azure Synapse Analytics | Microsoft Learn.
- Zabezpieczanie usługi Azure Pipelines — Azure Pipelines | Microsoft Learn.
- Iniekcja SQL — SQL Server | Microsoft Learn.
- Omówienie języka CodeQL.
- Omówienie narzędzia do modelowania zagrożeń firmy Microsoft.