Conectores de inserción CCF de Microsoft Sentinel (versión preliminar): guía de introducción

Esta guía le ayuda a comprender, compilar e implementar conectores sin código basados en Push para Microsoft Sentinel mediante el Codeless Connector Framework (CCF) Push (versión preliminar).

¿Qué es el push CCF?

Los conectores de inserción CCF permiten a sus aplicaciones enviar eventos de seguridad directamente a Microsoft Sentinel en tiempo real. A diferencia de los conectores tradicionales basados en sondeo que capturan periódicamente datos de las API, los conectores de inserción permiten insertar datos en Sentinel a medida que se producen eventos en el sistema.

CCF Push proporciona varias ventajas clave:

  • Flujo de datos controlado por la aplicación: La aplicación controla cuándo y cómo enviar datos, lo que permite estrategias de procesamiento por lotes inteligentes y un uso optimizado de la red.
  • Ingesta en tiempo real: Envíe datos inmediatamente a medida que se produzcan eventos, sin esperar a intervalos de sondeo.
  • Arquitectura simplificada: No es necesario mantener los puntos de conexión de API para que Sentinel sondee.
  • Aprovisionamiento basado en plantillas: La implementación crea plantillas de ARM para DCR, tablas personalizadas, registros de aplicaciones Entra y secretos de cliente; recibirá los detalles de conexión para configurar en la aplicación de envío.
  • Autenticación segura: Usa aplicaciones de Microsoft Entra con OAuth 2.0 para el envío seguro de datos.

Prerequisites

  • Antes de empezar, debe tener acceso al repositorio de GitHub de Azure-Sentinel para herramientas de empaquetado.
  • Permisos de Microsoft Entra:
    • Permiso para crear un registro de aplicación en microsoft Entra ID. Normalmente, requiere el rol de desarrollador de aplicaciones de Entra ID o superior.
    • Permiso para crear una aplicación con secretos. Si no concede este permiso, se produce un error en el conector debido a motivos de seguridad.
    • El publicador debe tener el rol adecuado para recuperar tokens de la aplicación Microsoft Entra. Estos tokens son necesarios para autenticar solicitudes al punto de conexión de recopilación de datos (DCE), que es el punto de conexión donde el conector inserta en última instancia sus datos. Si el proveedor no puede recuperar tokens, los datos no se pueden enviar al DCE.
  • Permisos de Microsoft Azure:
    • Permiso para asignar el rol Publicador de métricas de supervisión en la regla de recopilación de datos (DCR). Normalmente, se requiere el rol de propietario de Azure RBAC o el de administrador de acceso de usuario.

Funcionamiento del envío CCF

Modelo push frente al modelo pull

Comprender la diferencia entre los modelos de ingesta de datos de inserción y extracción le ayuda a elegir el tipo de conector adecuado para su escenario.

Conectores de extracción de CCF - Basados en consultas:

En el modelo de extracción, Microsoft Sentinel sondea periódicamente la API para recuperar datos:

  • Microsoft Sentinel inicia conexiones a la API de origen de datos según una programación configurada.
  • Los datos llegan a intervalos de sondeo normales, como cada cinco minutos.
  • Debe mantener un punto de conexión de API accesible públicamente.
  • La infraestructura de sondeo de Sentinel administra el proceso de recopilación de datos.

Conectores de inserción CCF: controlado por eventos:

En el modelo de inserción, la aplicación envía datos directamente a Microsoft Sentinel:

  • La aplicación inicia el envío de datos cuando se producen eventos.
  • Los datos llegan casi en tiempo real a medida que se generan eventos.
  • No es necesario mantener un punto de conexión de API.
  • La aplicación controla el procesamiento por lotes, el tiempo y la optimización del flujo de datos.

Flujo de datos de envío

