Wykonywanie zapytań dotyczących wykresu narażenia przedsiębiorstwa

Użyj wykresu narażenia przedsiębiorstwa w Zarządzanie stopniem zagrożenia bezpieczeństwa przez firmę Microsoft, aby aktywnie wyszukiwać zagrożenia narażenia przedsiębiorstwa w punktach końcowych, środowiskach chmury i infrastrukturach hybrydowych w zaawansowanym wyszukiwaniu w portalu Microsoft Defender. Dzięki integracji usługi Defender dla Chmury w portalu usługi Defender wykres ekspozycji obejmuje teraz typy węzłów w chmurze i jednostki ze środowisk Azure, AWS i GCP.

W poniższych sekcjach przedstawiono przykłady, porady i wskazówki dotyczące konstruowania zapytań na wykresie ekspozycji przedsiębiorstwa.

Wymagania wstępne

Tworzenie zaawansowanych zapytań dotyczących wyszukiwania zagrożeń

Korzystanie z operatora make-graph

Operator Kusto make-graph ładuje do pamięci dane węzłów i krawędzi.

  • Ponieważ usługa Kusto ładuje tylko używane kolumny, nie trzeba jawnie wybierać kolumn.
  • Jednak kolumna NodeProperties zawiera wszystkie informacje o węźle i tak jest duża.
  • W większości przypadków warto wyodrębnić tylko potrzebne informacje przed przekazaniem ich do operatora make-graph.

Przykład

let FilteredNodes = ExposureGraphNodes
| extend ContainsSensetiveData = NodeProperties has "containsSensitiveData"
| project Id, ContainsSensetiveData, Label, EntityIds, Categories;
Edges
| make-graph SourceNodeId --> TargetNodeId with FilteredNodes on Id
..

Używanie kolumn dynamicznych i inteligentnego indeksowania

