Créer un connecteur sans code pour Microsoft Sentinel

L’infrastructure CCF (Codeless Connector Framework) offre aux partenaires, aux utilisateurs avancés et aux développeurs la possibilité de créer des connecteurs personnalisés pour ingérer des données à Microsoft Sentinel.

Les connecteurs créés à l’aide du CCF sont entièrement SaaS, sans aucune exigence pour les installations de service. Ils incluent également la surveillance de l’intégrité et la prise en charge complète de Microsoft Sentinel.

Procédez comme suit pour créer votre connecteur CCF et connecter votre source de données à Microsoft Sentinel

  • Créer le connecteur de données
  • Créer le modèle ARM
  • Déployer le connecteur
  • Connecter Microsoft Sentinel à votre source de données et commencer à ingérer des données

Cet article vous montre comment effectuer chaque étape et fournir un exemple de connecteur sans code à générer en cours de route.

Si vous êtes un partenaire de développement logiciel et que vous avez besoin d’aide pour créer un connecteur de données CCF, contactez Microsoft Sentinel Partenaires à l’adresse AzureSentinelPartner@microsoft.com pour obtenir de l’aide.

En quoi ce CCF est-il différent de la version précédente ?

La version initiale du CCF a été annoncée en janvier 2022. Depuis lors, nous avons amélioré la plateforme et la version héritée n’est plus recommandée. Cette nouvelle version du CCF présente les améliorations clés suivantes :

  1. Meilleure prise en charge des différents types d’authentification et de pagination.

  2. Prend en charge les règles de collecte de données (DCR) standard.

  3. Les parties de configuration de l’interface utilisateur et de la connexion du connecteur sans code sont désormais séparées. Cela permet de créer des connecteurs avec plusieurs connexions, ce qui n’était pas possible auparavant.

Configuration requise

Avant de créer un connecteur, comprenez votre source de données et comment Microsoft Sentinel devez vous connecter.

  1. Point de terminaison de collecte de données (DCE)

    Un DCE est une exigence pour une DCR. Un seul DCE est créé par déploiement de DCR de l’espace de travail Log Analytics. Chaque DCR déployée pour un espace de travail Microsoft Sentinel utilise le même DCE. Pour plus d’informations sur la façon d’en créer un ou si vous en avez besoin, consultez Points de terminaison de collecte de données dans Azure Monitor.

  2. Schéma de la ou des tables de sortie.

    Il est important de comprendre la forme de votre flux de données et les champs que vous souhaitez inclure dans la table de sortie. Référencez la documentation de votre source de données ou analysez des exemples de sortie suffisants.

Recherchez les composants suivants et vérifiez leur prise en charge dans la référence de l’API Data Connector :

  1. Structure de requête et de réponse HTTP à la source de données

  2. Authentification requise par la source de données.
    Par exemple, si votre source de données nécessite un jeton signé avec un certificat, la référence de l’API du connecteur de données spécifie que l’authentification par certificat n’est pas prise en charge.

  3. Options de pagination dans la source de données

Test des API

Nous vous recommandons de tester vos composants avec un outil de test d’API comme l’un des suivants :

Attention

Pour les scénarios où vous disposez de données sensibles, telles que des informations d’identification, des secrets, des jetons d’accès, des clés API et d’autres informations similaires, veillez à utiliser un outil qui protège vos données avec les fonctionnalités de sécurité nécessaires, fonctionne hors connexion ou localement, ne synchronise pas vos données avec le cloud et ne nécessite pas de vous connecter à un compte en ligne. De cette façon, vous réduisez le risque lié à l’exposition de données sensibles au public.

Créer le connecteur de données

Conseil

Si vous êtes un éditeur de logiciels indépendant (ISV) et que vous avez besoin d’aide lors de la création d’une intégration Microsoft Sentinel à l’aide de l’infrastructure de connecteur sans code Microsoft Sentinel, l’équipe Microsoft App Assure peut être en mesure de vous aider. Pour impliquer l’équipe App Assure, envoyez un e-mail à azuresentinelpartner@microsoft.com.

Quatre composants sont nécessaires pour générer le connecteur de données CCF.

  1. Définition de table de sortie
  2. Règle de collecte de données (DCR)
  3. Interface utilisateur du connecteur de données
  4. Règles de connexion du connecteur de données

Chaque composant comporte une section détaillant le processus à créer et à valider. Prenez le JSON de chaque composant pour l’empaquetage final du modèle ARM.

Définition de table de sortie

Conseil

Ignorez cette étape si vos données sont ingérées uniquement dans des tables Log Analytics standard. CommonSecurityLog et ASimDnsActivityLogs sont des exemples de tables standard. Pour plus d’informations sur la liste complète des types de données standard pris en charge, consultez Prise en charge de la transformation de données pour les connecteurs de données personnalisés.

