Connecteurs Push CCF Microsoft Sentinel (préversion) - Guide de prise en main

Ce guide vous aide à comprendre, créer et déployer des connecteurs sans code push pour Microsoft Sentinel en utilisant le Codeless Connector Framework (CCF) Push (préversion).

Qu’est-ce que le push CCF ?

Les connecteurs Push CCF permettent à vos applications d’envoyer des événements de sécurité directement à Microsoft Sentinel en temps réel. Contrairement aux connecteurs traditionnels basés sur l’interrogation qui extraient régulièrement des données à partir d’API, les connecteurs push vous permettent d’envoyer des données à Sentinel en tant qu’événements se produisent dans votre système.

CCF Push offre plusieurs avantages clés :

  • Flux de données contrôlé par l’application : Votre application contrôle quand et comment envoyer des données, en activant des stratégies de traitement par lots intelligentes et l’utilisation optimisée du réseau.
  • Ingestion en temps réel : Envoyez des données immédiatement à mesure que des événements se produisent, sans attendre les intervalles d’interrogation.
  • Architecture simplifiée : Il n’est pas nécessaire de conserver les points de terminaison d’API pour que Sentinel interroge.
  • Approvisionnement basé sur des modèles : Le déploiement crée des modèles ARM pour les contrôleurs de domaine, les tables personnalisées, l’inscription d’application Entra et les secrets clients. Vous recevez les détails de connexion à configurer dans votre application d’envoi.
  • Authentification sécurisée : Utilise les applications Microsoft Entra avec OAuth 2.0 pour la soumission de données sécurisées.

Logiciels requis

  • Avant de commencer, vous devez avoir accès au dépôt GitHub Azure-Sentinel pour les outils d’empaquetage.
  • Autorisations Microsoft Entra :
    • Autorisation de créer une inscription d’application dans Microsoft Entra ID. Nécessite généralement le rôle Développeur d’applications dans Entra ID ou un rôle supérieur.
    • Autorisation de créer une application avec des secrets. Si vous n’accordez pas cette autorisation, le connecteur échoue en raison de raisons de sécurité.
    • L’éditeur doit avoir le rôle approprié pour récupérer des jetons à partir de l’application Microsoft Entra. Ces jetons sont requis pour l’authentification des demandes au point de terminaison de collecte de données (DCE), qui est le point de terminaison où le connecteur envoie finalement ses données. Si le fournisseur ne peut pas récupérer de jetons, les données ne peuvent pas être envoyées à la DCE.
  • Autorisations Microsoft Azure :
    • Autorisation d’attribuer le rôle Éditeur de métriques de surveillance sur la règle de collecte de données (DCR). Nécessite généralement le rôle Propriétaire Azure RBAC ou le rôle Administrateur de l’accès utilisateur.

Comment fonctionne le push CCF

Modèle push et modèle pull

Comprendre la différence entre les modèles d’ingestion de données push et pull vous aide à choisir le type de connecteur approprié pour votre scénario.

Connecteurs CCF en mode pull – basés sur l’interrogation :

Dans le modèle d’extraction, Microsoft Sentinel interroge régulièrement votre API pour récupérer des données :

  • Microsoft Sentinel lance des connexions à votre API de source de données selon une planification configurée.
  • Les données arrivent à intervalles d’interrogation réguliers, comme toutes les cinq minutes.
  • Vous devez conserver un point de terminaison d’API accessible publiquement.
  • L’infrastructure d’interrogation de Sentinel gère le processus de collecte de données.

Connecteurs push CCF - Pilotés par les événements :

Dans le modèle Push, votre application envoie des données directement à Microsoft Sentinel :

  • Votre application lance la soumission de données lorsque des événements se produisent.
  • Les données arrivent en quasi temps réel à mesure que les événements sont générés.
  • Vous n’avez pas besoin de gérer un point de terminaison d’API.
  • Votre application contrôle l’optimisation du traitement par lots, du minutage et du flux de données.

Flux de données Push

