Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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
- 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 praktykami dotyczącymi tworzenia zaawansowanych zapytań wyszukiwania zagrożeń
- Rozpocznij pracę z językiem zapytań Kusto (KQL)
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
NodePropertieszawiera 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,isnotnullnie używają indeksu, gdy są stosowane do kolumny dynamicznej, aisnotnull(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:
W portalu 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 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 tabeliExposureGraphEdges, na kolumnęTargetNodeIdw tabeliExposureGraphNodesza pomocą operatoramake-graph. - Następnie używa operatora
graph-matchdo dopasowania wzorca grafu, w którymSourceNodeiNodeLabeldopasowują się domicrosoft.compute/virtualmachines. - Operator
projectsłuży do przechowywania tylko obiektuOutgoingNodeLabels. Wyświetla wyniki według kryteriumOutgoingNodeLabels.
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
NodePropertiesexposedToInternetwartości ivulnerableToRCEsą 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
NodePropertiesjest dostępne z internetu (IsInternetFacing) iVulnerableToPrivilegeEscalation, zapytanie sprawdza, czy elementy wCategoriessą 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ę
IdentitiesAndCriticalDevicesz użyciem danychExposureGraphNodesfiltrowanych albo według urządzeń o poziomie krytyczności powyżej 4, albo wedługidentity. - Następnie tworzy strukturę grafu z operatorem
make-graph, gdzieEdgeLabeljestCan Authenticate As. - Używa operatora
graph-matchdo dopasowywania wystąpień, w których elementdevicejest zgodny z elementemidentity. - Następnie używa operatora
projectdo zachowania identyfikatorów tożsamości i identyfikatorów urządzeń. - Operator
mv-applyfiltruje 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 toiUser 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
IdentitiesAndCriticalDevicestabelę 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 AsiCanRemoteInteractiveLogonTo.
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
ExposureGraphNodesiExposureGraphEdgesoraz operatorymake-graphigraph-match, aby utworzyć strukturę grafu. - Za pomocą operatora
projectwyś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