Запрос к графу уязвимости предприятия

Используйте граф рисков организации в Microsoft Security Exposure Management, чтобы заблаговременно выявлять угрозы, связанные с рисками организации, на конечных устройствах, в облачных средах и гибридных инфраструктурах с помощью средства расширенного поиска на портале Microsoft Defender. Благодаря интеграции Defender для облака на портале Defender граф экспозиции теперь включает типы и сущности облачных узлов из сред Azure, AWS и GCP.

В этой статье приведены некоторые примеры, советы и указания для создания запросов в графе воздействия предприятия.

Предварительные условия

Создавайте запросы для расширенного поиска

Использование оператора make-graph

Оператор make-graph в Kusto загружает в память данные узлов и рёбер.

  • Так как 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, isemptyisnotnull не используют индекс, если они применяются к динамическому столбцу и 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

Перечислите все граничные метки в вашем арендаторе

Следующий запрос группирует данные в ExposureGraphEdges таблице и использует оператор Kusto summarize для их перечисления по граничным меткам (EdgeLabel).

ExposureGraphEdges
| summarize by EdgeLabel

Вывод списка всех подключений из указанной метки узла

Следующий запрос группирует данные в ExposureGraphEdges таблице и, где метка исходного узла — microsoft.compute/virtualmachines, он суммирует данные виртуальной машины по EdgeLabel. В нем представлена сводка по ребрам, которые соединяют активы с виртуальными машинами в графе подверженности угрозам. Интеграция Defender для облака на портале Defender теперь включает облачные ресурсы из нескольких сред.

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 столбец. Возвращаемые данные ограничены одной строкой. Благодаря интеграции Defender для облака на портале Defender свойства NodeProperties теперь включают в себя дополнительные атрибуты и связи, относящиеся к облаку.

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

Пример. Запрос облачных ресурсов в нескольких средах

В следующем запросе показано, как запрашивать облачные ресурсы из разных сред, доступных теперь с интеграцией Defender для облака на портале Defender:

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

Запросить граф экспозиции

Чтобы запросить граф экспозиции, выполните следующие действия:

  1. На портале Microsoft Defender выберите Охота —> расширенная охота.

  2. В области Запрос введите запрос. Используйте схему графа, функции и таблицы операторов или приведенные ниже примеры, чтобы помочь в создании запроса.

  3. Выберите Выполнить запрос.

Примеры запросов, ориентированных на граф

Используйте эти примеры графовых запросов, чтобы писать более качественные запросы для анализа рисков безопасности. В примерах выполняется поиск закономерностей, чтобы выявить связи между сущностями, которые могут указывать на риск. В них показано, как сопоставить контекст с сигналами об инциденте или оповещении.

Список всех меток узлов с ребром к конкретной метке узла

Следующий запрос возвращает список меток всех входящих узлов, имеющих соединение с меткой узла виртуальной машины. Он создает структуру графа путем сопоставления 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 оператора для построения структуры графа.
  • Затем для сопоставления шаблона графа, в котором SourceNode и NodeLabel соответствуют microsoft.compute/virtualmachines, используется оператор graph-match.
  • Оператор 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 таблица схемы.
  • Когда и NodePropertiesexposedToInternet, и vulnerableToRCE истинны, проверяется, что категория (Categories) — виртуальные машины (virtual_machine).
  • Интеграция Defender для облака на портале Defender теперь включает виртуальные машины из сред Azure, AWS и GCP.
ExposureGraphNodes
| where isnotnull(NodeProperties.rawData.exposedToInternet)
| where isnotnull(NodeProperties.rawData.vulnerableToRCE)
| where Categories has "virtual_machine" and set_has_element(Categories, "virtual_machine")

Пример. Поиск путей гибридной атаки между облачными и локальными ресурсами

В следующем запросе показано, как определить потенциальные пути гибридных атак с помощью интеграции Defender для облака на портале 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

Обнаружение устройств, подключенных к Интернету, с уязвимостью повышения привилегий

Следующий запрос ищет устройства с выходом в Интернет, подверженные уязвимости повышения привилегий, что может предоставить доступ к более высоким уровням привилегий в системе.

  • Он использует таблицу схемы 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

Дальнейшие действия

Изучите карту направлений атаки.