Запрос к графу уязвимости предприятия
Используйте граф корпоративной уязвимости в Управление рисками Microsoft Security для упреждающего поиска угроз риска на предприятии при расширенной охоте на портале Microsoft Defender.
В этой статье приведены некоторые примеры, советы и указания для создания запросов в графе воздействия предприятия.
Предварительные условия
- Ознакомьтесь с сведениями об управлении зонами атак.
- Просмотрите необходимые разрешения для работы с графом.
Создание расширенных запросов охоты
- Ознакомьтесь с рекомендациями по созданию расширенных запросов охоты
- Начало работы с язык запросов Kusto (KQL)
Использование оператора make-graph
Оператор Kusto make-graph
загружает данные узлов и ребер в память.
- Так как Kusto загружает только используемые столбцы, явно выбирать столбцы не требуется.
-
NodeProperties
Однако столбец содержит все сведения об узле и поэтому имеет большой размер. - В большинстве сценариев полезно извлекать только необходимые сведения перед их передачей в
make-graph
оператор.
Пример
let FilteredNodes = ExposureGraphNodes
| extend ContainsSensetiveData = NodeProperties has "containsSensitiveData"
| project Id, ContainsSensetiveData, Label, EntityIds, Categories;
Edges
| make-graph SourceNodeId --> TargetNodeId with FilteredNodes on Id
..
Использование динамических столбцов и интеллектуального индексирования
NodeProperties
и Categories
являются динамическими столбцами.
- Kusto знает, что эти столбцы содержат содержимое, похожее на JSON, и применяет интеллектуальное индексирование.
- Однако не все операторы Kusto используют индекс. Например,
set_has_element
,isempty
isnotnull
не используют индекс, если они применяются к динамическому столбцу иisnotnull(Properties["containsSensitiveData"]
не используют индекс. - Вместо этого используйте
has()
оператор , который всегда использует индекс.
Пример
В следующем запросе has
оператор проверяет data
строку, а set_has_element
— элемент data
.
Использование обоих операторов важно, has()
так как оператор возвращает значение true даже для категории prefix_data
.
Categories has('data') and set_has_element(Categories, 'data')
Дополнительные сведения о строковых терминах см. в этой статье.
Примеры запросов на раскрытие
Приведенные ниже примеры помогут вам написать запросы, чтобы понять данные о воздействии безопасности в клиенте.
Вывод списка всех меток узлов в клиенте
Следующий запрос группирует данные в ExposureGraphNodes
таблице и использует оператор Kusto summarize
для их перечисления по .NodeLabel
ExposureGraphNodes
| summarize by NodeLabel
Вывод списка всех меток edge в клиенте
Следующий запрос группирует данные в ExposureGraphEdges
таблице и использует оператор Kusto summarize
для их перечисления по граничным меткам (EdgeLabel
).
ExposureGraphEdges
| summarize by EdgeLabel
Вывод списка всех подключений из указанной метки узла
Следующий запрос группирует данные в ExposureGraphEdges
таблице и, где метка исходного узла — microsoft.compute/virtualmachines
, он суммирует данные виртуальной машины по EdgeLabel
. В нем перечислены ребра, которые подключают ресурсы к виртуальным машинам в графе уязвимости безопасности.
ExposureGraphEdges
| where SourceNodeLabel == "microsoft.compute/virtualmachines"
| summarize by EdgeLabel
Вывод списка всех подключений к определенной метки узла
В следующем запросе приведены ребра, которые подключают виртуальные машины к другим ресурсам графа уязвимости безопасности. Он группирует данные в ExposureGraphEdges
таблице и, где метка целевого узла — microsoft.compute/virtualmachines
, использует оператор Kusto summarize
для перечисления метки целевого узла по .EdgeLabel
ExposureGraphEdges
| where TargetNodeLabel == "microsoft.compute/virtualmachines"
| summarize by EdgeLabel
Список свойств определенной метки узла
В следующем запросе перечислены свойства метки узла виртуальной машины. Он группирует данные в ExposureGraphNodes
таблице, отфильтрованные только для отображения метки узла "microsoft.compute/virtualmachines". При использовании project-keep
оператора запрос сохраняет NodeProperties
столбец. Возвращаемые данные ограничены одной строкой.
ExposureGraphNodes
| where NodeLabel == "microsoft.compute/virtualmachines"
| project-keep NodeProperties
| take 1
Запрос графа экспозиции
Чтобы запросить граф экспозиции, выполните следующие действия:
На портале Microsoft Defender выберите Охота —> расширенная охота.
В области Запрос введите запрос. Используйте схему графа, функции и таблицы операторов или приведенные ниже примеры, чтобы помочь в создании запроса.
Выберите Выполнить запрос.
Примеры запросов, ориентированных на граф
Используйте эти примеры запросов, ориентированные на граф, чтобы помочь вам написать более качественные запросы на защиту. В примерах выполняется поиск шаблонов для предоставления связей между сущностями, которые могут выявить риск. В них показано, как сопоставить контекст с сигналами об инциденте или оповещении.
Вывод списка всех меток узла с ребром до определенной метки узла
Следующий запрос приводит к выводу списка всех меток входящих узлов с соединителем для метки узла виртуальной машины. Он создает структуру графа путем сопоставления SourceNodeId
данных столбца в ExposureGraphEdges
таблице со столбцом TargetNodeId
в ExposureGraphNodes
таблице с оператором make-graph
для построения структуры графа.
Затем оператор используется graph-match
для создания шаблона графа, в котором целевой узел TargetNode
и NodeLabel
совпадают microsoft.compute/virtualmachines
. Оператор project
используется для сохранения только .IncomingNodeLabels
В нем перечислены результаты по .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
Перечисление всех меток узла с окейловой меткой определенного узла
Следующий запрос возвращает список всех исходящих меток узла с соединителем к метке узла виртуальной машины.
- Он создает структуру графа путем сопоставления столбца
SourceNodeId
использует данные вExposureGraphEdges
таблице со столбцомTargetNodeId
вExposureGraphNodes
таблице с помощьюmake-graph
оператора для построения структуры графа. - Затем оператор используется для
graph-match
сопоставления шаблона графа, гдеSourceNode
иNodeLabel
.microsoft.compute/virtualmachines
- Оператор
project
используется для сохранения только .OutgoingNodeLabels
В нем перечислены результаты по .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
Обнаружение виртуальных машин, доступных в Интернете с помощью уязвимости RCE
Следующий запрос позволяет обнаружить виртуальные машины, доступные в Интернете, и уязвимость удаленного выполнения кода (RCE).
- В нем используется
ExposureGraphNodes
таблица схемы. - Если и ,
NodeProperties
и true, он проверяет, что категория (Categories
) является виртуальными машинами (virtual_machine
).vulnerableToRCE
exposedToInternet
ExposureGraphNodes
| where isnotnull(NodeProperties.rawData.exposedToInternet)
| where isnotnull(NodeProperties.rawData.vulnerableToRCE)
| where Categories has "virtual_machine" and set_has_element(Categories, "virtual_machine")
Обнаружение устройств, подключенных к Интернету, с уязвимостью повышения привилегий
Следующий запрос ищет устройства с выходом в Интернет, подверженные уязвимости повышения привилегий, что может предоставить доступ к более высоким уровням привилегий в системе.
- В нем используется
ExposureGraphNodes
таблица схемы. - Если
NodeProperties
используется подключение к Интернету (IsInternetFacing
) иVulnerableToPrivilegeEscalation
, запрос проверяет, являются ли элементы вCategories
действительности устройствами (device
).
ExposureGraphNodes
| where isnotnull(NodeProperties.rawData.IsInternetFacing)
| where isnotnull(NodeProperties.rawData.VulnerableToPrivilegeEscalation)
| where set_has_element(Categories, "device")
Отображение всех пользователей, вошедшего в несколько критически важных устройств
Этот запрос приводит к выводу списка пользователей, вошедшего в несколько критически важных устройств, а также количества устройств, на которые они вошли.
- Она создает таблицу
IdentitiesAndCriticalDevices
с использованиемExposureGraphNodes
данных, отфильтрованных по устройствам с уровнем важности выше 4 или поidentity
. - Затем он создает структуру графа с оператором
make-graph
, гдеEdgeLabel
имеет значениеCan Authenticate As
. - Оператор используется для
graph-match
сопоставления экземпляров, где соответствуетdevice
identity
. - Затем оператор используется
project
для хранения идентификаторов удостоверений и идентификаторов устройств. - Оператор
mv-apply
фильтрует идентификаторы устройств и идентификаторы удостоверений по типу. Он суммирует их и отображает результаты в таблице с заголовками ,Number Of devices user is logged-in to
и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
Отображение клиентских устройств с критической уязвимостью или пользователей, имеющих доступ к серверам с высоким значением
Следующий запрос содержит список устройств с уязвимостями RCE и их идентификаторами устройств, а также устройств с высоким уровнем критических уязвимостей и их идентификаторами устройств.
- Она создает таблицу, включающую
IdentitiesAndCriticalDevices
устройства (device
) с уязвимостями RCE с критичностью ниже четырех и удостоверениями (identity
), которые с помощью фильтрации и сопоставления шаблонов показывают устройства с критическими уязвимостями. - Список фильтруется для отображения только тех подключений, которые имеют метки
Can Authenticate As
ребер и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
Укажите все пути от определенного идентификатора узла к узлу с определенной меткой
В этом запросе отображается путь от определенного IP-узла, который проходит через три ресурса, что приводит к подключению к метке узла виртуальной машины.
- Для создания структуры графа
ExposureGraphNodes
используются таблицы схемы иExposureGraphEdges
make-graph
и операторы иgraph-match
. -
project
С помощью оператора отображается список IP-идентификаторов, свойств IP-адресов, идентификаторов виртуальных машин и свойств виртуальных машин.
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