Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Используйте граф рисков организации в Microsoft Security Exposure Management, чтобы заблаговременно выявлять угрозы, связанные с рисками организации, на конечных устройствах, в облачных средах и гибридных инфраструктурах с помощью средства расширенного поиска на портале Microsoft Defender. Благодаря интеграции Defender для облака на портале Defender граф экспозиции теперь включает типы и сущности облачных узлов из сред Azure, AWS и GCP.
В этой статье приведены некоторые примеры, советы и указания для создания запросов в графе воздействия предприятия.
Предварительные условия
- Ознакомьтесь с сведениями об управлении зонами атак.
- Просмотрите необходимые разрешения для работы с графом.
Создавайте запросы для расширенного поиска
- Ознакомьтесь с рекомендациями по созданию расширенных запросов охоты
- Начало работы с язык запросов Kusto (KQL)
Использование оператора 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
Запросить граф экспозиции
Чтобы запросить граф экспозиции, выполните следующие действия:
На портале 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оператора для построения структуры графа. - Затем для сопоставления шаблона графа, в котором
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