Opret en kodeløs connector til Microsoft Sentinel

CcF (Codeless Connector Framework) giver partnere, erfarne brugere og udviklere mulighed for at oprette brugerdefinerede connectors til indtagelse af data for at Microsoft Sentinel.

Forbindelser, der er oprettet ved hjælp af CCF, er fuldt SaaS uden krav til tjenesteinstallationer. De omfatter også sundhedsovervågning og fuld støtte fra Microsoft Sentinel.

Brug følgende trin til at oprette din CCF-connector og forbinde datakilden med Microsoft Sentinel

  • Byg dataconnectoren
  • Opret ARM-skabelonen
  • Installér connectoren
  • Opret forbindelse Microsoft Sentinel til datakilden, og begynd at indtage data

I denne artikel kan du se, hvordan du fuldfører hvert trin og angiver et eksempel på en kodeløs connector , der kan bygges undervejs.

Hvis du er softwareudviklingspartner og har brug for support til at bygge en CCF-dataconnector, skal du kontakte Microsoft Sentinel-partnere på AzureSentinelPartner@microsoft.com for at få hjælp.

Hvordan adskiller denne CCF sig fra den tidligere version?

Den første version af CCF blev annonceret i januar 2022. Siden da har vi forbedret platformen, og den ældre version anbefales ikke længere. Denne nye version af CCF har følgende vigtige forbedringer:

  1. Bedre understøttelse af forskellige godkendelses- og sideinddelingstyper.

  2. Understøtter standardregler for dataindsamling.

  3. Delene til konfiguration af brugergrænsefladen og forbindelsen for den kodeløse connector er nu adskilt. Dette gør det muligt at oprette forbindelser med flere forbindelser, som ikke tidligere var mulige.

Forudsætninger

Før du opretter en connector, skal du forstå din datakilde, og hvordan Microsoft Sentinel skal oprette forbindelse.

  1. Slutpunkt for dataindsamling (DCE)

    En DCE er et krav for en DCR. Der oprettes kun én DCE pr. DCR-udrulning for loganalysearbejdsområdet. Hver DCR, der er installeret for et Microsoft Sentinel arbejdsområde, bruger den samme DCE. Du kan finde flere oplysninger om, hvordan du opretter et, eller om du har brug for et nyt, under Slutpunkter for dataindsamling i Azure Monitor.

  2. Skema for outputtabellen eller -tabellerne.

    Det er vigtigt at forstå formen af din datastream og de felter, du vil medtage i outputtabellen. Se dokumentationen til datakilden, eller analysér tilstrækkelige outputeksempler.

Undersøg følgende komponenter, og bekræft understøttelse af dem i API-referencen til Data Connector:

  1. HTTP-anmodnings- og svarstruktur til datakilden

  2. Godkendelse kræves af datakilden.
    Hvis din datakilde f.eks. kræver et token, der er signeret med et certifikat, understøttes certificeringsgodkendelse ikke i API-referencen til dataconnectoren.

  3. Indstillinger for sideinddeling i datakilden

Test-API'er

Vi anbefaler, at du tester dine komponenter med et API-testværktøj som en af følgende:

Forsigtighed

I forbindelse med scenarier, hvor du har følsomme data, f.eks. legitimationsoplysninger, hemmeligheder, adgangstokens, API-nøgler og andre lignende oplysninger, skal du sørge for at bruge et værktøj, der beskytter dine data med de nødvendige sikkerhedsfunktioner, arbejder offline eller lokalt, ikke synkroniserer dine data til cloudmiljøet og ikke kræver, at du logger på en onlinekonto. På denne måde reducerer du risikoen ved at udsætte følsomme data for offentligheden.

Byg dataconnectoren

Tip

Hvis du er isv (Independent Software Vendor) og har brug for support, når du bygger en Microsoft Sentinel integration ved hjælp af den Microsoft Sentinel Codeless Connector Framework, kan Microsoft App Assure-teamet muligvis hjælpe. Hvis du vil engagere App Assure-teamet, skal du sende en mail til azuresentinelpartner@microsoft.com.

Der kræves fire komponenter for at bygge CCF-dataconnectoren.

  1. Definition af outputtabel
  2. Regel for dataindsamling (DCR)
  3. Brugergrænseflade for dataconnector
  4. Forbindelsesregler for dataconnector