NodeProperties i Categories to kolumny dynamiczne.

  • Kusto wie, że te kolumny zawierają zawartość podobną do json i stosuje inteligentne indeksowanie.
  • Jednak nie wszystkie operatory Kusto używają indeksu. Na przykład set_has_element, isempty, isnotnull nie używają indeksu, gdy są stosowane do kolumny dynamicznej, a isnotnull(Properties["containsSensitiveData"] nie używa indeksu.
  • Zamiast tego użyj has() operatora, który zawsze używa indeksu.

Przykład

W poniższym zapytaniu operator has sprawdza występowanie ciągu data, a set_has_element sprawdza występowanie elementu data.

Używanie obu operatorów jest ważne, ponieważ operator has() zwraca wartość „true” nawet dla kategorii prefix_data.

Categories has('data') and set_has_element(Categories, 'data')

Dowiedz się więcej o zrozumieniu terminów ciągów.

Przykładowe zapytania dotyczące ekspozycji

Poniższe przykłady mogą pomóc w pisaniu zapytań w celu zrozumienia danych dotyczących ekspozycji na zabezpieczenia w dzierżawie.

Wyświetl wszystkie etykiety węzłów w dzierżawcy

Poniższe zapytanie grupuje dane w tabeli ExposureGraphNodes i używa operatora summarize języka Kusto do wyświetlenia ich według kolumny NodeLabel.

ExposureGraphNodes
| summarize by NodeLabel

Wyświetlanie listy wszystkich etykiet krawędzi w dzierżawie

Poniższe zapytanie grupuje dane w tabeli ExposureGraphEdges i używa operatora summarize języka Kusto do wyświetlenia ich według etykiet krawędzi (EdgeLabel).

ExposureGraphEdges
| summarize by EdgeLabel

Wyświetl listę wszystkich połączeń z określonej etykiety węzła

Poniższe zapytanie grupuje dane w tabeli ExposureGraphEdges, a gdy etykieta węzła źródłowego ma wartość microsoft.compute/virtualmachines, podsumowuje maszyny wirtualne według EdgeLabel. Podsumowuje krawędzie łączące zasoby z maszynami wirtualnymi na grafie narażenia na zabezpieczenia. Dzięki integracji usługi Defender dla Chmury w portalu usługi Defender obejmuje to teraz zasoby w chmurze z wielu środowisk.

ExposureGraphEdges
| where SourceNodeLabel == "microsoft.compute/virtualmachines"
| summarize by EdgeLabel

Wyświetl listę wszystkich połączeń z określoną etykietą węzła

Poniższe zapytanie zawiera podsumowanie krawędzi łączących maszyny wirtualne z innymi zasobami wykresu narażenia na zabezpieczenia. Grupuje dane w tabeli ExposureGraphEdges, a gdy etykieta węzła docelowego ma wartość microsoft.compute/virtualmachines, używa operatora summarize języka Kusto do wyświetlenia etykiety węzła docelowego według EdgeLabel.

ExposureGraphEdges
| where TargetNodeLabel == "microsoft.compute/virtualmachines"
| summarize by EdgeLabel

Wyświetl właściwości określonej etykiety węzła

Poniższe zapytanie zawiera listę właściwości etykiety węzła maszyny wirtualnej. Grupuje dane w tabeli ExposureGraphNodes, przefiltrowane tak, aby wyświetlać tylko wyniki dla etykiety węzła „microsoft.compute/virtualmachines”. Za pomocą project-keep operatora zapytanie przechowuje kolumnę NodeProperties . Zwrócone dane są ograniczone do jednego wiersza. Dzięki integracji usługi Defender dla Chmury w portalu usługi Defender elementy NodeProperties zawierają teraz dodatkowe atrybuty i relacje specyficzne dla chmury.

ExposureGraphNodes
| where NodeLabel == "microsoft.compute/virtualmachines"
| project-keep NodeProperties
| take 1

Przykład: wykonywanie zapytań dotyczących zasobów chmury w wielu środowiskach

Poniższe zapytanie pokazuje, jak wykonywać zapytania dotyczące zasobów w chmurze z różnych środowisk dostępnych teraz przy integracji usługi Defender dla Chmury w portalu usługi Defender:

ExposureGraphNodes
| where NodeLabel contains "microsoft.compute" or NodeLabel contains "aws." or NodeLabel contains "gcp."
| summarize count() by NodeLabel
| order by count_ desc

Wykonywanie zapytań dotyczących wykresu ekspozycji

Aby wykonać zapytanie dotyczące wykresu narażenia:

  1. W portalu Microsoft Defender wybierz pozycję Wyszukiwanie zagrożeń > zaawansowane wyszukiwanie zagrożeń.

  2. W obszarze Zapytanie wpisz zapytanie. Użyj schematu grafu, funkcji i tabel operatorów lub poniższych przykładów, aby ułatwić tworzenie zapytania.

  3. Wybierz Uruchom zapytanie.

Przykłady zapytań zorientowanych na grafy

Użyj tych przykładów zapytań zorientowanych na grafy, aby ułatwić pisanie zapytań dotyczących lepszej ekspozycji na zabezpieczenia. W przykładach wyszukiwane są wzorce umożliwiające uwidocznienie relacji między jednostkami, które mogą odkryć ryzyko. Pokazują one, jak skorelować kontekst z sygnałami zdarzenia/alertu.

Wyświetlanie listy wszystkich etykiet węzłów z krawędzią do określonej etykiety węzła

Poniższe zapytanie powoduje wyświetlenie listy wszystkich etykiet węzłów przychodzących z łącznikiem do etykiety węzła maszyny wirtualnej. Tworzy strukturę grafu, mapując dane z kolumny SourceNodeId w tabeli ExposureGraphEdges na kolumnę TargetNodeId w tabeli ExposureGraphNodes za pomocą operatora make-graph.

Następnie używa operatora graph-match, aby utworzyć wzorzec grafu, w którym węzeł docelowy TargetNode i NodeLabel odpowiadają microsoft.compute/virtualmachines. Operator project służy do przechowywania tylko obiektu IncomingNodeLabels. Wyświetla wyniki według kryterium IncomingNodeLabels.

ExposureGraphEdges
| make-graph SourceNodeId --> TargetNodeId with ExposureGraphNodes
on NodeId
| graph-match (SourceNode)-[edges]->(TargetNode)
       where TargetNode.NodeLabel == "microsoft.compute/virtualmachines"
       project IncomingNodeLabels = SourceNode.NodeLabel 
| summarize by IncomingNodeLabels

Wyświetl wszystkie etykiety węzłów sąsiadujące z określoną etykietą węzła

Poniższe zapytanie powoduje wyświetlenie listy wszystkich etykiet węzłów wychodzących z łącznikiem do etykiety węzła maszyny wirtualnej.

  • Tworzy strukturę grafu poprzez mapowanie kolumny SourceNodeId, używającej danych z tabeli ExposureGraphEdges, na kolumnę TargetNodeId w tabeli ExposureGraphNodes za pomocą operatora make-graph.
  • Następnie używa operatora graph-match do dopasowania wzorca grafu, w którym SourceNode i NodeLabel dopasowują się do microsoft.compute/virtualmachines.
  • Operator project służy do przechowywania tylko obiektu OutgoingNodeLabels. Wyświetla wyniki według kryterium OutgoingNodeLabels.
ExposureGraphEdges
| make-graph SourceNodeId --> TargetNodeId with ExposureGraphNodes
on NodeId
| graph-match (SourceNode)-[edges]->(TargetNode)
       where SourceNode.NodeLabel == "microsoft.compute/virtualmachines"
       project OutgoingNodeLabels = SourceNode.NodeLabel 
| summarize by OutgoingNodeLabels

Odkryj maszyny wirtualne dostępne z Internetu z podatnością RCE

Poniższe zapytanie umożliwia odnajdywanie maszyn wirtualnych uwidocznionych w Internecie oraz luki w zabezpieczeniach zdalnego wykonywania kodu (RCE) w środowiskach chmury.

  • Używa tabeli schematu ExposureGraphNodes .
  • Gdy obie NodePropertiesexposedToInternet wartości i vulnerableToRCE są prawdziwe, sprawdza, czy kategoria (Categories) to maszyny wirtualne (virtual_machine).
  • Dzięki integracji usługi Defender dla Chmury w portalu usługi Defender obejmuje to teraz maszyny wirtualne ze środowisk Azure, AWS i GCP.
ExposureGraphNodes
| where isnotnull(NodeProperties.rawData.exposedToInternet)
| where isnotnull(NodeProperties.rawData.vulnerableToRCE)
| where Categories has "virtual_machine" and set_has_element(Categories, "virtual_machine")

Przykład: znajdowanie hybrydowych ścieżek ataku między zasobami w chmurze i zasobami lokalnymi

Poniższe zapytanie pokazuje, jak zidentyfikować potencjalne ścieżki ataku hybrydowego przy użyciu integracji usługi Defender dla Chmury w portalu usługi Defender:

let CloudAssets = ExposureGraphNodes
| where Categories has "virtual_machine" and (NodeLabel contains "microsoft.compute" or NodeLabel contains "aws." or NodeLabel contains "gcp.");
let OnPremAssets = ExposureGraphNodes
| where Categories has "device" and not(NodeLabel contains "microsoft.compute" or NodeLabel contains "aws." or NodeLabel contains "gcp.");
ExposureGraphEdges
| make-graph SourceNodeId --> TargetNodeId with ExposureGraphNodes on NodeId
| graph-match (CloudVM)-[edge1]->(Identity)-[edge2]->(OnPremDevice)
       where set_has_element(CloudVM.Categories, "virtual_machine") and 
             (CloudVM.NodeLabel contains "microsoft.compute" or CloudVM.NodeLabel contains "aws." or CloudVM.NodeLabel contains "gcp.") and
             set_has_element(Identity.Categories, "identity") and
             set_has_element(OnPremDevice.Categories, "device") and
             not(OnPremDevice.NodeLabel contains "microsoft.compute" or OnPremDevice.NodeLabel contains "aws." or OnPremDevice.NodeLabel contains "gcp.")
       project CloudVMName=CloudVM.NodeName, IdentityName=Identity.NodeName, OnPremDeviceName=OnPremDevice.NodeName

Wykrywanie urządzeń dostępnych z internetu z luką umożliwiającą eskalację uprawnień

Poniższe zapytanie szuka urządzeń dostępnych z Internetu narażonych na lukę w zabezpieczeniach dotyczącą eskalacji uprawnień, która może zezwalać na dostęp do uprawnień wyższego poziomu w systemie.

  • Używa tabeli schematu ExposureGraphNodes .
  • Gdy NodeProperties jest dostępne z internetu (IsInternetFacing) i VulnerableToPrivilegeEscalation, zapytanie sprawdza, czy elementy w Categories są faktycznie urządzeniami (device).
ExposureGraphNodes
| where isnotnull(NodeProperties.rawData.IsInternetFacing)
| where isnotnull(NodeProperties.rawData.VulnerableToPrivilegeEscalation)
| where set_has_element(Categories, "device")

Pokaż wszystkich użytkowników zalogowanych na więcej niż jednym urządzeniu krytycznym

To zapytanie powoduje wyświetlenie listy użytkowników zalogowanych na więcej niż jednym urządzeniu krytycznym wraz z liczbą urządzeń, na których są zalogowani.

  • Tworzy tabelę IdentitiesAndCriticalDevices z użyciem danych ExposureGraphNodes filtrowanych albo według urządzeń o poziomie krytyczności powyżej 4, albo według identity.
  • Następnie tworzy strukturę grafu z operatorem make-graph , gdzie EdgeLabel jest Can Authenticate As.
  • Używa operatora graph-match do dopasowywania wystąpień, w których element device jest zgodny z elementem identity.
  • Następnie używa operatora project do zachowania identyfikatorów tożsamości i identyfikatorów urządzeń.
  • Operator mv-apply filtruje identyfikatory urządzeń i identyfikatory tożsamości według typu. Podsumowuje je i wyświetla wyniki w tabeli z nagłówkami , Number Of devices user is logged-in toi User Id.
let IdentitiesAndCriticalDevices = ExposureGraphNodes
| where
 // Critical Device
 (set_has_element(Categories, "device") and isnotnull(NodeProperties.rawData.criticalityLevel) and NodeProperties.rawData.criticalityLevel.criticalityLevel > 4)
 // or identity
 or set_has_element(Categories, "identity");
ExposureGraphEdges
| where EdgeLabel == "Can Authenticate As"
| make-graph SourceNodeId --> TargetNodeId with IdentitiesAndCriticalDevices on NodeId
| graph-match (Device)-[canConnectAs]->(Identity)
       where set_has_element(Identity.Categories, "identity") and set_has_element(Device.Categories, "device")
       project IdentityIds=Identity.EntityIds, DeviceIds=Device.EntityIds
| mv-apply DeviceIds on (
    where DeviceIds.type == "DeviceInventoryId")
| mv-apply IdentityIds on (
    where IdentityIds.type == "SecurityIdentifier")
| summarize NumberOfDevicesUserLoggedinTo=count() by tostring(IdentityIds.id)
| where NumberOfDevicesUserLoggedinTo > 1
| project ["Number Of devices user is logged-in to"]=NumberOfDevicesUserLoggedinTo, ["User Id"]=IdentityIds_id

Pokaż urządzenia klienckie z krytyczną luką w zabezpieczeniach/użytkownikami, którzy mają dostęp do serwerów o wysokiej wartości

Poniższe zapytanie powoduje wyświetlenie listy urządzeń z lukami w zabezpieczeniach RCE oraz ich identyfikatorów urządzeń oraz urządzeń z wysokimi krytycznymi lukami w zabezpieczeniach i identyfikatorami urządzeń.

  • Tworzy IdentitiesAndCriticalDevices tabelę zawierającą urządzenia (device) z lukami RCE o poziomie krytyczności niższym niż cztery oraz tożsamości (identity), które dzięki filtrowaniu i dopasowywaniu wzorców wskazują urządzenia z krytycznymi lukami w zabezpieczeniach.
  • Lista jest filtrowana tak, aby wyświetlała tylko te połączenia, które mają etykiety krawędzi Can Authenticate As i CanRemoteInteractiveLogonTo.
let IdentitiesAndCriticalDevices = ExposureGraphNodes // Reduce the number of nodes to match
| where 
 // Critical devices & devices with RCE vulnerabilities
 (set_has_element(Categories, "device") and 
    (
        // Critical devices
        (isnotnull(NodeProperties.rawData.criticalityLevel) and NodeProperties.rawData.criticalityLevel.criticalityLevel < 4)
        or 
        // Devices with RCE vulnerability
        isnotnull(NodeProperties.rawData.vulnerableToRCE)
    )
  )
 or 
 // identity
 set_has_element(Categories, "identity");
ExposureGraphEdges
| where EdgeLabel in~ ("Can Authenticate As", "CanRemoteInteractiveLogonTo") // Reduce the number of edges to match
| make-graph SourceNodeId --> TargetNodeId with IdentitiesAndCriticalDevices on NodeId
| graph-match (DeviceWithRCE)-[CanConnectAs]->(Identity)-[CanRemoteLogin]->(CriticalDevice)
       where 
             CanConnectAs.EdgeLabel =~ "Can Authenticate As" and
             CanRemoteLogin.EdgeLabel =~ "CanRemoteInteractiveLogonTo" and
             set_has_element(Identity.Categories, "identity") and 
             set_has_element(DeviceWithRCE.Categories, "device") and isnotnull(DeviceWithRCE.NodeProperties.rawData.vulnerableToRCE) and
             set_has_element(CriticalDevice.Categories, "device") and isnotnull(CriticalDevice.NodeProperties.rawData.criticalityLevel)
       project DeviceWithRCEIds=DeviceWithRCE.EntityIds, DeviceWithRCEName=DeviceWithRCE.NodeName, CriticalDeviceIds=CriticalDevice.EntityIds, CriticalDeviceName=CriticalDevice.NodeName

Podaj wszystkie ścieżki z określonego identyfikatora węzła do węzła z określoną etykietą

To zapytanie wyświetla ścieżkę z określonego węzła IP, prowadzącą przez maksymalnie trzy zasoby aż do połączenia z węzłem oznaczonym etykietą maszyny wirtualnej.

  • Wykorzystuje tabele schematu ExposureGraphNodes i ExposureGraphEdges oraz operatory make-graph i graph-match, aby utworzyć strukturę grafu.
  • Za pomocą operatora project wyświetlana jest lista identyfikatorów adresów IP, właściwości adresów IP, identyfikatorów maszyn wirtualnych i właściwości maszyn wirtualnych.
let IPsAndVMs = ExposureGraphNodes
| where (set_has_element(Categories, "ip_address") or set_has_element(Categories, "virtual_machine"));
ExposureGraphEdges
| make-graph SourceNodeId --> TargetNodeId with IPsAndVMs on NodeId
| graph-match (IP)-[anyEdge*1..3]->(VM)
       where set_has_element(IP.Categories, "ip_address") and set_has_element(VM.Categories, "virtual_machine")
       project IpIds=IP.EntityIds, IpProperties=IP.NodeProperties.rawData, VmIds=VM.EntityIds, VmProperties=VM.NodeProperties.rawData

Następne kroki

Zapoznaj się z mapą obszaru ataków.