Creare un connettore senza codice per Microsoft Sentinel

Codeless Connector Framework (CCF) offre ai partner, agli utenti avanzati e agli sviluppatori la possibilità di creare connettori personalizzati per l'inserimento di dati in Microsoft Sentinel.

I connettori creati con CCF sono completamente SaaS, senza requisiti per le installazioni di servizi. Includono anche il monitoraggio dello stato e il supporto completo di Microsoft Sentinel.

Usare la procedura seguente per creare il connettore CCF e connettere l'origine dati a Microsoft Sentinel

  • Creare il connettore dati
  • Creare il modello ARM
  • Distribuire il connettore
  • Connetti Microsoft Sentinel alla tua origine dati e inizia ad acquisire i dati

Questo articolo ti mostrerà come completare ogni passaggio e ti fornirà un connettore di esempio senza codice da creare man mano.

Se sei un partner di sviluppo software e hai bisogno del supporto per creare un connettore dati CCF, contatta i partner di Microsoft Sentinel per AzureSentinelPartner@microsoft.com assistenza.

In che modo questo CCF è diverso dalla versione precedente?

La versione iniziale del CCF è stata annunciata a gennaio 2022. Da allora, la piattaforma è stata migliorata e la versione legacy non è più consigliata. Questa nuova versione del CCF presenta i miglioramenti principali seguenti:

  1. Supporto migliore per vari tipi di autenticazione e impaginazione.

  2. Supporta le regole di raccolta dati standard.

  3. Le parti relative all'interfaccia utente e alla configurazione della connessione del connettore senza codice sono ora separate. Ciò consente la creazione di connettori con più connessioni che non erano possibili in precedenza.

Prerequisiti

Prima di creare un connettore, comprendere l'origine dati e il modo in cui Microsoft Sentinel deve connettersi.

  1. Endpoint raccolta dati (DCE)

    Un DCE è un requisito per un DCR. Viene creato un solo DCE per ogni distribuzione DCR dell'area di lavoro Log Analytics. Ogni DCR distribuito per un'area di lavoro Microsoft Sentinel usa lo stesso DCE. Per altre informazioni su come crearne uno o se ne è necessario uno nuovo, vedere Endpoint di raccolta dati in Monitoraggio di Azure.

  2. Schema delle tabelle di output.

    È importante comprendere la forma del flusso di dati e i campi da includere nella tabella di output. Fare riferimento alla documentazione della fonte dei dati oppure analizzare un numero sufficiente di esempi di output.

Cercare i componenti seguenti e verificarne il supporto nelle informazioni di riferimento sull'API del connettore dati:

  1. Struttura di richiesta e risposta HTTP all'origine dati

  2. Autenticazione richiesta dall'origine dati.
    Ad esempio, se l'origine dati richiede un token firmato con un certificato, il riferimento all'API del connettore dati specifica che l'autenticazione del certificato non è supportata.

  3. Opzioni di paginazione per l'origine dati

Test delle API

È consigliabile testare i componenti con uno strumento di test api simile a uno dei seguenti:

Caution

Per gli scenari in cui sono presenti dati sensibili, ad esempio credenziali, segreti, token di accesso, chiavi API e altre informazioni simili, assicurarsi di usare uno strumento che protegge i dati con le funzionalità di sicurezza necessarie, funziona offline o in locale, non sincronizza i dati nel cloud e non richiede l'accesso a un account online. In questo modo, si riduce il rischio di esporre i dati sensibili al pubblico.

Creare il connettore dati

Tip

Se si è un fornitore di software indipendente (ISV) e si ha bisogno di supporto per la creazione di un'integrazione di Microsoft Sentinel con Microsoft Sentinel Codeless Connector Framework, il team di Microsoft App Assure può essere in grado di fornire assistenza. Per coinvolgere il team di App Assure, inviare un messaggio di posta elettronica a azuresentinelpartner@microsoft.com.