El flujo de datos de inserción CCF consta de cinco pasos principales:

  1. Implemente el conector en Microsoft Sentinel.

  2. Azure crea automáticamente los siguientes recursos:

    • Aplicación Microsoft Entra con credenciales
    • Regla de recopilación de datos (DCR): define cómo procesar los datos
    • Punto de conexión de recopilación de datos (DCE): la dirección URL en la que se envían datos
    • Tabla de registro personalizada: donde se almacenan los datos
    • Asignaciones de roles: permisos para la aplicación Entra
  3. Recibirá los siguientes detalles de conexión:

    • Id. de inquilino
    • Id. de aplicación (cliente)
    • Secreto del cliente
    • URI de DCE (dirección URL del punto de conexión)
    • Identificador inmutable de DCR
    • Nombre de la secuencia
  4. La aplicación envía los datos siguientes:

    • Obtiene un token de OAuth 2.0 mediante las credenciales de aplicación Entra generadas por CCF. Para más información, consulte Flujo de credenciales de cliente de OAuth 2.0.
    • Da formato a los eventos como JSON que coinciden con el esquema de tabla.
    • Envía datos mediante POST al punto de conexión de DCE
  5. Azure procesa y almacena datos:

    • DCR transforma los datos (transformaciones KQL opcionales)
    • Los datos se escriben en la tabla personalizada en Log Analytics
    • Los datos están disponibles para consultas, análisis y alertas en Sentinel

Artefactos de inserción CCF

Una solución del conector CCF Push consta de cuatro componentes principales:

  • Definición de tabla personalizada
  • Regla de recopilación de datos (DCR)
  • Definición del conector (UI)
  • Configuración del conector Push

Definición de tabla personalizada

Qué es: Esquema que define la estructura de los datos en Log Analytics.

Requisitos principales:

  • El nombre de la tabla debe terminar con _CL (sufijo de registro personalizado).
  • Debe incluir una TimeGenerated columna (tipo datetime).
  • Tipos de columna: string, int, long, real, bool, datetime, dynamic, guid.
  • Use la versión 2025-07-01 de API o posterior.
  • Para más información, consulte Creación de una tabla personalizada en registros de 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"
          }
        ]
     }
  }
}

Regla de recopilación de datos (DCR)

Qué es: Define cómo Azure Monitor ingiere y procesa los datos. Para obtener más información, consulte Reglas de recopilación de datos en Azure Monitor.

Qué hace:

  • Especifica el nombre del flujo de entrada (lo que usa la aplicación al enviar datos)
  • Define transformaciones de KQL opcionales para dar forma y enriquecer los datos.
  • Enruta los datos a la tabla de destino
  • Vínculos al punto de conexión de recopilación de datos (DCE)

Componentes clave:

  • streamDeclarations: define la estructura de los datos entrantes (debe coincidir con lo que envía la aplicación)
  • destinations: dónde van los datos (el área de trabajo de Log Analytics)
  • dataFlows: la canalización de transformación del flujo de entrada a la tabla de salida
  • dataCollectionEndpointId: vínculos al DCE para la ingesta de datos

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'))]"
  }
}

Importante

  • El nombre de la secuencia debe comenzar con el prefijo Custom-.
  • transformKql puede ser simplemente "source" para el paso a través o incluir la lógica de KQL para la transformación de datos.
  • outputStream debe coincidir con el nombre de la tabla con Custom- el prefijo y _CL el sufijo.

Definición del conector (UI)

La definición del conector controla cómo aparece el conector en la galería de conectores de datos de Microsoft Sentinel. Para más información, consulte Referencia de api de definiciones de conectores de datos.

La definición del conector incluye:

  • Título, descripción y marca del conector
  • Requisitos previos y permisos necesarios, como el acceso al área de trabajo y los permisos Entra
  • Pasos de instrucciones para la implementación
  • Controles de interfaz de usuario para mostrar los detalles de conexión a los usuarios

