Соединители CCF-пуш от Microsoft Sentinel (в предварительной версии) — инструкция по началу работы

Это руководство поможет вам понять, создать и внедрить безкодовые соединители, основанные на push-уведомлениях для Microsoft Sentinel с помощью Push Codeless Connector Framework (CCF) (предварительная версия).

Что такое CCF push?

Соединители push-уведомлений CCF позволяют приложениям отправлять события безопасности непосредственно в Microsoft Sentinel в режиме реального времени. В отличие от традиционных соединителей на основе опроса, которые периодически извлекают данные из API, пуш-соединители позволяют отправлять данные в Sentinel по мере возникновения событий в вашей системе.

CCF Push обеспечивает несколько ключевых преимуществ:

  • Управляемый приложением поток данных: Приложение управляет тем, когда и как отправлять данные, обеспечивая интеллектуальные стратегии пакетной обработки и оптимизированное использование сети.
  • Прием в режиме реального времени: Немедленно отправлять данные по мере выполнения событий, не ожидая интервалов опроса.
  • Упрощенная архитектура: Нет необходимости поддерживать конечные точки API для Sentinel для опроса.
  • Подготовка на основе шаблона: Развертывание создает шаблоны ARM для DCRs, пользовательских таблиц, регистрации приложений Entra и секретов клиента — вы получите сведения о подключении для настройки в вашем приложении отправки.
  • Безопасная проверка подлинности: Использует приложения Microsoft Entra с OAuth 2.0 для безопасной отправки данных.

Необходимые условия

  • Перед началом работы необходимо получить доступ к репозиторию Azure-Sentinel GitHub для средств упаковки.
  • Разрешения Microsoft Entra:
    • Разрешение на создание регистрации приложения в Microsoft Entra ID. Обычно требуется роль разработчика приложений Entra ID или выше.
    • Разрешение на создание приложения с секретами. Если вы не предоставите это разрешение, соединитель выдает ошибку по соображениям безопасности.
    • Издатель должен иметь роль, соответствующую для получения токенов из приложения Microsoft Entra. Эти маркеры необходимы для проверки подлинности запросов к конечной точке сбора данных (DCE), которая является конечной точкой, в которой соединитель в конечном итоге отправляет свои данные. Если поставщик не может получить маркеры, данные не могут быть отправлены в DCE.
  • Разрешения Microsoft Azure:
    • Разрешение на назначение роли издателя метрик мониторинга в правиле сбора данных (DCR). Обычно требуется роль владельца Azure RBAC или администратора пользовательского доступа.

Как работает push-отправка CCF

Модель отправки и модель извлечения

Понимание разницы между моделями приема данных «push» и «pull» помогает выбрать подходящий тип соединителя для конкретного сценария.

Соединители извлечения CCF — на основе опроса:

В модели извлечения Microsoft Sentinel периодически опрашивает ваш API, чтобы получить данные.

  • Microsoft Sentinel инициирует подключения к API источника данных в настроенном расписании.
  • Данные поступают в регулярные интервалы опроса, например каждые пять минут.
  • Необходимо поддерживать общедоступную конечную точку API.
  • Инфраструктура опроса Sentinel управляет процессом сбора данных.

Событийно-ориентированные push-соединители CCF:

В модели отправки приложение отправляет данные непосредственно в Microsoft Sentinel:

  • Приложение инициирует отправку данных при возникновении событий.
  • Данные поступают почти в режиме реального времени по мере их генерации.
  • Вам не нужно поддерживать конечную точку API.
  • Приложение управляет пакетной обработкой, временем и оптимизацией потока данных.

Поток push-данных

Поток push-данных CCF состоит из пяти основных этапов:

  1. Вы разворачиваете коннектор в Microsoft Sentinel.

  2. Azure автоматически создает следующие ресурсы:

    • Приложение Microsoft Entra с учетными данными
    • Правило сбора данных (DCR) — определяет способ обработки данных
    • Конечная точка сбора данных (DCE) — URL-адрес, в котором отправляются данные.
    • Настраиваемая таблица журналов — место хранения данных
    • Назначения ролей — разрешения для приложения Entra
  3. Вы получите следующие сведения о подключении:

    • Идентификатор арендатора
    • Идентификатор приложения (клиента)
    • Секрет клиента
    • URI DCE (URL-адрес конечной точки)
    • Неизменяемый идентификатор DCR
    • Имя потока
  4. Приложение отправляет следующие данные:

    • Получает токен OAuth 2.0, используя сгенерированные CCF учетные данные приложения Entra. Дополнительные сведения см. в потоке учетных данных клиента OAuth 2.0
    • Форматирует события в формате JSON, соответствующий схеме таблицы
    • Передает данные на конечную точку DCE
  5. Azure обрабатывает и хранит данные:

    • Контроллеры домена преобразуют данные (необязательные преобразования KQL)
    • Данные записываются в настраиваемую таблицу в Log Analytics
    • Данные доступны для запросов, аналитики и оповещений в Sentinel

Артефакты push-уведомлений CCF

Решение соединителя push-уведомлений CCF состоит из четырех основных компонентов:

  • Определение настраиваемой таблицы
  • Правило сбора данных (DCR)
  • Определение соединителя (пользовательский интерфейс)
  • Конфигурация push-соединителя

Определение настраиваемой таблицы

Что это такое: Схема, определяющая структуру данных в Log Analytics.

