Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Это руководство поможет вам понять, создать и внедрить безкодовые соединители, основанные на 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 состоит из пяти основных этапов:
Вы разворачиваете коннектор в Microsoft Sentinel.
Azure автоматически создает следующие ресурсы:
- Приложение Microsoft Entra с учетными данными
- Правило сбора данных (DCR) — определяет способ обработки данных
- Конечная точка сбора данных (DCE) — URL-адрес, в котором отправляются данные.
- Настраиваемая таблица журналов — место хранения данных
- Назначения ролей — разрешения для приложения Entra
Вы получите следующие сведения о подключении:
- Идентификатор арендатора
- Идентификатор приложения (клиента)
- Секрет клиента
- URI DCE (URL-адрес конечной точки)
- Неизменяемый идентификатор DCR
- Имя потока
Приложение отправляет следующие данные:
- Получает токен OAuth 2.0, используя сгенерированные CCF учетные данные приложения Entra. Дополнительные сведения см. в потоке учетных данных клиента OAuth 2.0
- Форматирует события в формате JSON, соответствующий схеме таблицы
- Передает данные на конечную точку DCE
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-соединителя.
Клонирование репозитория Azure-Sentinel
Сначала сделайте форк, а затем клонируйте официальный репозиторий Azure-Sentinel на локальный компьютер. Этот репозиторий содержит средства упаковки и предоставляет стандартную структуру решения.
Клонирование репозитория
git clone https://github.com/<YOUR_FORK>/Azure-Sentinel.gitПерейдите в каталог решений
cd Azure-Sentinel/Solutions
Структура репозитория включает:
- Инструменты/Create-Azure-Sentinel-Solution/V3/
- Содержит скрипт упаковки createSolutionV3.ps1
- Решения/ Где вы разработаете своё решение коннектора
Создайте структуру папок вашего решения. Создайте новый каталог решения в папке Solutions, согласно стандартному соглашению об именовании. Создание каталогов решений (из Azure-Sentinel/Solutions/)
mkdir ContosoSecurityAlerts cd ContosoSecurityAlerts mkdir Data mkdir "Data Connectors" mkdir "Data Connectors/ContosoSecurityAlerts_ccf"Структура папок выглядит следующим образом:
Azure-Sentinel/
└️️ Решения/
└️️ ContosoSecurityAlerts/
├── Данные/
└── Коннекторы данных/
└️️ ContosoSecurityAlerts_ccf/Задайте вашу таблицу
В папке 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" } ] } } }Создание 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'))]" } }Создание определения соединителя
В папке 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" } } ] } ] } } }Создание конфигурации соединителя данных
В папке 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": [ "$" ] } } }Создание файлов метаданных решения
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для партнерских или пользовательских соединителей
-
Создайте файл 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:
- Средство упаковки ожидает этот файл в корневом каталоге решения
- Он содержит метаданные торговой площадки для распространения Контент-хаба.
Создание 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совпадают в обоих файлах
Проверка структуры решения
Убедитесь, что структура папок соответствует требуемому макету со всеми файлами на месте:
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Упаковка решения
Используйте средство упаковки 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.
Развертывание пакета решения
Разверните сгенерированный шаблон ARM (Package/mainTemplate.json) в вашей подписке Azure.
- На портале Azure найдите Развертывание пользовательского шаблона
- Выберите "Создать собственный шаблон" в редакторе
- Выберите "Загрузить файл " и выберите
Package/mainTemplate.jsonиз выходной папки - Нажмите кнопку Сохранить.
- Заполните параметры развертывания:
- Подписка: Ваша подписка Azure
- Группа ресурсов: Группа ресурсов, содержащая рабочую область Sentinel
- Регион: Тот же самый регион, что и рабочая область Sentinel
- Рабочая область: Имя рабочей области Log Analytics
- Выберите "Просмотр и создание", а затем "Создать"
Это развертывание делает соединитель доступным в коллекции соединителей данных Microsoft Sentinel.
Подробные шаги см. в разделе [Быстрый старт: Создание и развертывание шаблонов ARM с помощью портала Azure](/azure/azure-resource-manager/templates/quickstart-create-templates-use-the-portal).
Включение соединителя данных
После развертывания пакета решения включите соединитель для подготовки ресурсов и создания учетных данных.
- На портале Azure перейдите в рабочую область Microsoft Sentinel
- Перейдите в Конфигурация>Соединители данных
- Найдите и выберите оповещения системы безопасности Contoso (Push)
- Выберите страницу «Открыть страницу соединителя»
- Нажмите кнопку "Развернуть соединитель оповещений системы безопасности Contoso"
- Ожидайте завершения развертывания (создает пользовательскую таблицу, DCR, DCE, приложение Entra с данными для входа)
- Скопируйте отображаемые сведения о подключении:
- Идентификатор арендатора
- Идентификатор приложения (клиента)
- Секрет клиента
- URI конечной точки сбора данных
- Неизменяемый идентификатор правила сбора данных
- Имя потока:
Custom-ContosoSecurityAlerts
Настройка приложения
Обновите код приложения с учетными данными и сведениями о ресурсах на шаге 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!")Запросите свои данные
После отправки оповещений выполните запрос в 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 соединителями, выполните следующие шаги.
- Проектирование схемы данных — определение событий, которые нужно отправить, и их полей.
- Создание артефактов соединителя — создание четырех JSON-файлов (таблица, DCR, определение соединителя, соединитель данных).
- Упорядочение структуры решения — настройка данных и соединителей данных/ папок с правильным именованием.
-
Упаковайте решение . Используйте
createSolutionV3.ps1для создания шаблонов развертывания. - Разверните и протестируйте — разверните в рабочей области Sentinel и валидируйте поток данных.
- Интеграция с приложением — добавление кода для отправки событий в режиме реального времени.
- Создание оповещений и рабочих книг - Используйте данные для мониторинга безопасности.
Дополнительные ресурсы
Документация по CCF
- Создайте коннектор без кода (CCF Pull) — коннекторы, использующие опрос.
- Справочник по API определений соединителя данных — руководство по настройке пользовательского интерфейса.
- Справочник по правилам подключения соединителей данных — правила подключения для опросных соединителей.
Azure Monitor и сбор данных
- API приема журналов Azure Monitor — основной API для отправки данных.
- Правила сбора данных в Azure Monitor — общие сведения о контроллерах домена.
- Структура правила сбора данных — сведения о структуре DCR.
- Конечные точки сбора данных в Azure Monitor — конфигурация DCE.
- Руководство по отправке данных в журналы Azure Monitor с помощью API приема журналов — пошаговое руководство.
- Создание настраиваемой таблицы — руководство по созданию настраиваемой таблицы .
Проверка подлинности и безопасность
- Поток учетных данных клиента OAuth 2.0 — как работает проверка подлинности между приложениями.
- Токены доступа платформы идентификации Microsoft — общие сведения о токенах OAuth.
- Зарегистрируйте приложение в идентификаторе Microsoft Entra. Как зарегистрировать приложение в идентификаторе Microsoft Entra.
- Рекомендации по регистрации приложений Azure AD — безопасность приложений Entra.
- Назначение ролей Azure с помощью шаблонов Azure Resource Manager (ARM) — назначение ролей с помощью шаблонов.
- Рекомендации по безопасности шаблона ARM — защита шаблонов развертывания.
- Ограничения службы Azure Monitor— ограничения скорости и квоты.
Microsoft Sentinel
- О решениях Microsoft Sentinel — объединение соединителей в пакет решений.
- Мониторинг работоспособности соединителей данных — мониторинг работоспособности.
- Справочник по шаблону ARM для соединителей данных — полный справочник по API.
Получите помощь
- Для партнеров ISV, создающих интеграции, свяжитесь с: azuresentinelpartner@microsoft.com
- Для технических вопросов используйте Microsoft Q&A с тегом azure-sentinel.