Elementos clave de la interfaz de usuario:

  • DeployPushConnectorButton: desencadena la implementación automatizada de recursos.
  • CopyableLabel: muestra los detalles de conexión después de la implementación (usa fillWith el parámetro )
  • Markdown: proporciona instrucciones con formato y contexto.
  • IsConnectedQuery: valida la conectividad del conector en función de los datos recientes.

Estructura de ejemplo (abreviada para mayor claridad):

{
    "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"
                            }
                        }
                    ]
                }
            ]
        }
    }
}

Importante

  • El id en connectorUiConfig debe ser único y coincidir con las referencias en la configuración del conector de datos.
  • Se usa IsConnectedQuery para conectores de producción (valida los datos recientes) o hasDataConnectors para una validación más sencilla.
  • Los fillWith parámetros en CopyableLabel se rellenan automáticamente después del despliegue.
  • Los valores fijos, como el nombre de la transmisión, usan el parámetro value en lugar de fillWith.

Configuración del conector de inserción

La configuración del push connector es la instancia del conector de datos que vincula la definición del conector con los recursos implementados.

Configuración del conector de inserción

  • Vincula la definición del conector (UI) a la aplicación DCR y Entra implementadas.
  • Almacena los detalles de autenticación (id. de aplicación, identificador de entidad de servicio)
  • Registra la configuración de DCR (punto de conexión, identificador inmutable, nombre de secuencia)
  • Permite que la interfaz de usuario recupere y muestre los detalles de conexión a los usuarios.

Propiedades clave:

  • connectorDefinitionName: debe coincidir con el id en la definición del conector.
  • dcrConfig: contiene el punto de conexión de DCR, el identificador de regla y el nombre de la secuencia.
  • auth: Contiene el identificador de la aplicación Entra y el identificador de entidad de servicio.
  • kind: debe ser "Push" para los conectores push.

Ejemplo:

{
  "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'))]"
  }
}

Importante

  • connectorDefinitionName debe coincidir exactamente con la definición del idconector.
  • streamName debe coincidir con la secuencia declarada en el DCR.
  • Este recurso se crea automáticamente durante la implementación cuando los usuarios seleccionan el botón DeployPushConnector .

Creación del primer conector de inserción

En este ejemplo, construirás un conector de inserción sencillo que envía alertas de seguridad desde tu aplicación a Sentinel.

Objetivo: Enviar alertas de seguridad desde tu aplicación a Sentinel en tiempo real

La aplicación envía la estructura de eventos:

{
  "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"
}