Ключевые требования:

  • Имя таблицы должно заканчиваться с помощью _CL пользовательского суффикса журнала.
  • Должен включать TimeGenerated столбец (тип datetime).
  • Типы столбцов: строка, int, long, real, bool, datetime, dynamic, guid.
  • Используйте версию API 2025-07-01 или более позднюю.
  • Дополнительные сведения см. в статье "Создание настраиваемой таблицы в журналах Azure Monitor".

Example:

{
  "name": "ContosoSecurityAlerts_CL",
  "type": "Microsoft.OperationalInsights/workspaces/tables",
  "apiVersion": "2025-07-01",
  "properties": {
     "schema": {
        "name": "ContosoSecurityAlerts_CL",
        "columns": [
          {
             "name": "TimeGenerated",
             "type": "datetime"
          },
          {
             "name": "EventSeverity",
             "type": "string"
          },
          {
             "name": "EventType",
             "type": "string"
          },
          {
             "name": "UserName",
             "type": "string"
          },
          {
             "name": "SourceIP",
             "type": "string"
          },
          {
             "name": "DeviceId",
             "type": "string"
          },
          {
             "name": "AlertMessage",
             "type": "string"
          }
        ]
     }
  }
}

Правило сбора данных (DCR)

Что это такое: Определяет способ приема и обработки данных в Azure Monitor. Дополнительные сведения см. в разделе "Правила сбора данных" в Azure Monitor.

Что он делает:

  • Указывает имя входного потока (то, что приложение использует при отправке данных)
  • Определяет необязательные преобразования KQL для формирования и обогащения данных
  • Направление данных в целевую таблицу
  • Ссылки на конечную точку сбора данных (DCE)

Ключевые компоненты:

  • streamDeclarations: определяет структуру входящих данных (должно соответствовать тому, что отправляет ваше приложение)
  • destinations: место, куда идут данные (рабочая область Log Analytics)
  • dataFlows: конвейер преобразования из входного потока в выходную таблицу
  • dataCollectionEndpointId: ссылки на DCE для приема данных

Example:

{
  "name": "ContosoSecurityAlertsPushDCR",
  "apiVersion": "2021-09-01-preview",
  "type": "Microsoft.Insights/dataCollectionRules",
  "location": "[parameters('workspace-location')]",
  "properties": {
     "streamDeclarations": {
        "Custom-ContosoSecurityAlerts": {
          "columns": [
             {
                "name": "EventSeverity",
                "type": "string"
             },
             {
                "name": "EventType",
                "type": "string"
             },
             {
                "name": "UserName",
                "type": "string"
             },
             {
                "name": "SourceIP",
                "type": "string"
             },
             {
                "name": "DeviceId",
                "type": "string"
             },
             {
                "name": "AlertMessage",
                "type": "string"
             }
          ]
        }
     },
     "destinations": {
        "logAnalytics": [
          {
             "workspaceResourceId": "[variables('workspaceResourceId')]",
             "name": "clv2ws1"
          }
        ]
     },
     "dataFlows": [
        {
          "streams": [
             "Custom-ContosoSecurityAlerts"
          ],
          "destinations": [
             "clv2ws1"
          ],
          "transformKql": "source | extend TimeGenerated = now()",
          "outputStream": "Custom-ContosoSecurityAlerts_CL"
        }
     ],
     "dataCollectionEndpointId": "[concat('/subscriptions/',parameters('subscription'),'/resourceGroups/',parameters('resourceGroupName'),'/providers/Microsoft.Insights/dataCollectionEndpoints/',parameters('workspace'))]"
  }
}

Important

  • Имя потока должно начинаться с Custom- префикса.
  • Это transformKql может быть просто "source" для сквозной передачи или включения логики KQL для преобразования данных.
  • outputStream должно соответствовать имени таблицы с Custom- префиксом и _CL суффиксом.

Определение соединителя (пользовательский интерфейс)

Определение соединителя определяет, как соединитель отображается в коллекции соединителей данных Microsoft Sentinel. Дополнительные сведения см. в справочнике по API определений соединителя данных.

Определение соединителя включает:

  • Название соединителя, описание и фирменная символика
  • Предварительные условия и необходимые разрешения, такие как доступ к рабочему пространству и разрешения Entra
  • Инструкции по развертыванию
  • Элементы управления пользовательского интерфейса для отображения сведений о подключении пользователям

Ключевые элементы пользовательского интерфейса:

  • DeployPushConnectorButton: активирует автоматическое развертывание ресурсов
  • CopyableLabel: отображает сведения о подключении после развертывания (использует fillWith параметр)
  • Markdown: предоставляет отформатированные инструкции и контекст
  • IsConnectedQuery: проверяет подключение соединителя на основе последних данных

Пример структуры (сокращен для ясности):