Le flux de données push CCF se compose de cinq étapes principales :

  1. Vous déployez le connecteur dans Microsoft Sentinel.

  2. Azure crée automatiquement les ressources suivantes :

    • Application Microsoft Entra avec des informations d’identification
    • Règle de collecte de données (DCR) : définit comment traiter vos données
    • Point de terminaison de collecte de données (DCE) : URL où vous envoyez des données
    • Table de journaux personnalisée - où vos données sont stockées
    • Attributions de rôles - autorisations pour l’application Entra
  3. Vous recevez les détails de connexion suivants :

    • ID du locataire
    • ID d’application (client)
    • Clé secrète client
    • URI DCE (URL de point de terminaison)
    • ID immuable DCR
    • Nom du flux
  4. Votre application envoie les données suivantes :

    • Obtient un jeton OAuth 2.0 à l’aide des informations d’identification de l’application Entra générées par CCF. Pour plus d’informations, consultez le flux d’informations d’identification du client OAuth 2.0
    • Met en forme des événements en tant que JSON correspondant à votre schéma de table
    • Envoie des données en POST vers le point de terminaison DCE
  5. Azure traite et stocke les données :

    • DCRs transforment les données (transformations KQL facultatives)
    • Les données sont écrites dans la table personnalisée dans Log Analytics
    • Les données sont disponibles pour les requêtes, l’analytique et les alertes dans Sentinel

Artefacts push CCF

Une solution de connecteur Push CCF se compose de quatre composants principaux :

  • Définition de table personnalisée
  • Règle de collecte de données (DCR)
  • Définition du connecteur (interface utilisateur)
  • Configuration du connecteur Push

Définition de table personnalisée

Qu’est-ce que c’est : Schéma qui définit la structure de vos données dans Log Analytics.

Exigences clés :

  • Le nom de la table doit se terminer par _CL (suffixe de journal personnalisé).
  • Doit inclure une TimeGenerated colonne (type date-heure).
  • Types de colonnes : chaîne, int, long, real, bool, datetime, dynamic, guid.
  • Utilisez la version 2025-07-01 de l’API ou une version ultérieure.
  • Pour plus d’informations, consultez Créer une table personnalisée dans Azure Monitor Logs.

Exemple :

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

Règle de collecte de données (DCR)

Qu’est-ce que c’est : Définit la façon dont Azure Monitor ingère et traite vos données. Pour plus d’informations, consultez Règles de collecte de données dans Azure Monitor.

Résultat :

  • Spécifie le nom du flux d’entrée (que votre application utilise lors de l’envoi de données)
  • Définit des transformations KQL facultatives pour mettre en forme et enrichir des données
  • Route les données vers la table de destination
  • Liens vers le point de terminaison de collecte de données (DCE)

Composants clés :

  • streamDeclarations: définit la structure des données entrantes (doit correspondre à ce que votre application envoie)
  • destinations: Emplacement des données (votre espace de travail Log Analytics)
  • dataFlows: pipeline de transformation du flux d’entrée vers la table de sortie
  • dataCollectionEndpointId: liens vers la DCE pour l’ingestion de données

Exemple :

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

  • Le nom du flux doit commencer par le préfixe Custom-.
  • La fonctionnalité transformKql peut être configurée simplement "source" pour un passage direct ou inclure une logique KQL pour transformer les données.
  • outputStream doit correspondre à votre nom de table avec Custom- le préfixe et _CL le suffixe.

Définition du connecteur (interface utilisateur)

La définition du connecteur contrôle l’affichage du connecteur dans la galerie de connecteurs de données Microsoft Sentinel. Pour plus d’informations, consultez la référence de l’API Définitions de connecteur de données.

La définition du connecteur inclut les éléments suivants :

  • Titre, description et personnalisation du connecteur
  • Conditions préalables et autorisations requises, telles que l’accès à l’espace de travail et les autorisations Entra
  • Étapes d’instruction pour le déploiement
  • Contrôles d’interface utilisateur pour afficher les détails de connexion aux utilisateurs

