
Modelowanie zagrożeń odpowiada na pytanie, co może pójść nie tak w konkretnym systemie i co zespół powinien z tym zrobić. Jego użytecznym rezultatem nie jest katalog przerażających możliwości. Jest nim zestaw decyzji projektowych i wdrożeniowych powiązanych z architekturą, z właścicielami i dowodami, że wybrane zabezpieczenia działają.
Dla CTO kluczowe pytanie brzmi, czy zespół inżynierski potrafi wyjaśnić, jak ważne właściwości bezpieczeństwa wytrzymują rzeczywiste zachowanie systemu: ponowienia, zadania w tle, uprzywilejowane działania wsparcia technicznego, awarie dostawców i złośliwe dane wejściowe. Diagram sprawia, że te rozmowy stają się konkretne. Utrzymywany model zagrożeń przekształca wnioski w prace wdrożeniowe.
Wytyczne OWASP dotyczące modelowania zagrożeń stanowią użyteczną podstawę: zrozum system, zidentyfikuj zagrożenia, zdecyduj, jak na nie odpowiedzieć, i oceń, czy wykonana praca jest wystarczająca. Opisany poniżej przepływ pracy stosuje to podejście do decyzji inżynierskich.
Zacznijcie od ograniczonej funkcjonalności, takiej jak eksporty danych klientów, inicjowanie płatności czy aktualizacje urządzeń. Modelowanie całej platformy naraz często daje powierzchowne obserwacje, bo nikt nie jest w stanie wystarczająco szczegółowo wyjaśnić każdej zależności.
Określcie zasoby i cele bezpieczeństwa w kategoriach operacyjnych. „Chronić dane klientów” to sformułowanie zbyt ogólne. „Uwierzytelniony użytkownik może eksportować wyłącznie rekordy należące do tenanta, do którego ma uprawnienia” daje zespołowi właściwość, którą można przetestować. Inne cele mogą dotyczyć integralności transakcji, dostępności usługi, odtwarzania lub przypisywania działań administracyjnych konkretnym osobom.
Zidentyfikujcie użytkowników, usługi, magazyny danych, zależności zewnętrzne, punkty wejścia i granice zaufania. Narysujcie ważne przepływy danych, w tym przetwarzanie asynchroniczne i ścieżki administracyjne. Opiszcie przepływy przesyłanymi danymi, mechanizmem uwierzytelniania i kontekstem autoryzacji tam, gdzie wpływają one na analizę.
Granica zaufania oznacza zmianę założeń lub uprawnień, niekoniecznie perymetr sieci. Przeglądarka wywołująca API przekracza jedną granicę. Współdzielony worker działający w imieniu klienta przekracza inną, nawet jeśli obie usługi działają w tym samym klastrze.
W przypadku aplikacji wielodostępnej (multi-tenant) pokażcie, gdzie ustalana jest tożsamość tenanta i jak trafia ona do kontroli autoryzacji, zadań w tle i eksportów. Uwzględnijcie tożsamości usług, dostęp do magazynu obiektów, narzędzia wsparcia i zewnętrzne wywołania zwrotne (callbacki). W przeciwnym razie diagram może opisywać ścieżkę optymistyczną, pomijając ścieżki, które najprawdopodobniej pozwolą obejść izolację.
Zapisujcie założenia oddzielnie od faktów. Założenie „klienci nie mogą zapisywać do kolejki” wymaga potwierdzenia dowodami z konfiguracji. Niewiadome powinny stać się zadaniami wyjaśniającymi, a nie po cichu akceptowanymi zabezpieczeniami.
Metoda dostarcza pytań pomocniczych i struktury. Nie przesądza o tym, które zagrożenia są najważniejsze, nie dowodzi, że projekt jest bezpieczny, i nie zastępuje znajomości systemu.
STRIDE analizuje sześć kategorii. Stosujcie je do odpowiednich komponentów, przepływów i granic, zamiast na siłę przypisywać każdą kategorię każdemu elementowi diagramu.
| Kategoria | Pytanie, które warto zadać | Przykład w usłudze eksportu danych klientów |
|---|---|---|
| Spoofing (podszywanie się) | Czy podmiot może podszyć się pod inną tożsamość? | Callback twierdzi, że pochodzi od zaufanego dostawcy. |
| Tampering (manipulacja) | Czy dane lub instrukcje mogą zostać zmienione bez autoryzacji? | Identyfikator tenanta w zadaniu w kolejce zostaje zmieniony. |
| Repudiation (wypieranie się) | Czy ważne działanie może nie mieć wiarygodnego przypisania? | Eksport wykonany przez wsparcie nie ma zapisu zatwierdzenia z przypisaną osobą. |
| Information disclosure (ujawnienie informacji) | Czy informacje mogą trafić do nieuprawnionej strony? | Link do pobrania ujawnia eksport innego tenanta. |
| Denial of service (odmowa usługi) | Czy podmiot może wyczerpać zasoby lub zakłócić usługę? | Powtarzane eksporty zajmują wszystkie współdzielone workery. |
| Elevation of privilege (podniesienie uprawnień) | Czy podmiot może uzyskać większe uprawnienia? | Zwykły użytkownik wywołuje eksport dostępny tylko dla administratorów. |
Jeden scenariusz może obejmować kilka kategorii. W stosownych przypadkach prowadźcie jeden zapis nadający się do działania, zamiast tworzyć zduplikowane zgłoszenia tylko po to, by zadośćuczynić taksonomii.
PASTA (Process for Attack Simulation and Threat Analysis) oferuje siedmioetapowe, zorientowane na ryzyko podejście, które łączy cele biznesowe, zakres techniczny, dekompozycję, analizę zagrożeń i podatności, modelowanie ataków oraz postępowanie z ryzykiem. Sprawdza się przy pogłębionej analizie, w której zachowanie atakującego i skutki biznesowe wymagają wyraźnej uwagi.
Drzewa ataków zaczynają się od celu atakującego i rozkładają go na alternatywne lub łączone ścieżki. Dla celu „uzyskać eksport innego tenanta” alternatywami mogą być obejście autoryzacji w API, pomylenie kontekstu tenanta w workerze lub kradzież danych uwierzytelniających do pobrania. Relacje AND oznaczają warunki, które muszą wystąpić łącznie; relacje OR oznaczają alternatywy.
VAST (Visual, Agile, and Simple Threat modeling) kładzie nacisk na skalowalne modelowanie z perspektywy aplikacji i operacji. Zespoły, które je rozważają, powinny sprawdzić, czy ich narzędzia i proces wytwarzania oprogramowania pozwolą spójnie utrzymywać te widoki.
Praktycznym punktem wyjścia jest diagram przepływu danych plus STRIDE, a następnie drzewo ataku dla scenariusza o najpoważniejszych skutkach. Więcej metodologii jest użyteczne tylko wtedy, gdy poprawia decyzje.
Zaproście osoby, które rozumieją wdrożenie i eksploatację: programistę, architekta lub lidera technicznego, osobę oceniającą bezpieczeństwo oraz kogoś, kto zna zachowanie środowiska produkcyjnego. Włączcie specjalistów ds. produktu, prywatności lub dostawców, jeśli ich wiedza wpływa na zakres.
Przed sesją roześlijcie diagram, cele bezpieczeństwa, odpowiednią konfigurację i nierozstrzygnięte założenia. W trakcie przeglądu prześledźcie jedno żądanie lub zdarzenie od wejścia do zakończenia. Pytajcie, gdzie zmienia się tożsamość, gdzie dane są utrwalane, co jest ponawiane i który komponent ma uprawnienia do zatwierdzenia danej czynności.
Opisujcie zagrożenia jako scenariusze, a nie etykiety. „Problem z autoryzacją” to za mało. Mocniejsze sformułowanie brzmi: „Uwierzytelniony użytkownik podstawia identyfikator eksportu innego tenanta; endpoint pobierania sprawdza zalogowanie, ale nie własność obiektu, co ujawnia dane klientów”.
Rozdzielcie trzy pojęcia:
Zagrożenie może być warte zbadania, zanim podatność zostanie potwierdzona. Z drugiej strony wykrycie słabości nie dowodzi, że każdy wyobrażalny atak jest wykonalny.
Oprócz ataków zewnętrznych uwzględnijcie nadużycia ze strony uprawnionych użytkowników, uprzywilejowanych osób wewnętrznych, błędy konfiguracji i awarie dostawców. Zapytajcie, co się dzieje, gdy zależność przekracza limit czasu lub zwraca nieoczekiwaną odpowiedź. Z takich dyskusji często wyłaniają się zachowania typu fail-open i niespójne ponowienia.
Poniższy przykład ma charakter poglądowy. Załóżmy, że aplikacja SaaS składa się z klienta przeglądarkowego, API, współdzielonej bazy danych, kolejki zadań, workera eksportu i magazynu obiektów. Użytkownicy tenantów zlecają eksporty CSV; worker generuje pliki, a API wydaje tymczasowe linki do pobrania. Administratorzy wsparcia mają odrębny interfejs do rozwiązywania problemów.
Cele bezpieczeństwa to izolacja tenantów, autoryzowane inicjowanie eksportów, ograniczone zużycie zasobów i przypisywalność działań wsparcia. Załóżmy, że worker ma dostęp do bazy danych na tyle szeroki, by obsługiwać wielu tenantów. Sprawia to, że sposób obsługi kontekstu tenanta staje się kluczową decyzją, a nie drobnym szczegółem implementacyjnym.
W API uwierzytelniony podmiot jest powiązany z dozwolonym członkostwem w tenancie. Identyfikator tenanta podany przez przeglądarkę jest prośbą o wybór, a nie dowodem autoryzacji. API sprawdza członkostwo i uprawnienie do eksportu, zanim utworzy niezmienny rekord zadania zawierający autoryzowanego tenanta, osobę zlecającą i dozwolony zakres eksportu.
Komunikat w kolejce odwołuje się do tego rekordu. Worker weryfikuje zadanie i podczas generowania eksportu wymusza dostęp do danych ograniczony do tenanta. Metadane w magazynie wiążą powstały obiekt z zadaniem i tenantem. Przed wydaniem linku do pobrania API sprawdza uprawnienia bieżącej osoby zgłaszającej żądanie względem tego powiązania.
Ten projekt nadal wymaga wyraźnych decyzji dotyczących odbierania dostępu: czy użytkownik, który po zleceniu eksportu utracił członkostwo, powinien zachować dostęp do gotowego pliku? Zespół musi określić tę zasadę i spójnie ją wdrożyć.
| Scenariusz | Decyzja o postępowaniu | Dowody weryfikacji |
|---|---|---|
| Użytkownik podstawia identyfikator innego tenanta | Wyprowadzanie dozwolonego zakresu z członkostwa po stronie serwera i sprawdzanie własności obiektu | Negatywne testy API z użyciem dwóch tenantów i kilku ról |
| Worker przetwarza niewłaściwy kontekst tenanta | Weryfikacja zadań względem rekordów źródłowych i stosowanie zapytań ograniczonych do tenanta | Testy workera z niezgodnym, brakującym i nieprawidłowo sformatowanym kontekstem |
| Link do pobrania wycieka przez logi lub zgłoszenia do wsparcia | Wykluczenie danych uwierzytelniających z logów i ograniczenie ważności linków stosownie do ekspozycji | Przegląd logowania, testy wygasania linków i przegląd ścieżek dostępu |
| Jeden tenant zalewa kolejkę eksportów | Stosowanie limitów na tenanta, limitów współbieżności i ograniczeń obciążenia | Testy obciążeniowe pokazujące zachowanie usługi przy nadużyciach |
| Pracownicy wsparcia eksportują dane bez rozliczalności | Wymaganie wyraźnej autoryzacji uprzywilejowanej i zdarzeń przypisanych do osób | Testy ról i przejrzane próbki zdarzeń administracyjnych |
Tymczasowe linki wprowadzają okno ekspozycji szczątkowej: w zależności od mechanizmu samo posiadanie linku może umożliwiać dostęp aż do jego wygaśnięcia. Zespół powinien zdecydować, czy jest to akceptowalne dla danych, o które chodzi, czy też pobieranie wymaga uwierzytelnionego pośrednika, który sprawdza bieżące uprawnienia.
Nie zamykajcie modelu po przetestowaniu wyłącznie synchronicznego API. Weryfikujcie opóźnione zadania, ponowienia, anulowane żądania, wygasłe członkostwa, usuniętych tenantów i częściowe awarie. Na przykład ponowione zadanie nie może ponownie wykorzystać obiektu powiązanego z innym tenantem ani opublikować niekompletnego eksportu jako zakończonego sukcesem.
Rezultatem jest przejrzana architektura, rejestr zagrożeń, zadania wdrożeniowe i powiązane wyniki weryfikacji. Nie jest nim sam diagram.
Ustalajcie priorytety prawdopodobnych scenariuszy na podstawie ekspozycji, wpływu, warunków wstępnych i istniejących zabezpieczeń. Odróżniajcie bezpośrednio osiągalny błąd autoryzacji od scenariusza wymagającego kilku niepotwierdzonych kompromitacji. Tam, gdzie to istotne, uwzględniajcie dotknięte dane, zakłócenia usług, skutki finansowe, konsekwencje dla bezpieczeństwa ludzi i trudność odtworzenia.
Stosujcie prostą, spójną skalę, jeśli pomaga zespołowi, ale zapisujcie uzasadnienie oceny. Wynik liczbowy z niewyjaśnionymi danymi wejściowymi tworzy fałszywą precyzję. CVSS może pomóc w ocenie konkretnej podatności; nie zastępuje zrozumienia wpływu biznesowego ani architektonicznego scenariusza nadużycia.
Opcje postępowania obejmują zmianę projektu, ograniczenie ekspozycji, dodanie zabezpieczeń prewencyjnych lub detekcyjnych, rezygnację z danej funkcjonalności lub akceptację pozostałego ryzyka. Umowy z dostawcami mogą rozdzielać odpowiedzialność, ale nie usuwają technicznych trybów awarii.
Ryzyko szczątkowe powinno mieć wskazanego decydenta, uzasadnienie, termin wygaśnięcia lub zdarzenie wyzwalające przegląd oraz ewentualne warunki operacyjne. Zakończenie prac inżynierskich i akceptacja ryzyka to różne decyzje. Zgłoszenie może zostać zamknięte, podczas gdy istotne ryzyko nadal pozostaje.
Dla każdego istotnego scenariusza zapiszcie jego identyfikator, dotknięte komponenty, warunki wstępne, skutek, istniejące zabezpieczenia, sposób postępowania, właściciela i metodę weryfikacji. Powiążcie zapis z wersją architektury i odpowiednimi pracami wdrożeniowymi, aby osoby dokonujące przeglądu wiedziały, który projekt został oceniony.
Przekładajcie sposoby postępowania na testowalne kryteria akceptacji. „Poprawić kontrolę dostępu” to sformułowanie mgliste. „Tenant A nie może zlecić, odpytać, anulować ani pobrać eksportu tenanta B przez żaden obsługiwany endpoint” wskazuje zachowanie, które zespół inżynierski może zweryfikować.
Stosujcie dowody odpowiednie do deklaracji:
Żaden pojedynczy artefakt nie dowodzi całego modelu. Zrzut ekranu ustawienia nie dowodzi, że korzysta z niego każdy worker, a zaliczony test nie potwierdza nieprzetestowanej ścieżki. Dokumentujcie środowisko testowe, zakres, wyniki i ograniczenia.
Modelowanie zagrożeń uzupełnia bezpieczne programowanie, ocenę zależności, skanowanie podatności i testy penetracyjne. Jego szczególnym wkładem jest rozumowanie na poziomie architektury: może ujawnić niebezpieczny podział uprawnień nawet wtedy, gdy poszczególne komponenty nie mają znanych podatności.
Wspólny diagram i ustrukturyzowany rejestr mogą wystarczyć do pierwszego, ukierunkowanego przeglądu. Dedykowane narzędzia stają się przydatne, gdy zespoły potrzebują bibliotek komponentów wielokrotnego użytku, spójnych identyfikatorów, współpracy i niezawodnych powiązań między zagrożeniami a zapisami prac wdrożeniowych.
Oceniajcie, czy narzędzie obsługuje granice zaufania, niestandardowe scenariusze, historię wersji, eksport zapisów, przypisywanie odpowiedzialności i odwołania do dowodów. Automatycznie wygenerowane zagrożenia są punktami do analizy, a nie potwierdzonymi ustaleniami. Długie listy bez kontekstu mogą ukryć tych kilka decyzji, które naprawdę mają znaczenie.
Wsparcie AI może pomóc w przygotowaniu opisów scenariuszy, zasugerować brakujące ścieżki lub porównać zmiany z wcześniejszym modelem. Ludzie dokonujący przeglądu nadal muszą zweryfikować architekturę, wykonalność, pokrycie środkami zaradczymi i ryzyko szczątkowe. Nie umieszczajcie poufnych diagramów ani danych uwierzytelniających w niezatwierdzonych usługach. Generowanie modelu zagrożeń to także coś innego niż wykrywanie w czasie działania; utworzenie modelu nie zapewnia ciągłego monitorowania ani automatycznej naprawy.
Aktualizujcie model przy nowych integracjach, zmianach uwierzytelniania, działaniach uprzywilejowanych, nowych kategoriach danych, ekspozycji sieciowej i istotnych zmianach zależności. Incydent lub nieoczekiwany wynik testu również może unieważnić wcześniejsze założenie.
Różne systemy wymagają różnych akcentów. Aplikacje chmurowe wymagają uwagi w zakresie uprawnień tożsamości i dostępu do warstwy zarządzania. Klientów mobilnych należy traktować jako środowiska kontrolowane przez atakującego, a nie zaufane punkty egzekwowania zasad. Urządzenia podłączone do sieci wprowadzają kwestie dostępu fizycznego, integralności aktualizacji, odtwarzania i potencjalnie bezpieczeństwa ludzi. Funkcje oparte na AI dodają niezaufane treści i granice użycia narzędzi; autoryzacja musi ograniczać działania niezależnie od wyników modelu.
Mierzcie, czy ważne przepływy mają aktualne modele, czy działania o wysokim priorytecie mają dowody weryfikacji, które założenia pozostają nierozstrzygnięte i czy zaakceptowane ryzyka mają zaległe przeglądy. Samo liczenie zagrożeń nagradza ilość, a nie użyteczną analizę. Okresowo proście niezależną osobę o zakwestionowanie jednego krytycznego scenariusza i jego dowodów.
Secani może utrwalić przepływ pracy wokół tych decyzji, modelując odpowiednie systemy i zależności, przypisując właścicieli i osoby dokonujące przeglądu oraz łącząc dowody z wymaganiami, zabezpieczeniami i decyzjami. Nierozstrzygnięte założenia stają się zadaniami; materiały źródłowe i zatwierdzenia ludzi pozostają powiązane z przeglądem. Wszelkie sugestie wspierane przez AI należy sprawdzić przed zatwierdzeniem.
Zacznijcie od jednego krytycznego przepływu danych. Prześledźcie w nim uprawnienia od początku do końca, zidentyfikujcie kilka prawdopodobnych scenariuszy i zakończcie przegląd działaniami z przypisanymi właścicielami oraz jednoznacznymi kryteriami weryfikacji. Zaplanujcie kolejny przegląd wokół zmian architektury, które mogłyby unieważnić te decyzje.
Secani łączy w jednej wspólnej przestrzeni roboczej zakresy, dowody, zadania i agentów AI.
Powiąż krytyczne usługi z celami odtworzenia, zależnościami, ćwiczeniami i działaniami korygującymi, aby plany ciągłości działania odzwierciedlały rzeczywiste możliwości.
Przeglądaj tożsamości, ekspozycję, szyfrowanie, odtwarzanie i logowanie w chmurze na podstawie dowodów powiązanych z faktycznymi kontami, usługami i danymi.
Łącz cykliczne kontrole techniczne z okresową oceną ekspercką, zapewniając jasny zakres pokrycia, sprawność pozyskiwania danych, progi i odpowiedzialność za działania następcze.