Per compilare il connettore dati CCF sono necessari quattro componenti.

  1. Definizione della tabella di output
  2. Regola raccolta dati (DCR)
  3. Interfaccia utente del connettore dati
  4. Regole di connessione del connettore dati

Ogni componente ha una sezione che descrive in dettaglio il processo da creare e convalidare. Prendi il JSON di ogni componente per la pacchettizzazione finale del modello ARM.

Definizione della tabella di output

Tip

Ignorare questo passaggio se i dati vengono inseriti solo nelle tabelle di Log Analytics standard. Esempi di tabelle standard includono CommonSecurityLog e ASimDnsActivityLogs. Per altre informazioni sull'elenco completo dei tipi di dati standard supportati, vedere Supporto della trasformazione dei dati per i connettori dati personalizzati.

Se l'origine dati non è conforme allo schema di una tabella standard, sono disponibili due opzioni:

  • Creare una tabella personalizzata per tutti i dati
  • Creare una tabella personalizzata per alcuni dati e suddividere i dati conformi a una tabella standard

Usare l'interfaccia utente di Log Analytics per un metodo diretto per creare una tabella personalizzata insieme a un DCR. Se si crea la tabella personalizzata usando l'API Tabelle o un altro metodo programmatico, aggiungere manualmente il _CL suffisso al nome della tabella. Per altre informazioni, vedere Creare una tabella personalizzata.

Per altre informazioni sulla suddivisione dei dati in più tabelle, vedere i dati di esempio e la tabella personalizzata di esempio creata per tali dati.

Regola di raccolta dei dati

Le regole di raccolta dati definiscono il processo di raccolta dati in Monitoraggio di Azure. I dcr specificano quali dati devono essere raccolti, come trasformare tali dati e dove inviare tali dati.

  • Esiste un solo DCR che viene distribuito per ogni connettore dati.
  • Un DCR deve avere un DCE corrispondente nella stessa area geografica.
  • Quando viene distribuito il connettore dati CCF, il DCR viene creato se non esiste già.

Consulta le informazioni più recenti sui DCR in questi articoli:

Per un'esercitazione che illustra la creazione di un DCE, incluso l'utilizzo di dati di esempio per creare la tabella personalizzata e il DCR, vedere Esercitazione: Inviare dati ad Monitoraggio di Azure Logs con l'API di inserimento dei log (portale di Azure). Usa il processo descritto in questo tutorial per verificare che i dati vengano acquisiti correttamente nella tua tabella tramite il DCR.

Per informazioni su come creare un DCR complesso con più flussi di dati, vedere la sezione di esempio DCR.

Interfaccia utente del connettore dati

Questo componente visualizza l'interfaccia utente per il connettore di dati nella raccolta dei connettori di dati di Microsoft Sentinel. Ogni connettore dati può avere una sola definizione dell'interfaccia utente.

Compilare l'interfaccia utente del connettore dati con l'API di definizione del connettore dati. Usare il riferimento alle definizioni del connettore dati come supplemento per illustrare in modo più dettagliato gli elementi dell'API.

Note:

  1. La proprietà kind del connettore di polling API deve essere sempre Customizable.
  2. Poiché si tratta di un tipo di connettore di polling API, impostare il tipo connectivityCriteria su hasDataConnectors
  3. L'esempio instructionSteps include un pulsante di tipo ConnectionToggleButton. Questo pulsante consente di attivare la distribuzione delle regole del connettore dati in base ai parametri di connessione specificati.

Usare un strumento per il test delle API per chiamare l'API delle definizioni del connettore dati e creare l'interfaccia utente del connettore, in modo da convalidarla nella raccolta dei connettori dati.

Per informazioni su un esempio, vedere la sezione Esempio di riferimento sulle definizioni del connettore dati.

Regole di connessione dati

Esistono attualmente tre tipi di regole di connessione dati possibili per la definizione del connettore dati CCF.

Usare uno strumento di test api per chiamare l'API del connettore dati per creare il connettore dati che combina le regole di connessione e i componenti precedenti. Verificare che il connettore sia ora connesso nell'interfaccia utente.

Proteggere l'input riservato