Si votre source de données n’est pas conforme au schéma d’une table standard, vous avez deux options :

  • Créer une table personnalisée pour toutes les données
  • Créer une table personnalisée pour certaines données et fractionner les données conformes à une table standard

Utilisez l’interface utilisateur Log Analytics pour une méthode simple afin de créer une table personnalisée avec une DCR. Si vous créez la table personnalisée à l’aide de l’API Tables ou d’une autre méthode programmatique, ajoutez le _CL suffixe manuellement au nom de la table. Pour plus d’informations, consultez Créer une table personnalisée.

Pour plus d’informations sur le fractionnement de vos données en plusieurs tables, consultez les exemples de données et l’exemple de table personnalisée créé pour ces données.

Règle de collecte de données

Les règles de collecte de données (DCR) définissent le processus de collecte de données dans Azure Monitor. Les DCR spécifient les données à collecter, comment les transformer et où les envoyer.

  • Il n’y a qu’une seule DCR qui est déployée par connecteur de données.
  • Une DCR doit avoir un DCE correspondant dans la même région.
  • Lorsque le connecteur de données CCF est déployé, le DCR est créé s’il n’existe pas déjà.

Référencez les informations les plus récentes sur les DCR dans ces articles :

Pour obtenir un didacticiel illustrant la création d’un DCE, notamment l’utilisation d’exemples de données pour créer la table personnalisée et la DCR, consultez Tutoriel : Envoyer des données à Azure Surveiller les journaux avec l’API d’ingestion des journaux (Portail Azure) . Utilisez le processus de ce tutoriel pour vérifier que les données sont ingérées correctement dans votre table avec votre DCR.

Pour comprendre comment créer une DCR complexe avec plusieurs flux de données, consultez la section Exemple de DCR.

Interface utilisateur du connecteur de données

Ce composant restitue l’interface utilisateur du connecteur de données dans la galerie de connecteurs de données Microsoft Sentinel. Chaque connecteur de données ne peut avoir qu’une seule définition d’interface utilisateur.

Créez l’interface utilisateur du connecteur de données avec l’API Définition du connecteur de données. Utilisez la référence définitions du connecteur de données comme complément pour expliquer les éléments d’API plus en détail.

Remarques :

  1. La kind propriété du connecteur d’interrogation d’API doit toujours être Customizable.
  2. Comme il s’agit d’un type de connecteur d’interrogation d’API, définissez le type sur connectivityCriteriahasDataConnectors
  3. L’exemple instructionSteps inclut un bouton de type ConnectionToggleButton. Ce bouton permet de déclencher le déploiement de règles de connecteur de données en fonction des paramètres de connexion spécifiés.

Utilisez un outil de test d’API pour appeler l’API de définitions de connecteur de données afin de créer l’interface utilisateur du connecteur de données afin de la valider dans la galerie de connecteurs de données.

Pour en savoir plus sur un exemple, consultez la section Exemple de référence de définitions de connecteur de données.

Règles de connexion de données

Il existe actuellement trois types de règles de connexion de données possibles pour définir votre connecteur de données CCF.

Utilisez un outil de test d’API pour appeler l’API du connecteur de données afin de créer le connecteur de données qui combine les règles de connexion et les composants précédents. Vérifiez que le connecteur est maintenant connecté dans l’interface utilisateur.

Sécuriser l’entrée confidentielle

Quelle que soit l’authentification utilisée par votre connecteur de données CCF, procédez comme suit pour garantir la sécurité des informations confidentielles. L’objectif est de transmettre les informations d’identification du modèle ARM au CCF sans laisser d’objets confidentiels lisibles dans votre historique de déploiements.

Créer une étiquette

La définition du connecteur de données crée un élément d’interface utilisateur pour demander des informations d’identification de sécurité. Par exemple, si votre connecteur de données s’authentifie auprès d’une source de journal avec OAuth, la section définition de votre connecteur de données inclut le OAuthForm type dans les instructions. Cela configure le modèle ARM pour demander les informations d’identification.

"instructions": [
    {
        "type": "OAuthForm",
        "parameters": {
        "UsernameLabel": "Username",
        "PasswordLabel": "Password",
        "connectButtonLabel": "Connect",
        "disconnectButtonLabel": "Disconnect"
        }
    }
],

Stocker les entrées confidentielles

Une section du modèle de déploiement ARM permet à l’administrateur qui déploie le connecteur de données d’entrer le mot de passe. Utilisez securestring pour sécuriser les informations confidentielles dans un objet qui n’est pas lisible après le déploiement. Pour plus d’informations, consultez Recommandations de sécurité pour les paramètres.