Éléments clés de l’interface utilisateur :

  • DeployPushConnectorButton: déclenche le déploiement automatique des ressources
  • CopyableLabel: affiche les détails de connexion après le déploiement (utilise un fillWith paramètre)
  • Markdown: fournit des instructions et un contexte mis en forme
  • IsConnectedQuery: valide la connectivité du connecteur en fonction des données récentes

Exemple de structure (abrégée pour plus de clarté) :

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

  • L’élément id dans connectorUiConfig doit être unique et correspondre aux références dans la configuration du connecteur de données.
  • Utiliser IsConnectedQuery pour les connecteurs de production (valide les données récentes) ou hasDataConnectors pour une validation plus simple.
  • Les paramètres dans fillWith sont CopyableLabel renseignés automatiquement après le déploiement.
  • Les valeurs fixes, telles que le nom du flux, utilisent le value paramètre au lieu de fillWith.

Configuration du connecteur Push

La configuration du connecteur Push est l’instance du connecteur de données qui lie la définition du connecteur aux ressources déployées.

Configuration du connecteur Push

  • Lie la définition du connecteur (interface utilisateur) à l’application DCR et Entra déployée
  • Stocke les détails de l’authentification (ID d’application, ID du principal de service)
  • Enregistre la configuration DCR (point de terminaison, ID immuable, nom de flux)
  • Permet à l’interface utilisateur de récupérer et d’afficher les détails de connexion aux utilisateurs

Propriétés de clé :

  • connectorDefinitionName: doit correspondre à la id définition de votre connecteur
  • dcrConfig: contient le point de terminaison DCR, l’ID de règle et le nom du flux
  • auth: contient l’ID de l'application Entra et l’ID du principal du service
  • kind : doit être « Push » pour les connecteurs de type « Push »

Exemple :

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

  • Le connectorDefinitionName doit correspondre exactement à la définition du idconnecteur.
  • L'élément streamName doit correspondre au flux déclaré dans votre DCR.
  • Cette ressource est créée automatiquement pendant le déploiement lorsque les utilisateurs sélectionnent le bouton DeployPushConnector .

Création de votre premier connecteur Push

Dans cet exemple, vous créez un connecteur Push simple qui envoie des alertes de sécurité de votre application à Sentinel.

Objectif: Envoyer des alertes de sécurité de votre application à Sentinel en temps réel

Votre application envoie la structure d’événements :

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