{
    "name": "ContosoSecurityAlertsPush",
    "apiVersion": "2022-09-01-preview",
    "type": "Microsoft.SecurityInsights/dataConnectorDefinitions",
    "location": "[parameters('workspace-location')]",
    "kind": "Customizable",
    "properties": {
        "connectorUiConfig": {
            "id": "ContosoSecurityAlertsPush",
            "title": "Contoso Security Alerts (Push)",
            "publisher": "Contoso Corporation",
            "descriptionMarkdown": "The [Contoso Security Alerts](https://www.contoso.com/) connector provides the capability to push real-time security alerts from your Contoso application directly into Microsoft Sentinel using the Codeless Connector Framework (CCF) Push pattern. This connector ingests alert severity, event types, user information, and network details into a custom Log Analytics table for analysis, alerting, and visualization.",
            "graphQueries": [
                {
                    "metricName": "Security Alerts",
                    "legend": "ContosoSecurityAlerts_CL",
                    "baseQuery": "ContosoSecurityAlerts_CL"
                }
            ],
            "sampleQueries": [
                {
                    "description": "All security alerts",
                    "query": "ContosoSecurityAlerts_CL\n | sort by TimeGenerated desc"
                },
                {
                    "description": "Critical and High severity alerts",
                    "query": "ContosoSecurityAlerts_CL\n | where EventSeverity in ('Critical', 'High')\n | sort by TimeGenerated desc"
                }
            ],
            "dataTypes": [
                {
                    "name": "ContosoSecurityAlerts_CL",
                    "lastDataReceivedQuery": "ContosoSecurityAlerts_CL\n| summarize Time = max(TimeGenerated)\n| where isnotempty(Time)"
                }
            ],
            "connectivityCriteria": [
                {
                    "type": "IsConnectedQuery",
                    "value": [
                        "ContosoSecurityAlerts_CL\n| summarize LastLogReceived = max(TimeGenerated)\n| project IsConnected = LastLogReceived > ago(7d)"
                    ]
                }
            ],
            "availability": {
                "status": 1
            },
            "permissions": {
                "resourceProvider": [
                    {
                        "provider": "Microsoft.OperationalInsights/workspaces",
                        "permissionsDisplayText": "read and write permissions are required.",
                        "providerDisplayName": "Workspace",
                        "scope": "Workspace",
                        "requiredPermissions": {
                            "write": true,
                            "read": true,
                            "delete": true
                        }
                    }
                ],
                "customs": [
                    {
                        "name": "Microsoft Entra",
                        "description": "Permission to create an app registration in Microsoft Entra ID. Typically requires Entra ID Application Developer role or higher."
                    },
                    {
                        "name": "Microsoft Azure",
                        "description": "Permission to assign Monitoring Metrics Publisher role on data collection rule (DCR). Typically requires Azure RBAC Owner or User Access Administrator role."
                    }
                ]
            },
            "instructionSteps": [
                {
                    "title": "1. Create ARM Resources and Provide the Required Permissions",
                    "description": "This connector enables your Contoso application to push security alerts directly to Microsoft Sentinel via the Azure Monitor Ingestion API.",
                    "instructions": [
                        {
                            "type": "Markdown",
                            "parameters": {
                                "content": "#### Automated Configuration and Secure Data Ingestion with Entra Application \nClicking on \"Deploy\" will trigger the creation of a Log Analytics table and a Data Collection Rule (DCR). \nIt will then create an Entra application, link the DCR to it, and set the entered secret in the application. This setup enables data to be sent securely to the DCR using an Entra token."
                            }
                        },
                        {
                            "type": "DeployPushConnectorButton",
                            "parameters": {
                                "label": "Deploy Contoso Push connector resources",
                                "applicationDisplayName": "Contoso Security Alerts Push Connector Application"
                            }
                        }
                    ]
                },
                {
                    "title": "2. Configure Your Contoso Application",
                    "description": "Use the following parameters to configure your Contoso application to push security alerts to the workspace.",
                    "instructions": [
                        {
                            "type": "CopyableLabel",
                            "parameters": {
                                "label": "Tenant ID (Directory ID)",
                                "fillWith": [
                                    "TenantId"
                                ]
                            }
                        },
                        {
                            "type": "CopyableLabel",
                            "parameters": {
                                "label": "Entra App Registration Application ID",
                                "fillWith": [
                                    "ApplicationId"
                                ],
                                "placeholder": "Deploy push connector to get the App Registration Application ID"
                            }
                        },
                        {
                            "type": "CopyableLabel",
                            "parameters": {
                                "label": "Entra App Registration Secret",
                                "fillWith": [
                                    "ApplicationSecret"
                                ],
                                "placeholder": "Deploy push connector to get the App Registration Secret"
                            }
                        },
                        {
                            "type": "CopyableLabel",
                            "parameters": {
                                "label": "Data Collection Endpoint Uri",
                                "fillWith": [
                                    "DataCollectionEndpoint"
                                ],
                                "placeholder": "Deploy push connector to get the Data Collection Endpoint Uri"
                            }
                        },
                        {
                            "type": "CopyableLabel",
                            "parameters": {
                                "label": "Data Collection Rule Immutable ID",
                                "fillWith": [
                                    "DataCollectionRuleId"
                                ],
                                "placeholder": "Deploy push connector to get the Data Collection Rule Immutable ID"
                            }
                        },
                        {
                            "type": "CopyableLabel",
                            "parameters": {
                                "label": "Stream Name",
                                "value": "Custom-ContosoSecurityAlerts"
                            }
                        },
                        {
                            "type": "Markdown",
                            "parameters": {
                                "content": "#### Configure Contoso Application\nUpdate your Contoso application configuration with the above credentials to enable security alert push to Microsoft Sentinel.\n\nExample configuration:\njson\n{\n \"azure\": {\n \"tenant_id\": \"<Tenant ID>\",\n \"client_id\": \"<Application ID>\",\n \"client_secret\": \"<Application Secret>\",\n \"dce_endpoint\": \"<Data Collection Endpoint Uri>\",\n \"dcr_immutable_id\": \"<Data Collection Rule Immutable ID>\",\n \"stream_name\": \"Custom-ContosoSecurityAlerts\"\n }\n}\n"
                            }
                        }
                    ]
                }
            ]
        }
    }
}