"mainTemplate": {
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "[variables('dataConnectorCCPVersion')]",
    "parameters": {
        "Username": {
            "type": "securestring",
            "minLength": 1,
            "metadata": {
                "description": "Enter the username to connect to your data source."
        },
        "Password": {
            "type": "securestring",
            "minLength": 1,
            "metadata": {
                "description": "Enter the API key, client secret or password required to connect."
            }
        },
    // more deployment template information
    }
}

Utiliser les objets securestring

Enfin, le CCF utilise les objets d’informations d’identification dans la section connecteur de données.

"auth": {
    "type": "OAuth2",
    "ClientSecret": "[[parameters('Password')]",
    "ClientId": "[[parameters('Username')]",
    "GrantType": "client_credentials",
    "TokenEndpoint": "https://api.contoso.com/oauth/token",
    "TokenEndpointHeaders": {
        "Content-Type": "application/x-www-form-urlencoded"
    },
    "TokenEndpointQueryParameters": {
        "grant_type": "client_credentials"
    }
},

Remarque

La syntaxe étrange de l’objet d’informations d’identification n’est "ClientSecret": "[[parameters('Password')]", pas une faute de frappe ! Pour créer le modèle de déploiement qui utilise également des paramètres, vous devez placer les paramètres dans cette section dans une séquence d’échappement avec un démarrage[ supplémentaire. Cela permet aux paramètres d’attribuer une valeur en fonction de l’interaction de l’utilisateur avec le connecteur.

Pour plus d’informations, consultez Caractères d’échappement d’expressions de modèle.

Créer le modèle de déploiement

Empaqueter manuellement un modèle ARM (Azure Resource Management) à l’aide de l’exemple d’exemples de code de modèle comme guide. Ces exemples de code sont divisés par des sections de modèle ARM que vous devez associer.

Si vous créez un connecteur de données CCF Google Cloud Platform (GCP), empaquetez le modèle de déploiement à l’aide de l’exemple de modèle CCF GCP. Pour plus d’informations sur la façon de remplir le modèle CCF GCP, consultez Informations de référence sur les règles de connexion du connecteur de données GCP.

En plus des exemples de modèles, les solutions publiées disponibles dans le hub de contenu Microsoft Sentinel utilisent le CCF pour leurs connecteurs de données. Passez en revue les solutions suivantes pour obtenir d’autres exemples montrant comment assembler les composants dans un modèle ARM.

RestApiPoller Exemples de connecteurs de données CCF

GCP Exemples de connecteurs de données CCF

Déployer le connecteur

Déployez votre connecteur sans code en tant que modèle personnalisé.

Conseil

Supprimez les ressources que vous avez créées dans les étapes précédentes. La DCR et la table personnalisée sont créées avec le déploiement. Si vous ne supprimez pas ces ressources avant le déploiement, il est plus difficile de vérifier votre modèle.

  1. Copiez le contenu du modèle de déploiement ARM.
  2. Suivez les instructions modifier et déployer le modèle de l’article Démarrage rapide : Créer et déployer des modèles ARM à l’aide de la Portail Azure.

Maintenir l’isolation réseau pour la source de journalisation

Si votre source de journalisation nécessite une isolation réseau, configurez une liste d’adresses IP publiques utilisées par le CCF.

Azure réseaux virtuels utilisent des étiquettes de service pour définir des contrôles d’accès réseau. Pour le CCF, cette étiquette de service est Scuba.

Pour trouver la plage d’adresses IP actuelle associée à l’étiquette de service Scuba , consultez Utiliser l’API de découverte d’étiquettes de service.

Vérifier le connecteur sans code

Affichez votre connecteur sans code dans la galerie de connecteurs de données. Ouvrez le connecteur de données et renseignez tous les paramètres d’authentification requis pour la connexion. Une fois connecté, la DCR et les tables personnalisées sont créées. Affichez la ressource DCR dans votre groupe de ressources et toutes les tables personnalisées de l’espace de travail Logs Analytics.

Remarque

L’ingestion des données peut prendre jusqu’à 30 minutes.

Exemple

Chaque étape de la création du connecteur sans code est représentée dans les exemples de sections suivants.

Pour illustrer une source de données complexe avec ingestion dans plusieurs tables, cet exemple présente un schéma de table de sortie et une DCR avec plusieurs flux de sortie. L’exemple DCR les rassemble avec ses transformations KQL. Les exemples de définition de l’interface utilisateur du connecteur de données et de règles de connexion continuent à partir de ce même exemple de source de données. Enfin, le modèle de solution utilise tous ces exemples de composants pour montrer de bout en bout comment créer l’exemple de connecteur de données CCF.

Exemples de données

Une source de données retourne le code JSON suivant lors de la connexion à son point de terminaison.

[
        {
        "ts": "3/6/2023 8:15:15 AM",
        "eventType": "Alert",
        "deviceMac": "bc:27:c6:21:1c:70",
        "clientMac": "",
        "srcIp": "10.12.11.106",
        "destIp": "121.93.178.13",
        "protocol": "tcp/ip",
        "priority": "0",
        "message": "This is an alert message"
        },
        {
        "ts": "3/6/2023 8:14:54 AM",
        "eventType": "File",
        "srcIp": "178.175.128.249",
        "destIp": "234.113.125.105",
        "fileType": "MS_EXE",
        "fileSizeBytes": 193688,
        "disposition": "Malicious"
        }
]

Cette réponse contient eventTypealerte et fichier. Les événements de fichier doivent être ingérés dans la table standard normalisée , AsimFileEventLogs, tandis que les événements d’alerte doivent être ingérés dans une table personnalisée.

Exemple de table personnalisée

Pour plus d’informations sur la structure de cette table, consultez API Tables. Les noms de tables de journaux personnalisés doivent avoir un _CL suffixe.

{
"properties": {
    "schema": {
        "name": "ExampleConnectorAlerts_CL",
        "columns": [
        {
          "name": "TimeGenerated",
          "type": "datetime"
        },
        {
          "name": "SourceIP",
          "type": "string"
        },
        {
          "name": "DestIP",
          "type": "string"
        },
        {
          "name": "Message",
          "type": "string"
        },
        {
          "name": "Priority",
          "type": "int"
        }
        ]
      }
    }
}

Exemple de règle de collecte de données

La DCR suivante définit un flux Custom-ExampleConnectorInput unique à l’aide de l’exemple de source de données et transforme la sortie en deux tables.

  1. Le premier flux de données dirige eventType = Alert vers la table personnalisée ExampleConnectorAlerts_CL .
  2. le deuxième flux de données dirige eventType = Le fichier vers la table standard normalisée.ASimFileEventLogs

Pour plus d’informations sur la structure de cet exemple, consultez Structure d’une règle de collecte de données.

Pour créer cette DCR dans un environnement de test, suivez l’API Règles de collecte de données. Les éléments de l’exemple dans {{double curly braces}} indiquent des variables qui nécessitent des valeurs pour faciliter l’utilisation avec un outil de test d’API. Lorsque vous créez cette ressource dans le modèle ARM, les variables exprimées ici sont échangées contre des paramètres.

{
  "location": "{{location}}",
  "properties": {
    "dataCollectionEndpointId": "/subscriptions/{{subscriptionId}}/resourceGroups/{{resourceGroupName}}/providers/Microsoft.Insights/dataCollectionEndpoints/{{dataCollectionEndpointName}}",
    "streamDeclarations": {
      "Custom-ExampleConnectorInput": {
        "columns": [
          {
            "name": "ts",
            "type": "datetime"
          },
          {
            "name": "eventType",
            "type": "string"
          },
          {
            "name": "deviceMac",
            "type": "string"
          },
          {
            "name": "clientMac",
            "type": "string"
          },
          {
            "name": "srcIp",
            "type": "string"
          },
          {
            "name": "destIp",
            "type": "string"
          },
          {
            "name": "protocol",
            "type": "string"
          },
          {
            "name": "priority",
            "type": "string"
          },
          {
            "name": "message",
            "type": "string"
          },
          {
            "name": "fileType",
            "type": "string"
          },
          {
            "name": "fileSizeBytes",
            "type": "int"
          },
          {
            "name": "disposition",
            "type": "string"
          }
        ]
      }
    },
    "destinations": {
      "logAnalytics": [
        {
          "workspaceResourceId": "/subscriptions/{{subscriptionId}}/resourcegroups/{{resourceGroupName}}/providers/microsoft.operationalinsights/workspaces/{{workspaceName}}",
          "name": "{{uniqueFriendlyDestinationName}}"
        }
      ]
    },
    "dataFlows": [
      {
        "streams": [
          "Custom-ExampleConnectorInput"
        ],
        "destinations": [
          "{{uniqueFriendlyDestinationName}}"
        ],
        "transformKql": "source | where eventType == \"Alert\" | project TimeGenerated = ts, SourceIP = srcIp, DestIP = destIp, Message = message, Priority = priority \n",
        "outputStream": "Custom-ExampleConnectorAlerts_CL"
      },
      {
        "streams": [
          "Custom-ExampleConnectorInput"
        ],
        "destinations": [
          "{{uniqueFriendlyDestinationName}}"
        ],
        "transformKql": "source | where eventType == \"File\" | project-rename TimeGenerated = ts, EventOriginalType = eventType, SrcIpAddr = srcIp, DstIpAddr = destIp, FileContentType = fileType, FileSize = fileSizeBytes, EventOriginalSeverity = disposition \n",
        "outputStream": "Microsoft-ASimFileEventLogs"
      }
    ]
  }
}

Exemple de définition d’interface utilisateur de connecteur de données

Cet exemple se trouve dans la référence des définitions du connecteur de données.

Exemples de règles de connexion de connecteur de données

Cet exemple se trouve dans la référence connecteurs de données.

Exemple de modèle ARM

Générez le modèle de déploiement ARM avec la structure suivante, qui inclut les 4 sections des composants JSON nécessaires pour générer le connecteur de données CCF :

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {},
    "variables": {},
    "resources": [],
}

Assemblez les sections avec un éditeur prenant en charge JSON comme Visual Code pour réduire les erreurs de syntaxe telles que les virgules et les crochets fermants et les parenthèses.

Pour guider le processus de création de modèle, les commentaires apparaissent dans les métadonnéesdescription ou inline avec // la notation de commentaire. Pour plus d’informations, consultez Meilleures pratiques relatives aux modèles ARM - commentaires.

Envisagez d’utiliser le kit de ressources de test de modèle ARM (arm-ttk) pour valider le modèle que vous générez. Pour plus d’informations, consultez arm-ttk.

Exemple de modèle ARM - paramètres

Pour plus d’informations, consultez Paramètres dans les modèles ARM.

Avertissement

Utilisez securestring pour tous les mots de passe et secrets dans les objets lisibles après le déploiement des ressources. Pour plus d’informations, consultez Entrée confidentielle sécurisée et Recommandations de sécurité pour les paramètres.

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "location": {
            "type": "string",
            "minLength": 1,
            "defaultValue": "[resourceGroup().location]",
            "metadata": {
                "description": "Not used, but needed to pass the arm-ttk test, 'Location-Should-Not-Be-Hardcoded'. Instead the `workspace-location` derived from the log analytics workspace is used."
            }
        },
        "workspace-location": {
            "type": "string",
            "defaultValue": "",
            "metadata": {
                "description": "[concat('Region to deploy solution resources -- separate from location selection',parameters('location'))]"
            }
        },
        "subscription": {
            "defaultValue": "[last(split(subscription().id, '/'))]",
            "type": "string",
            "metadata": {
                "description": "subscription id where Microsoft Sentinel is configured"
            }
        },
        "resourceGroupName": {
            "defaultValue": "[resourceGroup().name]",
            "type": "string",
            "metadata": {
                "description": "resource group name where Microsoft Sentinel is configured"
            }
        },
        "workspace": {
            "defaultValue": "",
            "type": "string",
            "metadata": {
                "description": "the log analytics workspace enabled for Microsoft Sentinel"
            }
        }
    },
    // Next is the variables section here
}