Hver komponent har et afsnit, der beskriver den proces, der skal oprettes og valideres. Tag JSON fra hver komponent for den endelige pakning af ARM-skabelonen.

Definition af outputtabel

Tip

Spring dette trin over, hvis dine data kun indtages i loganalyse-standardtabeller. Eksempler på standardtabeller omfatter CommonSecurityLog og ASimDnsActivityLogs. Du kan få flere oplysninger om den komplette liste over understøttede standarddatatyper under Understøttelse af datatransformation for brugerdefinerede dataconnectors.

Hvis din datakilde ikke er i overensstemmelse med skemaet i en standardtabel, har du to muligheder:

  • Opret en brugerdefineret tabel til alle dataene
  • Opret en brugerdefineret tabel for nogle data, og opdel data, der stemmer overens med en standardtabel

Brug brugergrænsefladen i Log Analytics til en ligetil metode til at oprette en brugerdefineret tabel sammen med en DCR. Hvis du opretter den brugerdefinerede tabel ved hjælp af Api'en Tabeller eller en anden programmatisk metode, skal du føje suffikset _CL manuelt til tabelnavnet. Du kan få flere oplysninger under Opret en brugerdefineret tabel.

Du kan få flere oplysninger om, hvordan du opdeler dine data i mere end én tabel, i eksempeldataene og den brugerdefinerede eksempeltabel , der er oprettet for de pågældende data.

Regel for dataindsamling

Regler for dataindsamling definerer dataindsamlingsprocessen i Azure Monitor. DCR'er angiver, hvilke data der skal indsamles, hvordan disse data transformeres, og hvor dataene skal sendes.

  • Der er kun én DCR, der installeres pr. dataconnector.
  • En DCR skal have en tilsvarende DCE i det samme område.
  • Når CCF-dataconnectoren er udrullet, oprettes DCR, hvis den ikke allerede findes.

Se de seneste oplysninger om DCR'er i disse artikler:

Hvis du vil have et selvstudium, der demonstrerer oprettelsen af en DCE, herunder brug af eksempeldata til at oprette den brugerdefinerede tabel og DCR, skal du se Selvstudium: Send data til Azure Overvåg logge med Logførings-API (Azure Portal). Brug processen i dette selvstudium til at bekræfte, at data er indtaget korrekt til tabellen med din DCR.

Du kan få mere at vide om, hvordan du opretter en kompleks DCR med flere dataflow, i afsnittet med dcr-eksempler.

Brugergrænseflade for dataconnector

Denne komponent gengiver brugergrænsefladen for dataconnectoren i galleriet med Microsoft Sentinel dataconnectorer. Hver dataconnector må kun have én brugergrænsefladedefinition.

Byg brugergrænsefladen for dataconnectoren med API'en til definition af dataconnector. Brug referencen dataconnectordefinitioner som et supplement til at forklare API-elementerne mere detaljeret.

Noter:

  1. Egenskaben kind for API-forespørgselsconnectoren skal altid være Customizable.
  2. Da dette er en type API-forespørgselsconnector, skal du connectivityCriteria angive typen til hasDataConnectors
  3. Eksemplet instructionSteps omfatter en knap af typen ConnectionToggleButton. Denne knap hjælper med at udløse installationen af regler for dataconnectorer baseret på de angivne forbindelsesparametre.

Brug et API-testværktøj til at kalde API'en for definitioner af dataconnectorer for at oprette brugergrænsefladen for dataconnectoren for at validere den i galleriet med dataconnectors.

Hvis du vil vide mere om et eksempel, skal du se afsnittet Referenceeksempel for definitioner af dataconnectorer.

Regler for dataforbindelse

Der er i øjeblikket tre typer regler for dataforbindelser, der kan bruges til at definere din CCF-dataconnector.

Brug et API-testværktøj til at kalde dataconnector-API'en for at oprette dataconnectoren, der kombinerer forbindelsesreglerne og tidligere komponenter. Kontrollér, at der nu er forbindelse til connectoren i brugergrænsefladen.

Sikkert fortroligt input