Important

  • id в connectorUiConfig должен быть уникальным и совпадать со ссылками в конфигурации коннектора данных.
  • Используется IsConnectedQuery для рабочих соединителей (проверяет последние данные) или hasDataConnectors для более простой проверки.
  • Параметры fillWith в CopyableLabel автоматически заполняются после развертывания.
  • Фиксированные значения, как имя потока, следует использовать с параметром value вместо fillWith.

Настройка конфигурации push-коннектора

Конфигурация push-соединителя — это экземпляр соединителя данных, который связывает определение соединителя с развернутыми ресурсами.

Конфигурация push-коннектора

  • Связывает определение соединителя (пользовательский интерфейс) с развернутыми приложениями DCR и Entra
  • Хранит данные об аутентификации (идентификатор приложения, идентификатор службы)
  • Записывает конфигурацию DCR (конечная точка, неизменяемый идентификатор, имя потока)
  • Позволяет интерфейсу пользователя получать и отображать сведения о подключении для пользователей

Ключевые свойства:

  • connectorDefinitionName: должен соответствовать id в вашем определении соединителя.
  • dcrConfig: содержит конечную точку DCR, идентификатор правила и имя потока
  • auth: содержит идентификатор приложения Entra и идентификатор субъекта-службы
  • kind: должно быть "Push" для push-соединителей

Пример:

{
  "name": "ContosoSecurityAlertsPushDCR",
  "apiVersion": "2021-09-01-preview",
  "type": "Microsoft.Insights/dataCollectionRules",
  "location": "[parameters('workspace-location')]",
  "properties": {
    "streamDeclarations": {
      "Custom-ContosoSecurityAlerts": {
        "columns": [
          {
            "name": "EventSeverity",
            "type": "string"
          },
          {
            "name": "EventType",
            "type": "string"
          },
          {
            "name": "UserName",
            "type": "string"
          },
          {
            "name": "SourceIP",
            "type": "string"
          },
          {
            "name": "DeviceId",
            "type": "string"
          },
          {
            "name": "AlertMessage",
            "type": "string"
          }
        ]
      }
    },
    "destinations": {
      "logAnalytics": [
        {
          "workspaceResourceId": "[variables('workspaceResourceId')]",
          "name": "clv2ws1"
        }
      ]
    },
    "dataFlows": [
      {
        "streams": [
          "Custom-ContosoSecurityAlerts"
        ],
        "destinations": [
          "clv2ws1"
        ],
        "transformKql": "source | extend TimeGenerated = now()",
        "outputStream": "Custom-ContosoSecurityAlerts_CL"
      }
    ],
    "dataCollectionEndpointId": "[concat('/subscriptions/',parameters('subscription'),'/resourceGroups/',parameters('resourceGroupName'),'/providers/Microsoft.Insights/dataCollectionEndpoints/',parameters('workspace'))]"
  }
}

Important

  • Он должен точно соответствовать connectorDefinitionName определению соединителя id.
  • streamName должен соответствовать потоку, объявленному в вашем DCR.
  • Этот ресурс автоматически создается во время развертывания при нажатии кнопки DeployPushConnector .

Создание вашего первого push-коннектора

В этом примере создается простой соединитель push-уведомлений, который отправляет оповещения системы безопасности из приложения в Sentinel.

Цель: Отправка оповещений системы безопасности из приложения в Sentinel в режиме реального времени

Приложение отправляет структуру событий:

{
  "TimeGenerated": "2025-11-21T10:30:00Z",
  "EventSeverity": "Medium",
  "EventType": "LoginAlert",
  "UserName": "alice@contoso.com",
  "SourceIP": "192.168.1.100",
  "DeviceId": "device-12345",
  "AlertMessage": "Multiple failed login attempts detected"
}

