Partager via


Créer un connecteur sans code pour Microsoft Sentinel

La plateforme de connecteurs sans code (CCP) fournit aux partenaires, aux utilisateurs avancés et aux développeurs la possibilité de créer des connecteurs personnalisés pour l’ingestion de données dans Microsoft Sentinel.

Les connecteurs créés avec CCP sont entièrement SaaS, sans aucune exigence pour l’installation des services. Ils comprennent également le monitoring de l’intégrité et la prise en charge complète de Microsoft Sentinel.

Utilisez les étapes suivantes pour créer votre connecteur CCP 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 fournit un exemple de connecteur sans code à créer en parallèle.

En quoi cette plateforme CCP est-elle différente de la version précédente ?

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

  1. Meilleure prise en charge des divers types d’authentification et de pagination.

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

  3. La configuration de l’interface utilisateur et celle 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 précédemment.

Prérequis

Avant de créer un connecteur, vous devez comprendre votre source de données et comment Microsoft Sentinel doit se 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 dans 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 création d’un point de terminaison ou si vous en avez besoin d’un nouveau, consultez Points de terminaison de collecte de données dans Azure Monitor.

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

    Vous devez bien comprendre la forme de votre flux de données et les champs que vous voulez ajouter à la table de sortie. Consultez la documentation de votre source de données ou analysez suffisamment d’exemples de sortie.

Recherchez les composants suivants et vérifiez s’ils sont pris en charge dans Informations de référence de l’API Connecteur de données :

  1. Structure des requêtes HTTP et des réponses sur la source de données

  2. Authentification demandée par la source de données.
    Par exemple, si votre source de données nécessite un jeton signé avec un certificat, les informations de référence de l’API Connecteur de données spécifient que l’authentification de certificat n’est pas prise en charge.

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

Test d’API

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

Attention

Dans les scénarios comprenant des données sensibles, comme 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, qui fonctionne en mode hors connexion ou localement, qui ne synchronise pas vos données avec le cloud, et qui ne vous impose pas de vous connecter à un compte en ligne. Vous réduirez ainsi les risques liés à l’exposition de données sensibles au public.

Créer le connecteur de données

Quatre composants sont nécessaires à la génération du connecteur de données CCP.

  1. Définition de la 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 a une section qui décrit le processus de création et de validation. Prenez le code JSON de chaque composant pour l’empaquetage final du modèle ARM.

Définition de la table de sortie

Conseil

Ignorez cette étape si vos données sont ingérées uniquement dans des tables Log Analytics standard. Exemples de tables standard : CommonSecurityLog et ASimDnsActivityLogs. 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 des 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 placer les données conformes dans une table standard

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

Pour plus d’informations sur la répartition de vos données dans plusieurs tables, consultez l’exemple de données et l’exemple de table personnalisée créée pour ces données.

Règle de collecte de données

Les règles de collecte de données définissent le processus de collecte de données dans Azure Monitor. Les contrôleurs de domaine spécifient les données à collecter, comment transformer ces données et où envoyer ces données.

  • Une seule DCR est déployée par connecteur de données.
  • Une DCR doit avoir un DCE correspondant dans la même région.
  • Quand le connecteur de données CCP est déployé, la DCR est créée si elle n’existe pas déjà.

Consultez les dernières informations sur les DCR dans ces articles :

Pour obtenir un tutoriel illustrant la création d’un DCE, notamment l’utilisation d’un exemple de données pour créer la table personnalisée et la DCR, consultez Tutoriel : Envoyer des données aux journaux Azure Monitor avec l’API 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 d’exemple de DCR.

Interface utilisateur du connecteur de données

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

Générez l’interface utilisateur du connecteur de données avec l’API Définition de connecteur de données. Utilisez les Informations de référence des définitions de connecteur de données en complément pour une description plus détaillée des éléments de l’API.

Remarques :

  1. La propriété kind 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 connectivityCriteria sur hasDataConnectors
  3. L’exemple instructionSteps a un bouton de type ConnectionToggleButton. Ce bouton permet de déclencher le déploiement des 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 Définitions de connecteur de données afin de créer l’interface utilisateur du connecteur de données et la valider dans la galerie de connecteurs de données.

Pour voir un exemple, consultez la section d’exemple des informations de référence des définitions de connecteur de données.

Règles de connexion de données

Il existe deux genres de règles de connexion de données possibles pour définir votre connecteur de données CCP.

Utilisez un outil de teste d’API pour appeler l’API 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.

Entrée confidentielle sécurisée