Exemple de modèle ARM - variables

Ces variables recommandées permettent de simplifier le modèle. Utilisez plus ou moins en fonction des besoins. Pour plus d’informations, consultez Variables dans les modèles ARM.

    "variables": {
        "workspaceResourceId": "[resourceId('microsoft.OperationalInsights/Workspaces', parameters('workspace'))]",
        "_solutionName": "Solution name", // Enter your solution name 
        "_solutionVersion": "3.0.0", // must be 3.0.0 or above
        "_solutionAuthor": "Contoso", // Enter the name of the author
        "_packageIcon": "<img src=\"{LogoLink}\" width=\"75px\" height=\"75px\">", // Enter the http link for the logo. NOTE: This field is only recommended for Azure Global Cloud.
        "_solutionId": "azuresentinel.azure-sentinel-solution-azuresentinel.azure-sentinel-MySolution", // Enter a name for your solution with this format but exchange the 'MySolution' portion
        "dataConnectorVersionConnectorDefinition": "1.0.0",
        "dataConnectorVersionConnections": "1.0.0",
        "_solutionTier": "Community", // This designates the appropriate support - all custom data connectors are "Community"
        "_dataConnectorContentIdConnectorDefinition": "MySolutionTemplateConnectorDefinition", // Enter a name for the connector
        "dataConnectorTemplateNameConnectorDefinition": "[concat(parameters('workspace'),'-dc-',uniquestring(variables('_dataConnectorContentIdConnectorDefinition')))]",
        "_dataConnectorContentIdConnections": "MySolutionTemplateConnections", // Enter a name for the connections this connector makes
        "dataConnectorTemplateNameConnections": "[concat(parameters('workspace'),'-dc-',uniquestring(variables('_dataConnectorContentIdConnections')))]",
        "_logAnalyticsTableId1": "ExampleConnectorAlerts_CL" // Enter the custom table name - not needed if you are ingesting data into standard tables
		// Enter more variables as needed "":""
    },
    // Next is the resources sections here