Guide pas à pas pour créer le connecteur Push

  1. Cloner le référentiel Azure-Sentinel

    Fork clone ensuite le référentiel officiel Azure-Sentinel sur votre ordinateur local. Ce référentiel contient les outils d’empaquetage et fournit la structure de solution standard.

    1. Cloner le référentiel
      git clone https://github.com/<YOUR_FORK>/Azure-Sentinel.git

    2. Accédez au répertoire Solutions cd Azure-Sentinel/Solutions
      La structure du référentiel comprend les éléments suivants :

    • Outils/Créer-Azure-Sentinel-Solution/V3/
    • Contient le script d’empaquetage de createSolutionV3.ps1
    • Solutions/ Où vous allez créer votre solution de connecteur
  2. Créez votre structure de dossiers de solution : créez un répertoire de solution dans le dossier Solutions/ suivant la convention d’affectation de noms standard. Créer des répertoires de solution (à partir d’Azure-Sentinel/Solutions/)

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

    Votre structure de dossiers ressemble à ce qui suit :

    Azure-Sentinel/
     └>> Solutions/
        └>> ContosoSecurityAlerts/
            ├── Données/
            └── Connecteurs de données/
                └>> ContosoSecurityAlerts_ccf/

  3. Définissez votre table

    Dans le dossier ContosoSecurityAlerts_ccf, créez un fichier nommé table.json avec votre définition de table personnalisée :

    {
      "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. Créer le DCR

    Dans le dossier ContosoSecurityAlerts_ccf, créez un fichier nommé DCR.json qui définit le flux d’entrée et achemine les données vers votre table :

    {
      "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. Créer la définition du connecteur

    Dans le dossier ContosoSecurityAlerts_ccf créez un fichier nommé connectorDefinition.json qui définit la façon dont les utilisateurs interagissent avec le connecteur dans 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. Créer la configuration du connecteur de données

    Dans le dossier ContosoSecurityAlerts_ccf, créez un fichier nommé dataConnector.json qui lie la définition du connecteur aux ressources déployées :

    {
      "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. Créer des fichiers de métadonnées de solution

    1. Solution_ContosoSecurityAlerts.json Dans le dossier Données, créez Solution_ContosoSecurityAlerts.json avec les détails de votre solution :

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

      Exigences de champ critiques :

      • BasePath: Mettez à jour votre chemin d'accès local actuel vers le référentiel Azure-Sentinel
      • Metadata: doit référencer SolutionMetadata.json (créée à l’étape 6B)
      • Version: contrôle de version sémantique, par exemple, 3.0.0
      • TemplateSpec: Toujours true pour les solutions Content Hub
      • Is1Pconnector : défini sur false pour les connecteurs partenaires/personnalisés
    2. Créer SolutionMetadata.json à la racine de la solution

      Dans le dossier ContosoSecurityAlerts, créez SolutionMetadata.json au répertoire racine de la solution (même niveau que le dossier Données) :

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

      Vous avez besoin du fichier SolutionMetadata.json pour l’empaquetage du hub de contenu :

      • L’outil d’empaquetage attend ce fichier à la racine de la solution
      • Il contient les métadonnées du marketplace pour la distribution via le Content Hub.
    3. Créer ReleaseNotes.md à la racine de la solution

      Version Date de modification (DD-MM-YYYY) Historique des modifications
      3.0.0 DD-MM-YYYY Exemple de solution

    Liste de contrôle de validation

    Avant de passer à l’étape suivante, vérifiez :

    • Le nom du dossier n’a pas d’espaces, par exemple ContosoSecurityAlerts
    • Name champ dans Solution_ContosoSecurityAlerts.json correspond exactement au nom du dossier
    • SolutionMetadata.json existe à la racine de la solution (pas dans le dossier Données)
    • BasePath pointe vers votre chemin d’accès au référentiel Azure-Sentinel local réel
    • Metadata référence de champ « SolutionMetadata.json »
    • Les valeurs publisherId et offerId correspondent dans les deux fichiers
  8. Vérifier la structure de votre solution

    Vérifiez que votre structure de dossiers correspond à la disposition requise avec tous les fichiers en place :

    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. Empaqueter votre solution

    Utilisez l’outil d’empaquetage createSolutionV3.ps1 pour générer le modèle de déploiement 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
    

    Le script fonctionne automatiquement :

    • Valide votre structure de données/dossiers
    • Traite les artefacts du connecteur

    Sortie attendue :

    Le script d’empaquetage affiche une validation arm-ttk (Azure Resource Manager Template Toolkit) ayant échoué. Cet échec est attendu et normal pour les connecteurs 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!
    

    L’empaquetage a réussi si vous voyez les trois messages de validation JSON confirmant les fichiers valides. Vous pouvez ignorer l’échec arm-ttk des connecteurs Push CCF.

    Pour plus d’informations, consultez la documentation « Azure-Sentinel Solutions Tools ».

  10. Déployer le package de solution

    Déployez le modèle ARM généré (Package/mainTemplate.json) sur votre abonnement Azure.

    1. Dans le portail Azure, recherchez Déployer un modèle personnalisé
    2. Sélectionnez Créer votre propre modèle dans l’éditeur
    3. Sélectionnez Charger le fichier et sélectionnez Package/mainTemplate.json dans votre dossier de sortie.
    4. Sélectionnez Enregistrer.
    5. Renseignez les paramètres de déploiement :
      • Abonnement: Votre abonnement Azure
      • Groupe de ressources : Groupe de ressources contenant votre espace de travail Sentinel
      • Région: Même région que votre espace de travail Sentinel
      • Espace: Nom de votre espace de travail Log Analytics
    6. Sélectionnez Vérifier + créer, puis Créer

    Ce déploiement rend le connecteur disponible dans votre galerie de connecteurs de données Microsoft Sentinel.

    Pour obtenir des instructions détaillées, consultez [Démarrage rapide : Créer et déployer des modèles ARM à l’aide du portail Azure](/azure/azure-resource-manager/templates/ quickstart-create-templates-use-the-portal).

  11. Activer le connecteur de données

    Après avoir déployé le package de solution, activez le connecteur pour provisionner des ressources et générer des informations d’identification.

    1. Dans le portail Azure, accédez à votre espace de travail Microsoft Sentinel
    2. Accéder à Configuration>Connecteurs de données
    3. Rechercher et sélectionner Alertes de sécurité Contoso (Push)
    4. Sélectionnez Ouvrir la page du connecteur
    5. Sélectionnez le bouton Déployer le connecteur Alertes de sécurité Contoso
    6. Attendez que le déploiement se termine (crée une table personnalisée, DCR, DCE, Entra application avec des informations d’identification)
    7. Copiez les détails de connexion qui s’affichent :
      • ID du locataire
      • ID d’application (client)
      • Clé secrète client
      • URI du point de terminaison de collecte de données
      • Règle de collecte de données avec ID immuable
      • Nom du flux : Custom-ContosoSecurityAlerts
  12. Configurer votre application

    Mettez à jour le code de votre application avec les informations d’identification et les détails des ressources de l’étape 10. Le code utilise le flux d’informations d’identification du client OAuth 2.0 pour s’authentifier auprès d’Azure Monitor.

    Caution

    Protégez vos informations d’identification : ne jamais coder en dur les informations d’identification (ID de locataire, ID d’application, clé secrète client) directement dans votre code d’application ou les valider dans le contrôle de code source. Utilisez des solutions de stockage d’informations d’identification sécurisées telles que :

    • Azure Key Vault pour les applications de production
    • Variables d’environnement ou fichiers de configuration (exclus du contrôle de code source)
    • Identités managées le cas échéant
    • Outils de gestion des secrets qui chiffrent les informations d’identification au repos

    Exemple de code d’application Python :

    L’exemple suivant utilise des valeurs d’espace réservé telles que <Your-Tenant-ID>. Remplacez ces valeurs par des références sécurisées à vos informations d’identification réelles.

    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. Interroger vos données

    Après l’envoi d’alertes, effectuez une requête dans Sentinel. Laissez 5 à 10 minutes pour la première ingestion.

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

Maintenant que vous comprenez les connecteurs Push CCF, procédez comme suit :

  1. Concevez votre schéma de données : identifiez les événements que vous souhaitez envoyer et leurs champs.
  2. Créer des artefacts de connecteur : générez les quatre fichiers JSON (table, DCR, définition du connecteur, connecteur de données).
  3. Organiser la structure de la solution : configurez les dossiers Data/ et Data Connectors/ en respectant les conventions de nommage appropriées.
  4. Empaqueter votre solution : permet createSolutionV3.ps1 de générer des modèles de déploiement.
  5. Déployer et tester - Déployer sur votre espace de travail Sentinel et valider le flux de données.
  6. Intégrer à votre application : ajoutez du code pour envoyer des événements en temps réel.
  7. Créer des alertes et des classeurs : utilisez vos données pour la surveillance de la sécurité.

Ressources additionnelles

Documentation CCF

Azure Monitor et collecte de données

Authentification et sécurité

Microsoft Sentinel

Obtenir de l’aide

  • Pour les partenaires ISV qui développent des intégrations, contactez : azuresentinelpartner@microsoft.com
  • Pour des questions techniques, utilisez Microsoft Q&A avec la balise « azure-sentinel ».