Wykonywanie zapytań dotyczących wykresu narażenia przedsiębiorstwa
Użyj wykresu narażenia przedsiębiorstwa w usłudze Microsoft Security Exposure Management , aby proaktywnie wyszukiwać zagrożenia narażenia przedsiębiorstwa w zaawansowanym wyszukiwaniu zagrożeń w portalu usługi Microsoft Defender.
Ten artykuł zawiera kilka przykładów, porad i wskazówek dotyczących konstruowania zapytań na grafie narażenia przedsiębiorstwa.
Usługa Security Exposure Management jest obecnie dostępna w publicznej wersji zapoznawczej.
Ważna
Niektóre informacje zawarte w tym artykule odnoszą się do wersji wstępnej produktu, który może zostać znacznie zmodyfikowany do czasu wydania wersji komercyjnej. Firma Microsoft nie udziela żadnych gwarancji, wyrażonych ani dorozumianych, w odniesieniu do informacji podanych tutaj.
Wymagania wstępne
- Przeczytaj o zarządzaniu obszarami ataków.
- Przejrzyj wymagane uprawnienia do pracy z wykresem.
Tworzenie zaawansowanych zapytań dotyczących wyszukiwania zagrożeń
- Zapoznaj się z najlepszymi rozwiązaniami dotyczącymi tworzenia zaawansowanych zapytań dotyczących zagrożeń
- Wprowadzenie do języka zapytań Kusto (KQL)
Korzystanie z operatora make-graph
Operator kusto make-graph
ładuje węzły i krawędzie danych do pamięci.
- 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 scenariuszy warto wyodrębnić tylko informacje wymagane przed wprowadzeniem ich do
make-graph
operatora.
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ą one stosowane do kolumny dynamicznej iisnotnull(Properties["containsSensitiveData"]
nie używają indeksu. - Zamiast tego użyj
has()
operatora, który zawsze używa indeksu.
Przykład
W poniższym zapytaniu has
operator sprawdza data
ciąg i set_has_element
sprawdza data
element.
Używanie obu operatorów jest ważne, has()
ponieważ operator 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świetlanie listy wszystkich etykiet węzłów w dzierżawie
Poniższe zapytanie grupuje dane w tabeli i używa operatora Kusto summarize
do wyświetlenia ich w NodeLabel
kolumnie ExposureGraphNodes
.
ExposureGraphNodes
| summarize by NodeLabel
Wyświetlanie listy wszystkich etykiet krawędzi w dzierżawie
Poniższe zapytanie grupuje dane w ExposureGraphEdges
tabeli i używa operatora kusto do wyświetlania summarize
ich na liście 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 ExposureGraphEdges
tabeli, a gdzie etykieta węzła źródłowego to microsoft.compute/virtualmachines
, podsumowuje maszynę wirtualną według EdgeLabel
. Podsumowuje krawędzie łączące zasoby z maszynami wirtualnymi na grafie narażenia na zabezpieczenia.
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 ona dane w ExposureGraphEdges
tabeli i gdzie etykieta węzła docelowego to microsoft.compute/virtualmachines
, używa operatora Kusto do wyświetlenia etykiety węzła summarize
docelowego według EdgeLabel
.
ExposureGraphEdges
| where TargetNodeLabel == "microsoft.compute/virtualmachines"
| summarize by EdgeLabel
Wyświetlanie listy 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 ona dane w ExposureGraphNodes
tabeli, filtrowane w celu wyświetlenia tylko wyników etykiety węzła "microsoft.compute/virtualmachines". Za pomocą project-keep
operatora zapytanie przechowuje kolumnę NodeProperties
. Zwrócone dane są ograniczone do jednego wiersza.
ExposureGraphNodes
| where NodeLabel == "microsoft.compute/virtualmachines"
| project-keep NodeProperties
| take 1
Wykonywanie zapytań dotyczących wykresu ekspozycji
Aby wykonać zapytanie dotyczące wykresu narażenia:
W portalu usługi Microsoft Defender wybierz pozycję Wyszukiwanie zagrożeń —> zaawansowane wyszukiwanie zagrożeń.
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.
Wybierz pozycję 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 przez mapowanie SourceNodeId
danych kolumn w ExposureGraphEdges
tabeli na TargetNodeId
kolumnę w ExposureGraphNodes
tabeli za pomocą make-graph
operatora w celu utworzenia struktury grafów.
Następnie używa graph-match
operatora do utworzenia wzorca grafu, w którym węzeł TargetNode
docelowy jest zgodny microsoft.compute/virtualmachines
z NodeLabel
. Operator project
służy do przechowywania tylko obiektu IncomingNodeLabels
. Wyświetla wyniki według 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 listę wszystkich etykiet węzłów, które tworzy etykietę określonego 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ę grafów przez mapowanie
SourceNodeId
kolumny, która używa danych wExposureGraphEdges
tabeli doTargetNodeId
kolumny wExposureGraphNodes
tabeli przy użyciumake-graph
operatora w celu utworzenia struktury grafu. - Następnie używa
graph-match
operatora do dopasowania wzorca wykresu do miejscaSourceNode
iNodeLabel
dopasowaniamicrosoft.compute/virtualmachines
. - Operator
project
służy do przechowywania tylko obiektuOutgoingNodeLabels
. Wyświetla wyniki wedługOutgoingNodeLabels
.
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
Odnajdywanie maszyn wirtualnych uwidocznionych w Internecie z luką w zabezpieczeniach RCE
Poniższe zapytanie umożliwia odnajdywanie maszyn wirtualnych uwidocznionych w Internecie i luki w zabezpieczeniach zdalnego wykonywania kodu (RCE).
- Używa tabeli schematu
ExposureGraphNodes
. - Gdy obie
NodeProperties
exposedToInternet
wartości ivulnerableToRCE
są prawdziwe, sprawdza, czy kategoria (Categories
) to maszyny wirtualne (virtual_machine
).
ExposureGraphNodes
| where isnotnull(NodeProperties.rawData.exposedToInternet)
| where isnotnull(NodeProperties.rawData.vulnerableToRCE)
| where Categories has "virtual_machine" and set_has_element(Categories, "virtual_machine")
Odnajdywanie urządzeń z Dostępem do Internetu z luką w zabezpieczeniach dotyczącą eskalacji 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
zapytanie ma połączenie z Internetem (IsInternetFacing
) iVulnerableToPrivilegeEscalation
, sprawdza, czy elementy w programie są faktycznieCategories
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
przy użyciuExposureGraphNodes
danych filtrowanych według urządzeń o poziomie krytyczności powyżej 4 lub .identity
- Następnie tworzy strukturę grafu z operatorem
make-graph
, gdzieEdgeLabel
jestCan Authenticate As
. - Używa
graph-match
operatora do dopasowania wystąpień, wdevice
których element jest zgodny z elementemidentity
. - Następnie używa
project
operatora do przechowywania 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 to
iUser 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 tabelę zawierającą
IdentitiesAndCriticalDevices
urządzenia (device
) z lukami w zabezpieczeniach RCE o krytycznym znaczeniu niższym niż cztery oraz tożsamości (identity
), które za pomocą filtrowania i dopasowywania wzorców pokazują urządzenia z krytycznymi lukami w zabezpieczeniach. - Lista jest filtrowana w celu wyświetlenia tylko tych połączeń, które mają etykiety
Can Authenticate As
krawędzi iCanRemoteInteractiveLogonTo
.
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, przechodząc przez maksymalnie trzy zasoby, które skutkują połączeniem z etykietą węzła maszyny wirtualnej.
-
ExposureGraphNodes
Używa ona tabel iExposureGraphEdges
schematówmake-graph
oraz operatorów igraph-match
do utworzenia struktury grafów. -
project
Operator wyświetla listę identyfikatorów IP, właściwości adresów IP, identyfikatorów maszyn wirtualnych i właściwości maszyny wirtualnej.
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