Indipendentemente dall'autenticazione usata dal connettore dati CCF, seguire questa procedura per garantire la sicurezza delle informazioni riservate. L'obiettivo è passare le credenziali dal modello ARM al CCF senza lasciare oggetti riservati leggibili nella cronologia delle tue distribuzioni.

Creare un'etichetta

La definizione del connettore dati crea un elemento dell'interfaccia utente per richiedere le credenziali di sicurezza. Ad esempio, se il connettore dati esegue l'autenticazione a un'origine log con OAuth, la sezione relativa alla definizione del connettore dati include il OAuthForm tipo nelle istruzioni. Questo configura il modello ARM per richiedere le credenziali.

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

Archiviare l'input riservato

Una sezione del modello di distribuzione arm fornisce un luogo in cui l'amministratore distribuisce il connettore dati per immettere la password. Usare securestring per mantenere protette le informazioni riservate in un oggetto che non è leggibile dopo la distribuzione. Per altre informazioni, vedere Consigli sulla sicurezza per i parametri.

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

Usare gli oggetti securestring

Infine, il CCF usa gli oggetti credenziali nella sezione connettore dati.

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

Note

La sintassi strana per l'oggetto "ClientSecret": "[[parameters('Password')]", credenziale non è un errore di digitazione. Per creare il modello di distribuzione che utilizza anch'esso parametri, è necessario precedere i parametri in quella sezione con un ulteriore [ iniziale. In questo modo i parametri possono assegnare un valore in base all'interazione dell'utente con il connettore.

Per altre informazioni, vedere Caratteri di escape delle espressioni modello.

Creare il modello di distribuzione

Crea manualmente un pacchetto per un modello di Azure Resource Manager (ARM) usando gli esempi di codice del modello come guida. Questi esempi di codice sono suddivisi in base alle sezioni del template ARM, che dovrai assemblare insieme.

Se si sta creando un connettore dati CCF di Google Cloud Platform (GCP), impacchettare il modello di distribuzione usando il modello CCF GCP di esempio. Per informazioni su come compilare il modello CCF di GCP, consultare la sezione di riferimento delle regole di connessione del connettore dati GCP.

Oltre ai modelli di esempio, le soluzioni pubblicate disponibili nell'hub del contenuto di Microsoft Sentinel usano il CCF per i connettori dati. Esamina le soluzioni seguenti come ulteriori esempi di come assemblare i componenti in un modello ARM.

RestApiPoller Esempi di connettore dati CCF

GCP Esempi di connettore dati CCF

Distribuire il connettore

Distribuisci il connettore senza codice come modello personalizzato.

Tip

Eliminare le risorse create nei passaggi precedenti. La DCR e la tabella personalizzata vengono create con la distribuzione. Se queste risorse non vengono rimosse prima della distribuzione, è più difficile verificare il modello.

  1. Copiare il contenuto del modello di distribuzione ARM.
  2. Seguire le istruzioni per modificare e distribuire il modello dell'articolo, Guida introduttiva: Creare e distribuire modelli ARM tramite il portale di Azure.

Mantieni l'isolamento di rete per l'origine dei log

Se l'origine di registrazione richiede l'isolamento di rete, configurare una lista di indirizzi IP pubblici usati dal CCF.

Azure reti virtuali usano tag di servizio per definire i controlli di accesso alla rete. Per il CCF, il tag di servizio è Diving.

Per trovare l'intervallo IP corrente associato al tag del servizio Scuba , vedere Usare l'API di individuazione tag di servizio.

Verificare il connettore senza codice

Visualizza il connettore senza codice nella galleria dei connettori dati. Aprire il connettore dati e completare tutti i parametri di autenticazione necessari per la connessione. Una volta stabilita la connessione, vengono create le tabelle DCR e personalizzate. Visualizza la risorsa DCR nel tuo gruppo di risorse ed eventuali tabelle personalizzate nell'area di lavoro Log Analytics.

Note

Potrebbero essere necessari fino a 30 minuti prima che i dati inizino a essere acquisiti.

Example

Ogni passaggio della compilazione del connettore senza codice è rappresentato nelle sezioni di esempio seguenti.

Per illustrare un'origine dati complessa con inserimento in più tabelle, questo esempio include uno schema di tabella di output e un DCR con più flussi di output. Nell'esempio DCR questi elementi vengono combinati con le relative trasformazioni KQL. Gli esempi di definizione dell'interfaccia utente del connettore dati e delle regole di connessione si basano sulla stessa origine dati di esempio. Infine, il modello di soluzione usa tutti questi componenti di esempio per mostrare end-to-end come creare il connettore dati CCF di esempio.

Dati di esempio

Un'origine dati restituisce il codice JSON seguente durante la connessione al relativo endpoint.

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

Questa risposta contiene eventTypeavvisi e file. Gli eventi file devono essere inseriti nella tabella standard normalizzata , AsimFileEventLogs, mentre gli eventi di avviso devono essere inseriti in una tabella personalizzata.

Tabella personalizzata di esempio

Per altre informazioni sulla struttura di questa tabella, vedere API Tabelle. I nomi di tabella di log personalizzati devono avere un _CL suffisso.

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

Regola di raccolta dati di esempio

Il DCR seguente definisce un singolo flusso Custom-ExampleConnectorInput usando l'origine dati di esempio e trasforma l'output in due tabelle.

  1. Il primo flusso di dati indirizza eventType = Alert alla tabella personalizzata ExampleConnectorAlerts_CL .
  2. il secondo flusso di dati indirizza eventType = File alla tabellaASimFileEventLogs standard normalizzata.

Per altre informazioni sulla struttura di questo esempio, vedere Struttura di una regola di raccolta dati.

Per creare questo DCR in un ambiente di test, seguire l'API Regole raccolta dati. Gli elementi dell'esempio in {{double curly braces}} indicano variabili che richiedono valori per semplificare l'uso con uno strumento di test delle API. Quando si crea questa risorsa nel modello di Resource Manager, le variabili espresse qui vengono scambiate per i parametri.

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

Definizione dell'interfaccia utente del connettore dati di esempio

Questo esempio si trova nel riferimento alle definizioni del connettore dati.

Regole di connessione del connettore dati di esempio

Questo esempio si trova nel riferimento Connettori dati.

Template ARM di esempio

Compilare il modello di distribuzione ARM con la struttura seguente, che include le 4 sezioni dei componenti JSON necessari per compilare il connettore dati CCF:

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

Assemblare le sezioni con un editor che riconosca la sintassi JSON, come Visual Studio Code, per ridurre al minimo errori di sintassi come virgole e parentesi quadre e tonde di chiusura.

Per guidare il processo di creazione del modello, i commenti appaiono nei metadatidescription o in linea con // la notazione di commento. Per altre informazioni, vedere Procedure consigliate per i modelli di Arm - commenti.

Valutare l'uso di ARM Template Test Toolkit (arm-ttk) per convalidare il modello creato. Per altre informazioni, vedere arm-ttk.

Modello ARM di esempio - parametri

Per altre informazioni, vedere Parametri nei modelli di Arm.

Avvertimento

Usare securestring per tutte le password e i segreti negli oggetti leggibili dopo la distribuzione delle risorse. Per altre informazioni, vedere Proteggere l'input riservato e Consigli sulla sicurezza per i parametri.

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

Modello ARM di esempio - variabili

Queste variabili consigliate consentono di semplificare il modello. Usare più o meno in base alle esigenze. Per altre informazioni, vedere Variabili nei modelli di 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

Modello ARM di esempio - risorse

In questa guida del modello sono disponibili 5 risorse di distribuzione ARM che ospitano i 4 componenti costitutivi del connettore dati CCF.

  1. contentTemplates (una risorsa padre)
  2. dataConnectorDefinitions : per altre informazioni, vedere Interfaccia utente del connettore dati.
  3. metadata
  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!
    ]
}

Per ulteriori informazioni, vedere