Пошаговое руководство по созданию push-соединителя.

  1. Клонирование репозитория Azure-Sentinel

    Сначала сделайте форк, а затем клонируйте официальный репозиторий Azure-Sentinel на локальный компьютер. Этот репозиторий содержит средства упаковки и предоставляет стандартную структуру решения.

    1. Клонирование репозитория
      git clone https://github.com/<YOUR_FORK>/Azure-Sentinel.git

    2. Перейдите в каталог решений cd Azure-Sentinel/Solutions
      Структура репозитория включает:

    • Инструменты/Create-Azure-Sentinel-Solution/V3/
    • Содержит скрипт упаковки createSolutionV3.ps1
    • Решения/ Где вы разработаете своё решение коннектора
  2. Создайте структуру папок вашего решения. Создайте новый каталог решения в папке Solutions, согласно стандартному соглашению об именовании. Создание каталогов решений (из Azure-Sentinel/Solutions/)

    mkdir ContosoSecurityAlerts
    cd ContosoSecurityAlerts
    mkdir Data
    mkdir "Data Connectors"
    mkdir "Data Connectors/ContosoSecurityAlerts_ccf"
    

    Структура папок выглядит следующим образом:

    Azure-Sentinel/
     └️️ Решения/
        └️️ ContosoSecurityAlerts/
            ├── Данные/
            └── Коннекторы данных/
                └️️ ContosoSecurityAlerts_ccf/

  3. Задайте вашу таблицу

    В папке ContosoSecurityAlerts_ccf создайте файл с именем table.json с пользовательским определением таблицы:

    {
      "name": "ContosoSecurityAlerts_CL",
      "type": "Microsoft.OperationalInsights/workspaces/tables",
      "apiVersion": "2025-07-01",
      "properties": {
        "schema": {
          "name": "ContosoSecurityAlerts_CL",
          "columns": [
            {
              "name": "TimeGenerated",
              "type": "datetime"
            },
            {
              "name": "EventSeverity",
              "type": "string"
            },
            {
              "name": "EventType",
              "type": "string"
            },
            {
              "name": "UserName",
              "type": "string"
            },
            {
              "name": "SourceIP",
              "type": "string"
            },
            {
              "name": "DeviceId",
              "type": "string"
            },
            {
              "name": "AlertMessage",
              "type": "string"
            }
          ]
        }
      }
    }
    
  4. Создание DCR

    В папке ContosoSecurityAlerts_ccf создайте файл с именем DCR.json, который определяет входной поток и направляет данные в таблицу:

    {
      "name": "ContosoSecurityAlertsPushDCR",
      "apiVersion": "2021-09-01-preview",
      "type": "Microsoft.Insights/dataCollectionRules",
      "location": "[parameters('workspace-location')]",
      "properties": {
        "streamDeclarations": {
          "Custom-ContosoSecurityAlerts": {
            "columns": [
              {
                "name": "EventSeverity",
                "type": "string"
              },
              {
                "name": "EventType",
                "type": "string"
              },
              {
                "name": "UserName",
                "type": "string"
              },
              {
                "name": "SourceIP",
                "type": "string"
              },
              {
                "name": "DeviceId",
                "type": "string"
              },
              {
                "name": "AlertMessage",
                "type": "string"
              }
            ]
          }
        },
        "destinations": {
          "logAnalytics": [
            {
              "workspaceResourceId": "[variables('workspaceResourceId')]",
              "name": "clv2ws1"
            }
          ]
        },
        "dataFlows": [
          {
            "streams": [
              "Custom-ContosoSecurityAlerts"
            ],
            "destinations": [
              "clv2ws1"
            ],
            "transformKql": "source | extend TimeGenerated = now()",
            "outputStream": "Custom-ContosoSecurityAlerts_CL"
          }
        ],
        "dataCollectionEndpointId": "[concat('/subscriptions/',parameters('subscription'),'/resourceGroups/',parameters('resourceGroupName'),'/providers/Microsoft.Insights/    dataCollectionEndpoints/',parameters('workspace'))]"
      }
    }
    
  5. Создание определения соединителя

    В папке ContosoSecurityAlerts_ccf создайте файл с именем connectorDefinition.json, определяющий взаимодействие пользователей с соединителем в Sentinel:

    {
        "name": "ContosoSecurityAlertsPush",
        "apiVersion": "2022-09-01-preview",
        "type": "Microsoft.SecurityInsights/dataConnectorDefinitions",
        "location": "[parameters('workspace-location')]",
        "kind": "Customizable",
        "properties": {
            "connectorUiConfig": {
                "id": "ContosoSecurityAlertsPush",
                "title": "Contoso Security Alerts (Push)",
                "publisher": "Contoso Corporation",
                "descriptionMarkdown": "The [Contoso Security Alerts](https://www.contoso.com/) connector provides the capability to push real-time security alerts from your   Contoso application directly into Microsoft Sentinel using the Codeless Connector Framework (CCF) Push pattern. This connector ingests alert severity, event  types, user information, and network details into a custom Log Analytics table for analysis, alerting, and visualization.",
                "graphQueries": [
                    {
                        "metricName": "Security Alerts",
                        "legend": "ContosoSecurityAlerts_CL",
                        "baseQuery": "ContosoSecurityAlerts_CL"
                    }
                ],
                "sampleQueries": [
                    {
                        "description": "All security alerts",
                        "query": "ContosoSecurityAlerts_CL\n | sort by TimeGenerated desc"
                    },
                    {
                        "description": "Critical and High severity alerts",
                        "query": "ContosoSecurityAlerts_CL\n | where EventSeverity in ('Critical', 'High')\n | sort by TimeGenerated desc"
                    }
                ],
                "dataTypes": [
                    {
                        "name": "ContosoSecurityAlerts_CL",
                        "lastDataReceivedQuery": "ContosoSecurityAlerts_CL\n| summarize Time = max(TimeGenerated)\n| where isnotempty(Time)"
                    }
                ],
                "connectivityCriteria": [
                    {
                        "type": "IsConnectedQuery",
                        "value": [
                            "ContosoSecurityAlerts_CL\n| summarize LastLogReceived = max(TimeGenerated)\n| project IsConnected = LastLogReceived > ago(7d)"
                        ]
                    }
                ],
                "availability": {
                    "status": 1
                },
                "permissions": {
                    "resourceProvider": [
                        {
                            "provider": "Microsoft.OperationalInsights/workspaces",
                            "permissionsDisplayText": "read and write permissions are required.",
                            "providerDisplayName": "Workspace",
                            "scope": "Workspace",
                            "requiredPermissions": {
                                "write": true,
                                "read": true,
                                "delete": true
                            }
                        }
                    ],
                    "customs": [
                        {
                            "name": "Microsoft Entra",
                            "description": "Permission to create an app registration in Microsoft Entra ID. Typically requires Entra ID Application Developer role or higher."
                        },
                        {
                            "name": "Microsoft Azure",
                            "description": "Permission to assign Monitoring Metrics Publisher role on data collection rule (DCR). Typically requires Azure RBAC Owner or User   Access Administrator role."
                        }
                    ]
                },
                "instructionSteps": [
                    {
                        "title": "1. Create ARM Resources and Provide the Required Permissions",
                        "description": "This connector enables your Contoso application to push security alerts directly to Microsoft Sentinel via the Azure Monitor Ingestion  API.",
                        "instructions": [
                            {
                                "type": "Markdown",
                                "parameters": {
                                    "content": "#### Automated Configuration and Secure Data Ingestion with Entra Application \nClicking on \"Deploy\" will trigger the creation    of a Log Analytics table and a Data Collection Rule (DCR). \nIt will then create an Entra application, link the DCR to it, and set the     entered secret in the application. This setup enables data to be sent securely to the DCR using an Entra token."
                                }
                            },
                            {
                                "type": "DeployPushConnectorButton",
                                "parameters": {
                                    "label": "Deploy Contoso Push connector resources",
                                    "applicationDisplayName": "Contoso Security Alerts Push Connector Application"
                                }
                            }
                        ]
                    },
                    {
                        "title": "2. Configure Your Contoso Application",
                        "description": "Use the following parameters to configure your Contoso application to push security alerts to the workspace.",
                        "instructions": [
                            {
                                "type": "CopyableLabel",
                                "parameters": {
                                    "label": "Tenant ID (Directory ID)",
                                    "fillWith": [
                                        "TenantId"
                                    ]
                                }
                            },
                            {
                                "type": "CopyableLabel",
                                "parameters": {
                                    "label": "Entra App Registration Application ID",
                                    "fillWith": [
                                        "ApplicationId"
                                    ],
                                    "placeholder": "Deploy push connector to get the App Registration Application ID"
                                }
                            },
                            {
                                "type": "CopyableLabel",
                                "parameters": {
                                    "label": "Entra App Registration Secret",
                                    "fillWith": [
                                        "ApplicationSecret"
                                    ],
                                    "placeholder": "Deploy push connector to get the App Registration Secret"
                                }
                            },
                            {
                                "type": "CopyableLabel",
                                "parameters": {
                                    "label": "Data Collection Endpoint Uri",
                                    "fillWith": [
                                        "DataCollectionEndpoint"
                                    ],
                                    "placeholder": "Deploy push connector to get the Data Collection Endpoint Uri"
                                }
                            },
                            {
                                "type": "CopyableLabel",
                                "parameters": {
                                    "label": "Data Collection Rule Immutable ID",
                                    "fillWith": [
                                        "DataCollectionRuleId"
                                    ],
                                    "placeholder": "Deploy push connector to get the Data Collection Rule Immutable ID"
                                }
                            },
                            {
                                "type": "CopyableLabel",
                                "parameters": {
                                    "label": "Stream Name",
                                    "value": "Custom-ContosoSecurityAlerts"
                                }
                            },
                            {
                                "type": "Markdown",
                                "parameters": {
                                    "content": "#### Configure Contoso Application\nUpdate your Contoso application configuration with the above credentials to enable security     alert push to Microsoft Sentinel.\n\nExample configuration:\njson\n{\n \"azure\": {\n \"tenant_id\": \"<Tenant ID>\",\n \"client_id\":  \"<Application ID>\",\n \"client_secret\": \"<Application Secret>\",\n \"dce_endpoint\": \"<Data Collection Endpoint Uri>\",\n   \"dcr_immutable_id\": \"<Data Collection Rule Immutable ID>\",\n \"stream_name\": \"Custom-ContosoSecurityAlerts\"\n }\n}\n"
                                }
                            }
                        ]
                    }
                ]
            }
        }
    }
    
  6. Создание конфигурации соединителя данных

    В папке ContosoSecurityAlerts_ccf создайте файл с именем dataConnector.json, который связывает определение соединителя с развернутыми ресурсами:

    {
      "name": "ContosoSecurityAlertsPushConnectorPolling",
      "apiVersion": "2024-09-01",
      "type": "Microsoft.SecurityInsights/dataConnectors",
      "kind": "Push",
      "properties": {
        "connectorDefinitionName": "ContosoSecurityAlertsPush",
        "dcrConfig": {
          "streamName": "Custom-ContosoSecurityAlerts",
          "dataCollectionEndpoint": "[[parameters('dcrConfig').dataCollectionEndpoint]",
          "dataCollectionRuleImmutableId": "[[parameters('dcrConfig').dataCollectionRuleImmutableId]"
        },
        "auth": {
          "type": "Push",
          "AppId": "[[parameters('auth').appId]",
          "ServicePrincipalId": "[[parameters('auth').servicePrincipalId]"
        },
        "request": {
          "RetryCount": 1
        },
        "response": {
          "eventsJsonPaths": [
            "$"
          ]
        }
      }
    }
    
  7. Создание файлов метаданных решения

    1. Solution_ContosoSecurityAlerts.json В папке данных создайте Solution_ContosoSecurityAlerts.json с деталями вашего решения:

      {
           "Name": "ContosoSecurityAlerts",
           "Author": "Contoso Corporation - support@contoso.com",
           "Logo": "<svg width=\"75px\" height=\"75px\" viewBox=\"0 0 75 75\" xmlns=\"http://www.w3.org/2000/svg\"><rect width=\"75\" height=\"75\" fill=\"#FF6B35\"/><text   x=\"37.   5\" y=\"45\" font-family=\"Arial\" font-size=\"18\" fill=\"white\" text-anchor=\"middle\" font-weight=\"bold\">CONTOSO</text></svg>",
           "Description": "The Contoso Security Alerts solution provides real-time security alert ingestion from your Contoso application into Microsoft Sentinel using the       Codeless Connector Framework (CCF) Push pattern. Your application pushes alert severity, event types, user information, and network details directly to Azure   Monitor     for analysis, alerting, and visualization.",
           "Data Connectors": [
                "Data Connectors/ContosoSecurityAlerts_ccf/connectorDefinition.json"
           ],
           "BasePath": "C:\\GitHub\\Azure-Sentinel\\Solutions\\ContosoSecurityAlerts",
           "Version": "1.0.0",
           "Metadata": "SolutionMetadata.json",
           "TemplateSpec": true,
           "Is1PConnector": false
      }
      

      Important

      Критически важные требования к полю:

      • BasePath: обновите фактический локальный путь к репозиторию Azure-Sentinel
      • Metadata: должна ссылаться на SolutionMetadata.json (создана на шаге 6B)
      • Version: семантическое управление версиями, например 3.0.0
      • TemplateSpec: всегда используйте true для решений Центра содержимого
      • Is1Pconnector: задано значение false для партнерских или пользовательских соединителей
    2. Создайте файл SolutionMetadata.json в корневом каталоге решения

      В папке ContosoSecurityAlerts создайте SolutionMetadata.json в корневом каталоге решения (на том же уровне, что и папка Data):

      {
        "publisherId": "contoso",
        "offerId": "contoso-security-alerts",
        "firstPublishDate": "2025-01-01",
        "lastPublishDate": "2025-01-01",
        "providers": [
           "Contoso"
        ],
        "categories": {
           "domains": [
              "Security - Threat Protection",
              "Security - Cloud Security"
           ]
        },
        "support": {
           "name": "Contoso Corporation",
           "tier": "Partner",
           "link": "https://www.contoso.com/support"
        }
      }
      

      Вам нужен файл SolutionMetadata.json для упаковки Content Hub:

      • Средство упаковки ожидает этот файл в корневом каталоге решения
      • Он содержит метаданные торговой площадки для распространения Контент-хаба.
    3. Создание ReleaseNotes.md в корневом каталоге решения

      Version Дата изменения (DD-MM-YYYY) Журнал изменений
      3.0.0 DD-MM-YYYY Пример решения

    Контрольный список проверки

    Прежде чем перейти к следующему шагу, проверьте следующее:

    • Имя папки не имеет пробелов, например ContosoSecurityAlerts
    • Name поле в Solution_ContosoSecurityAlerts.json соответствует имени папки точно
    • SolutionMetadata.json существует в корневом каталоге решения (не в папке данных)
    • BasePath указывает на фактический путь локального Azure-Sentinel репозитория
    • Metadata ссылки на поля "SolutionMetadata.json"
    • publisherId и offerId совпадают в обоих файлах
  8. Проверка структуры решения

    Убедитесь, что структура папок соответствует требуемому макету со всеми файлами на месте:

    Azure-Sentinel/
    └── Solutions/
         └── ContosoSecurityAlerts/                         Folder name (no spaces)
              ├── Data/
              │   └── Solution_ContosoSecurityAlerts.json    From Step 7A
              ├── SolutionMetadata.json                      From Step 7B (at root)
              ├── ReleaseNotes.md                            From Step 7C
              └── Data Connectors/
                    └── ContosoSecurityAlerts_ccf/
                         ├── table.json                         From Step 3
                         ├── DCR.json                           From Step 4
                         ├── connectorDefinition.json           From Step 5
                         └── dataConnector.json                 From Step 6
    
  9. Упаковка решения

    Используйте средство упаковки createSolutionV3.ps1 для создания шаблона развертывания ARM.

    # Navigate to the packaging tools directory (from Azure-Sentinel repository root)
    cd Tools/Create-Azure-Sentinel-Solution/V3
    
    # Run the packaging tool
    # When prompted for "Enter solution data folder path:", provide:
    # <REPO_ROOT>Solutions/ContosoSecurityAlerts/Data (Note! This path is absolute)
    .\createSolutionV3.ps1
    

    Скрипт автоматически:

    • Проверяет структуру данных и папок
    • Процессы соединительных артефактов

    Ожидаемые выходные данные:

    В скрипте упаковки показана неудачная проверка arm-ttk (инструментария шаблонов Azure Resource Manager). Этот сбой является ожидаемым и нормальным для CCF push соединителей:

    Failed arm-ttk (Test-AzTemplate): Package
    Failed arm-ttk (Test-AzTemplate) on solutions: Package
    ************Validating if Package Json files are valid or not***************
    File Solutions\ContosoSecurityAlerts\Package\createUiDefinition.json is a valid Json file!
    File Solutions\ContosoSecurityAlerts\Package\mainTemplate.json is a valid Json file!
    File Solutions\ContosoSecurityAlerts\Package\testParameters.json is a valid Json file!
    

    Упаковка прошла успешно, если вы увидите три сообщения проверки JSON, подтверждающие допустимые файлы. Вы можете игнорировать сбой arm-ttk для пуш-соединителей CCF.

    Дополнительные сведения см. в документации Azure-Sentinel Solutions Tools.

  10. Развертывание пакета решения

    Разверните сгенерированный шаблон ARM (Package/mainTemplate.json) в вашей подписке Azure.

    1. На портале Azure найдите Развертывание пользовательского шаблона
    2. Выберите "Создать собственный шаблон" в редакторе
    3. Выберите "Загрузить файл " и выберите Package/mainTemplate.json из выходной папки
    4. Нажмите кнопку Сохранить.
    5. Заполните параметры развертывания:
      • Подписка: Ваша подписка Azure
      • Группа ресурсов: Группа ресурсов, содержащая рабочую область Sentinel
      • Регион: Тот же самый регион, что и рабочая область Sentinel
      • Рабочая область: Имя рабочей области Log Analytics
    6. Выберите "Просмотр и создание", а затем "Создать"

    Это развертывание делает соединитель доступным в коллекции соединителей данных Microsoft Sentinel.

    Подробные шаги см. в разделе [Быстрый старт: Создание и развертывание шаблонов ARM с помощью портала Azure](/azure/azure-resource-manager/templates/quickstart-create-templates-use-the-portal).

  11. Включение соединителя данных

    После развертывания пакета решения включите соединитель для подготовки ресурсов и создания учетных данных.

    1. На портале Azure перейдите в рабочую область Microsoft Sentinel
    2. Перейдите в Конфигурация>Соединители данных
    3. Найдите и выберите оповещения системы безопасности Contoso (Push)
    4. Выберите страницу «Открыть страницу соединителя»
    5. Нажмите кнопку "Развернуть соединитель оповещений системы безопасности Contoso"
    6. Ожидайте завершения развертывания (создает пользовательскую таблицу, DCR, DCE, приложение Entra с данными для входа)
    7. Скопируйте отображаемые сведения о подключении:
      • Идентификатор арендатора
      • Идентификатор приложения (клиента)
      • Секрет клиента
      • URI конечной точки сбора данных
      • Неизменяемый идентификатор правила сбора данных
      • Имя потока: Custom-ContosoSecurityAlerts
  12. Настройка приложения

    Обновите код приложения с учетными данными и сведениями о ресурсах на шаге 10. Код использует поток учетных данных клиента OAuth 2.0 для проверки подлинности с помощью Azure Monitor.

    Предостережение

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

    • Azure Key Vault для рабочих приложений
    • Переменные среды или файлы конфигурации (исключены из системы управления версиями)
    • Управляемые удостоверения, где это возможно
    • Средства управления секретами, которые шифруют учетные данные в состоянии покоя

    Пример кода приложения Python:

    В следующем примере используются значения заполнителей, такие как <Your-Tenant-ID>. Замените эти значения безопасными ссылками на фактические учетные данные.

    import requests
    import json
    from datetime import datetime, timezone
    
    # Connection details from Step 11
    
    tenant_id = "<Your-Tenant-ID>"
    app_id = "<Your-Application-ID>"
    app_secret = "<Your-Client-Secret>"
    dce_uri = "<Your-DCE-URI>"
    dcr_immutable_id = "<Your-DCR-Immutable-ID>"
    stream_name = "Custom-ContosoSecurityAlerts"
    
    
    **Get OAuth token**
    
    token_url = f"https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token"
    token_data = {
         "client_id": app_id,
         "scope": "https://monitor.azure.com//.default",
         "client_secret": app_secret,
         "grant_type": "client_credentials"
    }
    token_response = requests.post(token_url, data=token_data)
    access_token = token_response.json()["access_token"]
    
    
    # Create event matching your table schema
    
    event = [{
         "TimeGenerated": datetime.now(timezone.utc).isoformat(),
         "EventSeverity": "Medium",
         "EventType": "LoginAlert",
         "UserName": "alice@contoso.com",
         "SourceIP": "192.168.1.100",
         "DeviceId": "device-12345",
         "AlertMessage": "Multiple failed login attempts detected"
    }]
    
    
    # Send to Sentinel
    
    headers = {
         "Authorization": f"Bearer {access_token}",
         "Content-Type": "application/json"
    }
    upload_url = f"{dce_uri}/dataCollectionRules/{dcr_immutable_id}/streams/{stream_name}?api-version=2023-01-01"
    response = requests.post(upload_url, headers=headers, json=event)
    
    print(f"Status: {response.status_code}")
    print("Security alert sent to Sentinel!")
    
  13. Запросите свои данные

    После отправки оповещений выполните запрос в Sentinel. Разрешите 5–10 минут для первого приема.

    // View all recent alerts
    ContosoSecurityAlerts_CL
    | where TimeGenerated > ago(1h)
    | order by TimeGenerated desc
    
    // High severity alerts
    ContosoSecurityAlerts_CL
    | where EventSeverity == "High"
    | project TimeGenerated, EventType, UserName, SourceIP, AlertMessage
    
    // Alert summary by severity
    ContosoSecurityAlerts_CL
    | where TimeGenerated > ago(7d)
    | summarize Count=count() by EventSeverity
    

Теперь, когда вы разобрались с CCF Push соединителями, выполните следующие шаги.

  1. Проектирование схемы данных — определение событий, которые нужно отправить, и их полей.
  2. Создание артефактов соединителя — создание четырех JSON-файлов (таблица, DCR, определение соединителя, соединитель данных).
  3. Упорядочение структуры решения — настройка данных и соединителей данных/ папок с правильным именованием.
  4. Упаковайте решение . Используйте createSolutionV3.ps1 для создания шаблонов развертывания.
  5. Разверните и протестируйте — разверните в рабочей области Sentinel и валидируйте поток данных.
  6. Интеграция с приложением — добавление кода для отправки событий в режиме реального времени.
  7. Создание оповещений и рабочих книг - Используйте данные для мониторинга безопасности.

Дополнительные ресурсы

Документация по CCF

Azure Monitor и сбор данных

Проверка подлинности и безопасность

Microsoft Sentinel

Получите помощь

  • Для партнеров ISV, создающих интеграции, свяжитесь с: azuresentinelpartner@microsoft.com
  • Для технических вопросов используйте Microsoft Q&A с тегом azure-sentinel.