В рамках Azure Day Labs, который мы проводили в Новосибирске, у меня было очень интересное обсуждение о том, как работает Conditional Access и как можно собирать какие то данные о его работе.
Собственно для анализа каких то данных, у вас они должны быть. Это достаточно очевидно, но по сути это ключевой момент, так как из коробки вы можете получать только ограниченное количество информации через скрипты или другой экспорт данных из интерфейса Sign-in логов. Это может работать в определенных случаях, но не более.
Если же мы хотим иметь больше данных, то нам нужно найти способ экспорта данных куда то, где эти данные можно будет анализировать.
Майкрософт предлагает нам для этого два варианта:
- Интеграция с Azure Log Analytics
- Экспорт данных в стороннюю SIEM систему через Event Hub
Так как я не работал с последним вариантом, то расскажу только про интеграцию с Log Analytics и что мы с этого можем поиметь.
Для начала, нам необходимо создать или использовать существующий Log Analytics Workspace.
После его создания нужно будет зайти в настройки Azure AD и настроить необходимую интеграцию через несколько кликов. Далее данные будут уходить в Log Analytics и будут доступны для анализа. После включения пройдёт около 20 минут прежде чем вы начнёте видеть логи в Log Analytics.

Все теперь вы готовы погружаться в данные. Но если вы никогда не работали с Log Analytics, я крайне советую пройти бесплатный курс на Pluralsight по языку запросов Kusto, который как раз тут необходим.
Готовы? Ну поехали. Теперь специально для Сергея Короткова пойдет немного запросов с картинками.
Самое простое, давайте посмотрим сколько у нас было событий логина за последние 24 часа:
SigninLogs
| summarize count(CorrelationId) by bin(TimeGenerated, 10m)
| render barchart

Это интересно, но теперь давайте добавим разбивку по разным приложениям.
SigninLogs
| summarize count(CorrelationId) by bin(TimeGenerated, 10m), AppDisplayName
| render barchart

Становится интересно, а теперь давайте сопоставим количество успешных и неуспешных логинов из-за Conditional Access политик.
SigninLogs
| where ConditionalAccessStatus == "success" or ConditionalAccessStatus == "failure"
| summarize dcount(UserPrincipalName) by ConditionalAccessStatus, bin(TimeGenerated, 12h)

Кажется у меня проблема и что то идёт не так:) Но продолжим разбираться.
Теперь же приблизимся к более интересному и посмотрим информацию по CA политикам. Тут нужны будут некие махинации, почистить вывод.
SigninLogs
| where ConditionalAccessStatus == "success" or ConditionalAccessStatus == "failure"
//Раскрываем поля
| mv-expand ConditionalAccessPolicies
| extend CAPolicy = ConditionalAccessPolicies["displayName"]
| extend result = ConditionalAccessPolicies["result"]
| extend control = ConditionalAccessPolicies["enforcedGrantControls"]
//Формируем вывод
| summarize dcount(UserPrincipalName) by tostring(CAPolicy),ConditionalAccessStatus
| render barchart kind=stacked100

Тут мы видим соотношение Failure/Success для каждой конкретной политики. Таким образом дальше мы можем копать вглубь и разбираться дальше.
Использование Log Analytics стало для меня реальным спасением в работе с Conditional Access политиками, так как всегда было мало возможностей для аналитики и мониторинга. Очень удобно использование для поиска проблем конкретных пользователей или общих проблем.
Например график ниже был назван “Oh shit graph”, который наглядно показал ситуацию, когда что то пошло не так.

Но постоянно ковырять логи и запускать запросы может быть неудобно. Для наглядности и удобства я вижу следующие варианты визуализации:
- Можно сохранять как панели на заглавной portal.azure.com – подходит для вывода всегда важной информации.
- Использовать в рамках Azure Workbook, где вы можете создать набор графиков и фильтров для отображения конкретной информации, например все для работы с Conditional Access
- Запросы из Log Analytics можно экспортировать в Power BI и строить отчеты там с автоматическим обновлением раз в день.
Graphana– конечно же нет, я же не Антон Мосягин.