Guía paso a paso para crear el conector de inserción

  1. Clonación del repositorio de Azure-Sentinel

    Haz un fork y luego clona el repositorio oficial de Azure-Sentinel en tu máquina local. Este repositorio contiene las herramientas de empaquetado y proporciona la estructura de solución estándar.

    1. Clonación del repositorio
      git clone https://github.com/<YOUR_FORK>/Azure-Sentinel.git

    2. Vaya al directorio Soluciones. cd Azure-Sentinel/Solutions
      La estructura del repositorio incluye:

    • Herramientas/Crear-Azure-Sentinel-Solución/V3/
    • Contiene el script de empaquetado de createSolutionV3.ps1
    • Soluciones/ Donde crearás tu solución de conector
  2. Cree la estructura de carpetas de la solución Cree un directorio de solución en la carpeta Solutions/ siguiendo la convención de nomenclatura estándar. Creación de directorios de soluciones (desde Azure-Sentinel/Solutions/)

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

    La estructura de carpetas tiene el siguiente aspecto:

    Azure-Sentinel/
     └—Soluciones/
        └–– ContosoSecurityAlerts/
            ├—Datos/
            └–– Conectores de datos/
                ├── ContosoSecurityAlerts_ccf/

  3. Define tu tabla

    En la carpeta ContosoSecurityAlerts_ccf, cree un archivo denominado table.json con la definición de tabla personalizada:

    {
      "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. Creación del DCR

    En la carpeta ContosoSecurityAlerts_ccf, cree un archivo denominado DCR.json que defina el flujo de entrada y enruta los datos a la tabla:

    {
      "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. Creación de la definición del conector

    En la carpeta ContosoSecurityAlerts_ccf cree un archivo denominado connectorDefinition.json que defina cómo interactúan los usuarios con el conector en 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. Creación de la configuración del conector de datos

    En la carpeta ContosoSecurityAlerts_ccf, cree un archivo denominado dataConnector.json que vincule la definición del conector a los recursos implementados:

    {
      "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. Crear archivos de metadatos de la solución

    1. Solution_ContosoSecurityAlerts.json En la carpeta Datos, cree Solution_ContosoSecurityAlerts.json con los detalles de la solución:

      {
           "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
      }
      

      Importante

      Requisitos críticos del campo:

      • BasePath: actualice la ruta de acceso local efectiva al repositorio de Azure-Sentinel.
      • Metadata: debe hacer referencia SolutionMetadata.json (creado en el paso 6B)
      • Version: versionado semántico, por ejemplo, 3.0.0
      • TemplateSpec: siempre true para las soluciones de Hub de Contenido
      • Is1Pconnector: se establece en false para los conectores asociados o personalizados.
    2. Creación de SolutionMetadata.json en la raíz de la solución

      En la carpeta ContosoSecurityAlerts, cree SolutionMetadata.json en el directorio raíz de la solución (el mismo nivel que la carpeta 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"
        }
      }
      

      Necesita el archivo SolutionMetadata.json para el empaquetado de Content Hub.

      • La herramienta de empaquetado espera este archivo en la raíz de la solución
      • Contiene metadatos del mercado para la distribución del Content Hub
    3. Creación de ReleaseNotes.md en la raíz de la solución

      Version Fecha de modificación (DD-MM-YYYY) Historial de cambios
      3.0.0 DD-MM-YYYY Solución de ejemplo

    Lista de comprobación de validación

    Antes de continuar con el paso siguiente, compruebe:

    • El nombre de la carpeta no tiene espacios, por ejemplo ContosoSecurityAlerts
    • Name campo de Solution_ContosoSecurityAlerts.json coincide exactamente con el nombre de carpeta
    • SolutionMetadata.json existe en la raíz de la solución (no en la carpeta Datos)
    • BasePath apunta a la ruta local real del repositorio de Azure-Sentinel
    • Metadata field hace referencia a "SolutionMetadata.json"
    • publisherId y offerId coinciden entre ambos archivos
  8. Comprobación de la estructura de la solución

    Confirme que la estructura de carpetas coincide con el diseño necesario con todos los archivos en su lugar:

    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. Empaquetar la solución

    Use la herramienta de empaquetado de createSolutionV3.ps1 para generar la plantilla de implementación de 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
    

    El script se ejecuta automáticamente:

    • Valida la estructura del directorio Data/
    • Procesa artefactos del conector

    Salida esperada:

    El script de empaquetado muestra una validación fallida de arm-ttk (Kit de herramientas de plantillas de Azure Resource Manager). Este fallo es esperado y normal para los conectores push CCF:

    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!
    

    El empaquetado se realizó correctamente si ve los tres mensajes de validación JSON que confirman archivos válidos. Puede omitir el error arm-ttk para los conectores de inserción CCF.

    Para obtener más información, consulte la documentación deAzure-Sentinel Solutions Tools.

  10. Implementación del paquete de solución

    Implemente la plantilla de ARM generada (Package/mainTemplate.json) en la suscripción de Azure.

    1. En Azure Portal, busque Implementación de una plantilla personalizada.
    2. Seleccione Compilar su propia plantilla en el editor.
    3. Seleccione Cargar archivo y seleccione Package/mainTemplate.json en la carpeta de salida.
    4. Seleccione Guardar.
    5. Rellene los parámetros de implementación:
      • Suscripción: Su suscripción de Azure
      • Grupo de recursos: El grupo de recursos que contiene el área de trabajo de Sentinel
      • Región: Misma región que el área de trabajo de Sentinel
      • Área de trabajo: Nombre del área de trabajo de Log Analytics
    6. Seleccione Revisar y crear y, después, Crear.

    Esta implementación hace que el conector esté disponible en la galería de conectores de datos de Microsoft Sentinel.

    Para ver los pasos detallados, consulte [Inicio rápido: Creación e implementación de plantillas de ARM mediante Azure Portal](/azure/azure-resource-manager/templates/ quickstart-create-templates-use-the-portal).

  11. Habilitación del conector de datos

    Después de implementar el paquete de solución, habilite el conector para aprovisionar recursos y generar credenciales.

    1. En Azure Portal, vaya al área de trabajo de Microsoft Sentinel.
    2. Vaya a Configuración>Conectores de datos
    3. Busque y seleccione Alertas de seguridad de Contoso (Push)
    4. Seleccione Abrir página del conector
    5. Seleccione el botón Deploy Contoso Security Alerts connector (Implementar el conector de alertas de seguridad de Contoso ).
    6. Espere a que se complete la implementación (crea una tabla personalizada, DCR, DCE, aplicación Entra con credenciales).
    7. Copie los detalles de conexión que aparecen:
      • Id. de inquilino
      • Id. de aplicación (cliente)
      • Secreto del cliente
      • URI del punto de conexión de recopilación de datos
      • Identificador inmutable de la regla de recopilación de datos
      • Nombre de la secuencia: Custom-ContosoSecurityAlerts
  12. Configurar la aplicación

    Actualice el código de la aplicación con las credenciales y los detalles del recurso del paso 10. El código usa el flujo de credenciales de cliente de OAuth 2.0 para autenticarse con Azure Monitor.

    Caution

    Proteger las credenciales: nunca codifique de forma rígida las credenciales (id. de inquilino, id. de aplicación, secreto de cliente) directamente en el código de la aplicación o confírmelas en el control de código fuente. Use soluciones de almacenamiento de credenciales seguras como:

    • Azure Key Vault para aplicaciones de producción
    • Variables de entorno o archivos de configuración (excluidos del control de código fuente)
    • Identidades administradas cuando corresponda
    • Herramientas de administración de secretos que cifran las credenciales en reposo

    Código de aplicación de ejemplo de Python:

    En el ejemplo siguiente se usan valores de marcador de posición como <Your-Tenant-ID>. Reemplace estos valores por referencias seguras a las credenciales reales.

    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. Consulta tus datos

    Después de enviar alertas, consulte en Sentinel. Permita 5-10 minutos para la primera ingesta.

    // 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
    

Ahora que comprende los conectores CCF Push, siga estos pasos:

  1. Diseñar el esquema de datos : identifique los eventos que desea enviar y sus campos.
  2. Creación de artefactos de conector: cree los cuatro archivos JSON (tabla, DCR, definición de conector, conector de datos).
  3. Organizar la estructura de la solución : configure Data/ y Data Connectors/ carpetas con la nomenclatura adecuada.
  4. Empaquetar la solución : use createSolutionV3.ps1 para generar plantillas de implementación.
  5. Implementación y prueba: implemente en el área de trabajo de Sentinel y valide el flujo de datos.
  6. Integración con la aplicación : agregue código para enviar eventos en tiempo real.
  7. Crear alertas y libros de trabajo - use sus datos para la supervisión de seguridad.

Recursos adicionales

Documentación de CCF

Recopilación de datos y Azure Monitor

Autenticación y seguridad

Microsoft Sentinel

Obtención de ayuda

  • Para socios ISV que crean integraciones, póngase en contacto con: azuresentinelpartner@microsoft.com
  • Para preguntas técnicas, use Q&A de Microsoft con la etiqueta "azure-sentinel".