Uanset hvilken godkendelse der bruges af din CCF-dataconnector, skal du udføre disse trin for at sikre, at fortrolige oplysninger beskyttes. Målet er at overføre legitimationsoplysninger fra ARM-skabelonen til CCF uden at efterlade læsbare fortrolige objekter i din installationshistorik.

Opret navn

Definitionen af dataconnectoren opretter et brugergrænsefladeelement for at bede om legitimationsoplysninger til sikkerhed. Hvis din dataconnector f.eks. godkendes til en logkilde med OAuth, indeholder sektionen definition af dataconnectoren OAuthForm typen i vejledningen. Dette konfigurerer ARM-skabelonen til at bede om legitimationsoplysningerne.

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

Gem fortroligt input

Et afsnit i ARM-udrulningsskabelonen indeholder et sted, hvor administratoren udruller dataconnectoren for at angive adgangskoden. Bruges securestring til at beskytte fortrolige oplysninger i et objekt, der ikke kan læses efter udrulningen. Du kan få flere oplysninger under Sikkerhedsanbefalinger for parametre.

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

Brug securestring-objekterne

Til sidst bruger CCF -objekterne for legitimationsoplysninger i dataconnectorsektionen.

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

Bemærk!

Den mærkelige syntaks for legitimationsoplysninger objekt, "ClientSecret": "[[parameters('Password')]", er ikke en tastefejl! Hvis du vil oprette udrulningsskabelonen, som også bruger parametre, skal du undslippe parametrene i det pågældende afsnit med en ekstra start[. Dette gør det muligt for parametrene at tildele en værdi baseret på brugerens interaktion med connectoren.

Du kan få flere oplysninger under Escape-tegn for skabelonudtryk.

Opret installationsskabelonen

Pak manuelt en ARM-skabelon (Azure Resource Management) ved hjælp af eksemplerne på skabelonkode som vejledning. Disse kodeeksempler er opdelt i afsnit med ARM-skabeloner, som du skal splejse sammen.

Hvis du opretter en CCF-dataconnector (Google Cloud Platform) (GCP), skal du pakke udrulningsskabelonen ved hjælp af eksemplet med GCP CCF-skabelonen. Du kan få oplysninger om, hvordan du udfylder GCP CCF-skabelonen, under Reference til regler for GCP-dataconnectorforbindelse.

Ud over de eksempelskabeloner bruger publicerede løsninger, der er tilgængelige i Microsoft Sentinel indholdshubben, CCF til deres dataconnectors. Gennemse følgende løsninger som flere eksempler på, hvordan du syer komponenterne sammen i en ARM-skabelon.

RestApiPoller Eksempler på CCF-dataconnector

GCP Eksempler på CCF-dataconnector

Installér connectoren

Udrul din kodeløse connector som en brugerdefineret skabelon.

Tip

Slet ressourcer, du oprettede i forrige trin. DCR og den brugerdefinerede tabel oprettes med udrulningen. Hvis du ikke fjerner disse ressourcer, før du udruller, er det sværere at bekræfte skabelonen.

  1. Kopiér indholdet af ARM-installationsskabelonen.
  2. Følg vejledningen i Rediger og installér skabelonen fra artiklen Hurtig start: Opret og udrul ARM-skabeloner ved hjælp af Azure Portal.

Bevar netværksisolation for logføringskilde

Hvis logføringskilden kræver netværksisolation, skal du konfigurere en liste over offentlige IP-adresser, der bruges af CCF.

Azure virtuelle netværk bruger tjenestekoder til at definere kontrolelementer for netværksadgang. For CCF er dette servicemærke Dykning.

Hvis du vil finde det aktuelle IP-interval, der er knyttet til sportstjenestemærket , skal du se Brug registrerings-API'en til servicemærket.

Kontrollér den kodeløse connector

Få vist din kodeløse connector i dataconnectorgalleriet. Åbn dataconnectoren, og fuldfør de godkendelsesparametre, der kræves for at oprette forbindelse. Når du har oprettet forbindelse, oprettes DCR og brugerdefinerede tabeller. Få vist DCR-ressourcen i din ressourcegruppe og eventuelle brugerdefinerede tabeller fra arbejdsområdet til logfilanalyse.

Bemærk!

Det kan tage op til 30 minutter, før data begynder at indtages.

Eksempel

Hvert trin i opbygningen af den kodeløse connector er repræsenteret i følgende eksempelsektioner.

For at demonstrere en kompleks datakilde med indtagelse til mere end én tabel indeholder dette eksempel et outputtabelskema og en DCR med flere outputstrømme. DCR-eksemplet samler disse sammen med KQL-transformeringer. Eksemplerne på brugergrænsefladedefinition og forbindelsesregler for dataconnectoren fortsætter fra den samme eksempeldatakilde. Endelig bruger løsningsskabelonen alle disse eksempelkomponenter til at vise fra ende til anden, hvordan du opretter eksempel-CCF-dataconnectoren.

Eksempeldata

En datakilde returnerer følgende JSON, når der oprettes forbindelse til dens slutpunkt.

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

Dette svar indeholder eventTypeen besked og en fil. Filhændelserne skal overføres til den normaliserede standardtabel AsimFileEventLogs, mens beskedhændelserne skal overføres til en brugerdefineret tabel.

Eksempel på brugerdefineret tabel

Du kan få flere oplysninger om strukturen i denne tabel under Api til tabeller. Navne på brugerdefinerede logtabels skal have et _CL suffiks.

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

Eksempel på regel for dataindsamling

Følgende DCR definerer en enkelt stream Custom-ExampleConnectorInput ved hjælp af eksempeldatakilden og transformerer outputtet til to tabeller.

  1. Det første dataflow sender eventType = besked til den brugerdefinerede ExampleConnectorAlerts_CL tabel.
  2. Det andet dataflow dirigerer eventType = Fil til den normaliserede standardtabelASimFileEventLogs.

Du kan få flere oplysninger om strukturen i dette eksempel under Struktur af en regel for dataindsamling.

Hvis du vil oprette denne DCR i et testmiljø, skal du følge API'en for regler for dataindsamling. Elementer i eksemplet i {{double curly braces}} angiver variabler, der kræver værdier for at gøre det nemmere at bruge med et API-testværktøj. Når du opretter denne ressource i ARM-skabelonen, udveksles de variabler, der er udtrykt her, med parametre.

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

Eksempel på brugergrænsefladedefinition for dataconnector

Dette eksempel er placeret i referencen til definitioner af dataconnectorer.

Eksempel på regler for dataconnectorforbindelse

Dette eksempel er placeret i referencen dataconnectors.

Eksempel på ARM-skabelon

Byg ARM-udrulningsskabelonen med følgende struktur, som indeholder de fire afsnit af JSON-komponenter, der kræves for at bygge CCF-dataconnectoren:

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

Sy sektionerne sammen med en JSON-bevidst editor, f.eks. Visual Code, for at minimere syntaksfejl som kommaer og kantede parenteser og parenteser.

Kommentarer vises i metadataenedescription eller indbygget med kommentarnotation for at vejlede processen til // oprettelse af skabelonen. Du kan få flere oplysninger under Bedste praksis for ARM-skabelon – kommentarer.

Overvej at bruge ARM-skabelontestværktøjspakken (arm-ttk) til at validere den skabelon, du bygger. Du kan få flere oplysninger under arm-ttk.

Eksempel på ARM-skabelon – parametre

Du kan få flere oplysninger under Parametre i ARM-skabeloner.

Advarsel

Bruges securestring til alle adgangskoder og hemmeligheder i objekter, der kan læses efter ressourceinstallationen. Du kan få flere oplysninger under Anbefalinger til sikker fortroligt input og sikkerhedsanbefalinger for parametre.

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

Eksempel på ARM-skabelon – variabler

Disse anbefalede variabler er med til at forenkle skabelonen. Brug mere eller mindre efter behov. Du kan få flere oplysninger under Variabler i ARM-skabeloner.

    "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

Eksempel på ARM-skabelon – ressourcer

Der er 5 ARM-udrulningsressourcer i denne skabelonvejledning, som indeholder komponenterne til bygning af 4 CCF-dataconnectorer.

  1. contentTemplates (en overordnet ressource)
  2. dataConnectorDefinitions – Du kan få flere oplysninger under Brugergrænsefladen for dataconnectoren.
  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!
    ]
}

Du kan få flere oplysninger under