Quelle que soit l'authentification utilisée par votre connecteur de données CCP, suivez ces étapes pour garantir la sécurité des informations confidentielles. L'objectif est de transmettre les informations d'identification du modèle ARM au CCP sans laisser d'objets confidentiels lisibles dans l'historique de vos déploiements.

Créer une étiquette

La définition du connecteur de données crée un élément d'interface utilisateur pour demander les 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 de définition de votre connecteur de données inclut le type OAuthForm 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 déployant le connecteur de données de saisir le mot de passe. À utiliser securestring pour conserver les informations confidentielles sécurisées 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 CCP 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

L'étrange syntaxe de l'objet d'identification "ClientSecret": "[[parameters('Password')]", n'est pas une faute de frappe ! Afin de créer le modèle de déploiement qui utilise également des paramètres, vous devez échapper aux paramètres de cette section avec un start 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 des expressions de modèle.

Créer le modèle de déploiement

Empaqueter manuellement un modèle Azure Resource Manager (ARM) en utilisant les exemples de code d’exemple de modèle comme guide. Ces exemples de code sont divisés en sections de modèle ARM que vous devez rassembler.

Si vous créez un connecteur de données CCP GCP (Google Cloud Platform), créez un package du modèle de déploiement à l’aide de l’exemple de modèle CCP GCP. Pour plus d’informations sur la façon de remplir le modèle CCP 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 CCP pour leurs connecteurs de données. Passez en revue les solutions suivantes comme exemples supplémentaires sur la façon d’assembler les composants dans un modèle ARM.

Exemples de connecteurs de données CCP RestApiPoller

Exemples de connecteurs de données CCP GCP

Déployer le connecteur

Déployez votre connecteur sans code sous forme de 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, vous aurez plus de difficulté à vérifier votre modèle.

  1. Copiez le contenu du modèle de déploiement ARM.
  2. Suivez les instructions de Modifier et déployer le modèle dans l’article. Démarrage rapide : Créer et déployer des modèles ARM en utilisant le portail Azure.

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

Si votre source de journalisation nécessite un isolement réseau, configurez une liste d’autorisation des IP publiques utilisées par la plateforme CCP.

Les réseaux virtuels Azure utilisent des étiquettes de service pour définir les contrôles d’accès réseau. Pour la plateforme CCP, 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 Service Tag Discovery.

Vérifier le connecteur sans code

Consultez votre connecteur sans code dans la galerie de connecteurs de données. Ouvrez le connecteur de données et renseignez les paramètres d’authentification nécessaires pour la connexion. Une fois connecté, la DCR et les tables personnalisées sont créées. Consultez 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 commencer seulement au bout de 30 minutes.

Exemple

Chaque étape de création du connecteur sans code est représentée dans les sections d’exemple suivantes.

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 de DCR les associe avec ses transformations KQL. Les exemples de définition d’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 CCP.

Exemple de données

Une source de données renvoie le code JSON suivant pendant 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 l’eventType Alerte 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 journal personnalisées doivent avoir un suffixe _CL.

{
"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 seul flux Custom-ExampleConnectorInput à partir de l’exemple de source de données et transforme la sortie en deux tables.

  1. Le premier flux de données dirige l’eventType = Alerte vers la table ExampleConnectorAlerts_CL personnalisée.
  2. Le deuxième flux de données dirige l’eventType = 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 entre {{double curly braces}} indiquent des variables qui nécessitent des valeurs faciles à utiliser avec un outil de test d’API. Quand vous créez cette ressource dans le modèle ARM, les variables exprimées ici sont remplacées par 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 du connecteur de données

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

Règles de connexion du connecteur de données

Cet exemple se trouve dans les Informations de référence des connecteurs de données.

Exemple de modèle Resource Manager

Générez le modèle de déploiement ARM avec la structure suivante, qui comprend les 4 sections des composants JSON nécessaires pour créer le connecteur de données CCP :

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

Créez un panorama des sections avec un éditeur compatible JSON comme Visual Code pour réduire les erreurs de syntaxe comme les virgules, et les crochets et parenthèses fermants.

Pour guider le processus de création de modèle, des commentaires s’affichent dans les métadonnées description ou inline avec la notation de commentaire //. Pour plus d’informations, consultez Bonnes pratiques des modèles ARM - commentaires.

Utilisez 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 Saisie 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-en plus ou moins selon vos 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

Il y a 5 ressources de déploiement ARM dans ce guide de modèle, qui hébergent les 4 composants de création du connecteur de données CCP.

  1. contentTemplates (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 la rubrique