Exemple de modèle ARM - ressources

Ce guide de modèle comporte 5 ressources de déploiement ARM qui hébergent les 4 composants de création de connecteur de données CCF.

  1. contentTemplates (une ressource parente)
  2. dataConnectorDefinitions : pour plus d’informations, consultez Interface utilisateur du connecteur de données.
  3. métadonnées
  4. contentTemplates
  5. contentPackages
    "resources": [
        // resource section 1 - contentTemplates
        {
            "type": "Microsoft.OperationalInsights/workspaces/providers/contentTemplates",
            "apiVersion": "2023-04-01-preview",
            "name": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/', variables('dataConnectorTemplateNameConnectorDefinition'), variables('dataConnectorVersionConnectorDefinition'))]",
            "location": "[parameters('workspace-location')]",
            "dependsOn": [
                "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/contentPackages', variables('_solutionId'))]"
            ],
            "properties": {
                "contentId": "[variables('_dataConnectorContentIdConnectorDefinition')]",
                "displayName": "[concat(variables('_solutionName'), variables('dataConnectorTemplateNameConnectorDefinition'))]",
                "contentKind": "DataConnector",
                "mainTemplate": {
                    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
                    "contentVersion": "[variables('dataConnectorVersionConnectorDefinition')]",
                    "parameters": {},
                    "variables": {},
                    "resources": [
                        {
                            "name": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/',concat('DataConnector-', variables('_dataConnectorContentIdConnectorDefinition')))]",
                            "apiVersion": "2022-01-01-preview",
                            "type": "Microsoft.OperationalInsights/workspaces/providers/metadata",
                            "properties": {
                                "parentId": "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/dataConnectorDefinitions', variables('_dataConnectorContentIdConnectorDefinition'))]",
                                "contentId": "[variables('_dataConnectorContentIdConnectorDefinition')]",
                                "kind": "DataConnector",
                                "version": "[variables('dataConnectorVersionConnectorDefinition')]",
                                "source": {
                                    "sourceId": "[variables('_solutionId')]",
                                    "name": "[variables('_solutionName')]",
                                    "kind": "Solution"
                                },
                                "author": {
                                    "name": "[variables('_solutionAuthor')]"
                                },
                                "support": {
                                    "name": "[variables('_solutionAuthor')]",
                                    "tier": "[variables('_solutionTier')]"
                                },
                                "dependencies": {
                                    "criteria": [
                                        {
                                            "version": "[variables('dataConnectorVersionConnections')]",
                                            "contentId": "[variables('_dataConnectorContentIdConnections')]",
                                            "kind": "ResourcesDataConnector"
                                        }
                                    ]
                                }
                            }
                        },
                        {
                            "name": "MyDCRV1", // Enter your DCR name
                            "apiVersion": "2021-09-01-preview",
                            "type": "Microsoft.Insights/dataCollectionRules",
                            "location": "[parameters('workspace-location')]",
                            "kind": null,
                            "properties": 
							{ 
                                // Enter your DCR properties here.
                                //  Consider using these variables:
                                //  "dataCollectionEndpointId": "[concat('/subscriptions/',parameters('subscription'),'/resourceGroups/',parameters('resourceGroupName'),'/providers/Microsoft.Insights/dataCollectionEndpoints/',parameters('workspace'))]",
                                //  "workspaceResourceId": "[variables('workspaceResourceId')]",
							}
                        },
                        {
                            "name": "[variables('_logAnalyticsTableId1')]",
                            "apiVersion": "2022-10-01",
                            "type": "Microsoft.OperationalInsights/workspaces/tables",
                            "location": "[parameters('workspace-location')]",
                            "kind": null,
                            "properties": 
							{
								// Enter your log analytics table schema here. 
                                //  Consider using this variable for the name property:
                                //  "name": "[variables('_logAnalyticsTableId1')]",
							}			
                        }
						// Enter more tables if needed.
                    ]
                },
                "packageKind": "Solution",
                "packageVersion": "[variables('_solutionVersion')]",
                "packageName": "[variables('_solutionName')]",
                "contentProductId": "[concat(substring(variables('_solutionId'), 0, 50),'-','dc','-', uniqueString(concat(variables('_solutionId'),'-','DataConnector','-',variables('_dataConnectorContentIdConnectorDefinition'),'-', variables('dataConnectorVersionConnectorDefinition'))))]",
                "packageId": "[variables('_solutionId')]",
                "contentSchemaVersion": "3.0.0",
                "version": "[variables('_solutionVersion')]"
            }
        },
        // resource 2 section here
        // resource section 2 - dataConnectorDefinitions
        {
            "name": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/',variables('_dataConnectorContentIdConnectorDefinition'))]",
            "apiVersion": "2022-09-01-preview",
            "type": "Microsoft.OperationalInsights/workspaces/providers/dataConnectorDefinitions",
            "location": "[parameters('workspace-location')]",
            "kind": "Customizable",
            "properties": 
			{
				//Enter your data connector definition properties here
				//"connectorUiConfig": {
				//	"graphQueriesTableName": "[variables('_logAnalyticsTableId1')]",
                //}, 
			}
        },
        // resource 3 section here
        // resource section 3 - metadata
        {
            "name": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/',concat('DataConnector-', variables('_dataConnectorContentIdConnectorDefinition')))]",
            "apiVersion": "2022-01-01-preview",
            "type": "Microsoft.OperationalInsights/workspaces/providers/metadata",
            "properties": {
                "parentId": "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/dataConnectorDefinitions', variables('_dataConnectorContentIdConnectorDefinition'))]",
                "contentId": "[variables('_dataConnectorContentIdConnectorDefinition')]",
                "kind": "DataConnector",
                "version": "[variables('dataConnectorVersionConnectorDefinition')]",
                "source": {
                    "sourceId": "[variables('_solutionId')]",
                    "name": "[variables('_solutionName')]",
                    "kind": "Solution"
                },
                "author": {
                    "name": "[variables('_solutionAuthor')]"
                },
                "support": {
                    "name": "[variables('_solutionAuthor')]",
                    "tier": "[variables('_solutionTier')]"
                },
                "dependencies": {
                    "criteria": [
                        {
                            "version": "[variables('dataConnectorVersionConnections')]",
                            "contentId": "[variables('_dataConnectorContentIdConnections')]",
                            "kind": "ResourcesDataConnector"
                        }
                    ]
                }
            }
        },
        // resource 4 section here
        // resource section 4 - contentTemplates
        {
            "type": "Microsoft.OperationalInsights/workspaces/providers/contentTemplates",
            "apiVersion": "2023-04-01-preview",
            "name": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/', variables('dataConnectorTemplateNameConnections'), variables('dataConnectorVersionConnections'))]",
            "location": "[parameters('workspace-location')]",
            "dependsOn": [
                "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/contentPackages', variables('_solutionId'))]"
            ],
            "properties": {
                "contentId": "[variables('_dataConnectorContentIdConnections')]",
                "displayName": "[concat(variables('_solutionName'), variables('dataConnectorTemplateNameConnections'))]",
                "contentKind": "ResourcesDataConnector",
                "mainTemplate": {
                    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
                    "contentVersion": "[variables('dataConnectorVersionConnections')]",
                    "parameters":
                    // These parameters are used by the data connector primarily as properties for the administrator to enter in the UI when configuring the connector
					{
                        "connectorDefinitionName": {
                            "defaultValue": "connectorDefinitionName",
                            "type": "string",
                            "minLength": 1
                        },
                        "workspace": {
                            "defaultValue": "[parameters('workspace')]",
                            "type": "string"
                        },
                        "dcrConfig": {
                            "defaultValue": {
                                "dataCollectionEndpoint": "data collection Endpoint",
                                "dataCollectionRuleImmutableId": "data collection rule immutableId"
                            },
                            "type": "object"
                        }
						// Enter additional parameters, for example:
						//"domainname": {
                        //    "defaultValue": "domain name",
                        //    "type": "string",
                        //    "minLength": 1
                        //},
                        //"apikey": {
                        //    "defaultValue": "",
                        //    "type": "securestring",
                        //    "minLength": 1
                        //}
                    },
                    "variables": {
                        "_dataConnectorContentIdConnections": "[variables('_dataConnectorContentIdConnections')]"
                    },
                    "resources": [
                        {
                            "name": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/',concat('DataConnector-', variables('_dataConnectorContentIdConnections')))]",
                            "apiVersion": "2022-01-01-preview",
                            "type": "Microsoft.OperationalInsights/workspaces/providers/metadata",
                            "properties": {
                                "parentId": "[extensionResourceId(resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspace')), 'Microsoft.SecurityInsights/dataConnectors', variables('_dataConnectorContentIdConnections'))]",
                                "contentId": "[variables('_dataConnectorContentIdConnections')]",
                                "kind": "ResourcesDataConnector",
                                "version": "[variables('dataConnectorVersionConnections')]",
                                "source": {
                                    "sourceId": "[variables('_solutionId')]",
                                    "name": "[variables('_solutionName')]",
                                    "kind": "Solution"
                                },
                                "author": {
                                    "name": "[variables('_solutionAuthor')]"
                                },
                                "support": {
                                    "name": "[variables('_solutionAuthor')]",
                                    "tier": "[variables('_solutionTier')]"
                                }
                            }
                        },
                        {
                            "name": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/', 'MyDataConnector')]", // Replace the last part of the name with your data connector name
                            //  To create several connections using this template, make the name dynamic. For example, use the 'concat' function to add the connector name with a GUID using the 'guid' function.
                            "apiVersion": "2022-12-01-preview",
                            "type": "Microsoft.OperationalInsights/workspaces/providers/dataConnectors",
                            "location": "[parameters('workspace-location')]",
                            "kind": "RestApiPoller",
                            "properties": 
							{
								// Enter your data connector properties here. If you want to use UI parameters remember to escape the parameter like this: "[[parameters('paramName')]"
								//  Use parameters as needed. For example:	
                                // "dataType": "My product security event API",
                                // "response": {
                                //   "eventsJsonPaths": [
                                //        "$"
                                //    ],
                                //    "format": "json"
                                // },
                                // "paging": {
                                //    "pagingType": "LinkHeader"
                                // },
                                // "connectorDefinitionName": "[[parameters('connectorDefinitionName')]",
                                // "auth": {
                                //   "apiKeyName": "Authorization",
                                //    "ApiKey": "[[parameters('apikey')]",
                                //    "apiKeyIdentifier": "SSWS",
                                //    "type": "APIKey"
                                //} ,
                                // "request": {
                                //   "apiEndpoint": "[[concat('https://',parameters('domainname'),'/api/v1/logs')]",
                                //    "rateLimitQPS": 10,
                                //   "queryWindowInMin": 5,
                                //   "httpMethod": "GET",
                                //    "retryCount": 3,
                                //    "timeoutInSeconds": 60,
                                //    "headers": {
                                //        "Accept": "application/json",
                                //        "User-Agent": "My-Data-Source"
                                //    },
                                //    "startTimeAttributeName": "since",
								//    "endTimeAttributeName": "until"		     
                                // },
                                // "dcrConfig": {
                                //    "dataCollectionEndpoint": "[[parameters('dcrConfig').dataCollectionEndpoint]",
                                //    "dataCollectionRuleImmutableId": "[[parameters('dcrConfig').dataCollectionRuleImmutableId]",
                                //    "streamName": "Custom-ExampleConnectorAlerts_CL" //This input stream should be the same as the inputStream property configured for the DataCollectionRule 
                                // },
                                // "isActive": true
                            }
                        }
                    ]
                },
                "packageKind": "Solution",
                "packageVersion": "[variables('_solutionVersion')]",
                "packageName": "[variables('_solutionName')]",
                "contentProductId": "[concat(substring(variables('_solutionId'), 0, 50),'-','rdc','-', uniqueString(concat(variables('_solutionId'),'-','ResourcesDataConnector','-',variables('_dataConnectorContentIdConnections'),'-', variables('dataConnectorVersionConnections'))))]",
                "packageId": "[variables('_solutionId')]",
                "contentSchemaVersion": "3.0.0",
                "version": "[variables('_solutionVersion')]"
            }
        },
        // resource 5 section here
        // resource section 5 - contentPackages
        {
            "type": "Microsoft.OperationalInsights/workspaces/providers/contentPackages",
            "name": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/', variables('_solutionId'))]",
            "location": "[parameters('workspace-location')]",
            "apiVersion": "2023-04-01-preview",
            "properties": {
                "version": "[variables('_solutionVersion')]",
                "kind": "Solution",
                "contentSchemaVersion": "3.0.0",
                "contentId": "[variables('_solutionId')]",
                "source": {
                    "kind": "Solution",
                    "name": "[variables('_solutionName')]",
                    "sourceId": "[variables('_solutionId')]"
                },
                "author": {
                    "name": "[variables('_solutionAuthor')]"
                },
                "support": {
                    "name": "[variables('_solutionAuthor')]"
                },
                "dependencies": {
                    "operator": "AND",
                    "criteria": [
                        {
                            "kind": "DataConnector",
                            "contentId": "[variables('dataConnectorVersionConnectorDefinition')]",
                            "version": "[variables('_dataConnectorContentIdConnectorDefinition')]"
                        }
                    ]
                },
                "firstPublishDate": "2023-12-05",
                "providers": [
                    "[variables('_solutionAuthor')]"
                ],
                "contentKind": "Solution",
                "packageId": "[variables('_solutionId')]",
                "contentProductId": "[concat(substring(variables('_solutionId'), 0, 50),'-','sl','-', uniqueString(concat(variables('_solutionId'),'-','Solution','-',variables('_solutionId'),'-', variables('_solutionVersion'))))]",
                "displayName": "[variables('_solutionName')]",
                "publisherDisplayName": "[variables('_solutionId')]",
                "descriptionHtml": "test",
                "icon": "[variables('_packageIcon')]"
            }
        }
        // that's the end!
    ]
}

Pour plus d'informations, consultez