Freigeben über


Erstellen eines codelosen Connectors für Microsoft Sentinel

Die Codeless Connector Platform (CCP) bietet Partnern, erfahrenen Benutzer*innen und Entwickler*innen die Möglichkeit, benutzerdefinierte Connectors für die Erfassung von Daten in Microsoft Sentinel zu erstellen.

Connectors, die mit der CCP erstellt wurden, sind vollwertige SaaS-Komponenten, für die kein Dienst installiert werden muss. Sie beinhalten auch eine Integritätsüberwachung und werden vollständig von Microsoft Sentinel unterstützt.

Verwenden Sie die folgenden Schritte, um Ihren CCP-Connector zu erstellen und eine Verbindung zwischen Ihrer Datenquelle und Microsoft Sentinel herzustellen:

  • Erstellen des Datenconnectors
  • Erstellen der ARM-Vorlage
  • Bereitstellen des Connectors
  • Herstellen einer Verbindung von Microsoft Sentinel mit Ihrer Datenquelle und Starten der Datenerfassung

In diesem Artikel erfahren Sie, wie Sie die einzelnen Schritte ausführen und einen codelosen Beispielconnector bereitstellen.

Inwiefern unterscheidet sich diese CCP-Version von der vorherigen Version?

Die erste Version der CCP wurde im Januar 2022 angekündigt. Seitdem haben wir die Plattform verbessert, und die Legacyversion wird nicht mehr empfohlen. Diese neue Version der CCP bietet folgende wichtige Verbesserungen:

  1. Bessere Unterstützung verschiedener Authentifizierungs- und Paginierungstypen

  2. Unterstützung von Standardregeln für die Datensammlung (Data Collection Rules, DCRs)

  3. Die Konfiguration der Benutzeroberfläche ist jetzt von der Verbindungskonfiguration des codelosen Connectors getrennt. Dies ermöglicht die Erstellung von Connectors mit mehreren Verbindungen, was vorher nicht möglich war.

Voraussetzungen

Machen Sie sich vor der Erstellung eines Connectors mit Ihrer Datenquelle und mit der erforderlichen Verbindungsherstellung durch Microsoft Sentinel vertraut.

  1. Datensammlungsendpunkt (Data Collection Endpoint, DCE)

    Ein DCE ist eine Voraussetzung für eine DCR. Pro DCR-Bereitstellung eines Log Analytics-Arbeitsbereichs wird nur ein einzelner DCE erstellt. Jede für einen Microsoft Sentinel-Arbeitsbereich bereitgestellte DCR verwendet den gleichen DCE. Weitere Informationen zum Erstellen eines DCE oder dazu, ob Sie einen neuen DCE benötigen, finden Sie unter Datensammlungsendpunkte in Azure Monitor.

  2. Schema der Ausgabetabellen.

    Es ist wichtig, die Form des Datenstroms und die Felder zu verstehen, die Sie in die Ausgabetabelle aufnehmen möchten. Ziehen Sie die Dokumentation Ihrer Datenquelle heran, oder analysieren Sie genügend Ausgabebeispiele.

Recherchieren Sie die folgenden Komponenten in der Datenconnectorreferenz für die Codeless Connector Platform, und vergewissern Sie sich, dass sie unterstützt werden:

  1. Struktur von HTTP-Anforderungen und -Antworten für die Datenquelle

  2. Für die Datenquelle erforderliche Authentifizierung.
    Wenn Ihre Datenquelle z. B. ein Token erfordert, das mit einem Zertifikat signiert ist, gibt die Datenconnector-API-Referenz an, dass die Zertifikatauthentifizierung nicht unterstützt wird.

  3. Paginierungsoptionen für die Datenquelle

Testen von APIs

Es wird empfohlen, Ihre Komponenten mit einem API-Testtool wie einem der folgenden zu testen:

Achtung

Für Szenarien, in denen Sie über vertrauliche Daten wie Anmeldeinformationen, Geheimnisse, Zugriffstoken, API-Schlüssel und andere ähnliche Informationen verfügen, sollten Sie ein Tool verwenden, das Ihre Daten mit den erforderlichen Sicherheitsfunktionen schützt, offline oder lokal funktioniert, Ihre Daten nicht mit der Cloud synchronisiert und keine Anmeldung bei einem Onlinekonto erfordert. Auf diese Weise verringern Sie das Risiko, dass vertrauliche Daten an die Öffentlichkeit gelangen.

Erstellen des Datenconnectors

Zum Erstellen des CCP-Datenconnectors sind vier Komponenten erforderlich.

  1. Ausgabetabellendefinition
  2. Datensammlungsregel (Data Collection Rule, DCR)
  3. Benutzeroberfläche des Datenconnectors
  4. Verbindungsregeln des Datenconnectors

Jede Komponente enthält einen Abschnitt, in dem der Prozess zum Erstellen und Überprüfen beschrieben wird. Verwenden Sie für die abschließende Erstellung des Pakets der ARM-Vorlage den JSON-Code aus den einzelnen Komponenten.

Ausgabetabellendefinition

Tipp

Überspringen Sie diesen Schritt, wenn Ihre Daten nur in Log Analytics-Standardtabellen erfasst werden. Beispiele für Standardtabellen sind CommonSecurityLog und ASimDnsActivityLogs. Weitere Informationen zur vollständigen Liste der unterstützten Standarddatentypen finden Sie unter Datenerfassungsfluss in Microsoft Sentinel.

Wenn Ihre Datenquelle nicht dem Schema einer Standardtabelle entspricht, haben Sie zwei Optionen:

  • Erstellen einer benutzerdefinierten Tabelle für alle Daten
  • Erstellen einer benutzerdefinierten Tabelle für einige der Daten und Auslagern der konformen Daten in eine Standardtabelle

Über die Log Analytics-Benutzeroberfläche können Sie ganz einfach eine benutzerdefinierte Tabelle sowie eine DCR erstellen. Wenn Sie die benutzerdefinierte Tabelle mithilfe der Tabellen-API oder mithilfe einer anderen programmgesteuerten Methode erstellen, muss dem Tabellennamen manuell das Suffix _CL hinzugefügt werden. Weitere Informationen finden Sie unter Erstellen einer benutzerdefinierten Tabelle.

Weitere Informationen zum Aufteilen Ihrer Daten auf mehrere Tabellen finden Sie in den Beispieldaten und in der benutzerdefinierten Beispieltabelle für diese Daten.

Datensammlungsregel

Mit Datensammlungsregeln (Data Collection Rules, DCRs) wird der Datensammlungsprozess in Azure Monitor definiert. DCRs geben an, welche Daten gesammelt werden sollen, wie sie diese Daten transformieren und wohin diese Daten gesendet werden sollen.

  • Pro Datenconnector wird nur eine einzelne DCR bereitgestellt.
  • Eine DCR muss über einen entsprechenden DCE in der gleichen Region verfügen.
  • Wenn der CCP-Datenconnector bereitgestellt wird, wird die DCR erstellt, falls sie noch nicht vorhanden ist.

Die neuesten Informationen zu DCRs finden Sie in den folgenden Artikeln:

Ein Tutorial zur Veranschaulichung der Erstellung eines DCE, einschließlich der Verwendung von Beispieldaten zum Erstellen der benutzerdefinierten Tabelle und der DCR, finden Sie unter Tutorial: Senden von Daten an Azure Monitor-Protokolle über die Protokollerfassungs-API (Azure-Portal). Verwenden Sie den Prozess aus diesem Tutorial, um zu überprüfen, ob die Daten korrekt in der Tabelle mit Ihrer DCR erfasst wurden.

Informationen zum Erstellen einer komplexen DCR mit mehreren Datenflüssen finden Sie im Abschnitt mit dem DCR-Beispiel.

Benutzeroberfläche des Datenconnectors

Diese Komponente rendert die Benutzeroberfläche für den Datenconnector im Microsoft Sentinel-Datenconnectorkatalog. Jeder Datenconnector darf nur über eine einzelne Benutzeroberflächendefinition verfügen.

Erstellen Sie die Benutzeroberfläche des Datenconnectors mit der Datenconnectordefinitions-API. Nutzen Sie ergänzend die Referenz zu Datenconnectordefinitionen, um ausführlichere Informationen zu den API-Elementen zu erhalten.

Hinweise:

  1. Die Eigenschaft kind für den API-Abrufconnector muss immer Customizable sein.
  2. Da es sich hierbei um einen API-Abrufconnector handelt, legen Sie den Typ connectivityCriteria auf hasDataConnectors fest.
  3. Die exemplarischen instructionSteps enthalten eine Schaltfläche vom Typ ConnectionToggleButton. Diese Schaltfläche hilft dabei, die Bereitstellung von Datenconnectorregeln basierend auf den angegebenen Verbindungsparametern auszulösen.

Rufen Sie mit einem API-Testtool die Datenconnectordefinitions-API auf, um die Datenconnector-Benutzeroberfläche zu erstellen und im Datenconnector-Katalog zu überprüfen.

Ein Beispiel zur Veranschaulichung finden Sie im Beispielabschnitt der Referenz zu Datenconnectordefinitionen.

Datenverbindungsregeln

Es sind derzeit zwei Arten von Datenverbindungsregeln zum Definieren des CCP-Datenconnectors möglich.

Rufen Sie mit einem API-Testtool die Datenconnector-API auf, um den Datenconnector zu erstellen. Dadurch werden die Verbindungsregeln und die vorherigen Komponenten miteinander kombiniert. Vergewissern Sie sich auf der Benutzeroberfläche, dass der Connector jetzt verbunden ist.

Sichere vertrauliche Eingaben

Unabhängig davon, welche Authentifizierung Ihr CCP-Datenkonnektor verwendet, sollten Sie diese Schritte durchführen, um die Sicherheit vertraulicher Informationen zu gewährleisten. Ziel ist es, Anmeldeinformationen von der ARM-Vorlage an den CCP weiterzugeben, ohne lesbare vertrauliche Objekte in Ihrem Bereitstellungsverlauf zu hinterlassen.

Bezeichnung erstellen

Die Datenkonnektor-Definition erstellt ein Benutzeroberflächenelement für die Aufforderung zur Eingabe von Anmeldeinformationen. Wenn sich Ihr Datenkonnektor beispielsweise bei einer Protokollquelle mit OAuth authentifiziert, wird der OAuthForm-Typ in den Anweisungen im Definitionsabschnitt Ihres Datenkonnektors angegeben. Damit wird die ARM-Vorlage so eingerichtet, dass sie zur Eingabe der Anmeldeinformationen auffordert.

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

Vertrauliche Eingaben speichern

Ein Abschnitt der ARM-Bereitstellungsvorlage bietet dem Administrator, der den Datenkonnektor bereitstellt, die Möglichkeit, das Kennwort einzugeben. Verwenden Sie securestring, um die vertraulichen Informationen in einem Objekt zu sichern, das nach der Bereitstellung nicht mehr lesbar ist. Weitere Informationen finden Sie unter Sicherheitsempfehlungen für Parameter.

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

Verwenden der SecureString-Objekte

Die Anmeldeinformationen werden vom CCP im Datenkonnektorbereich verwendet.

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

Hinweis

Die seltsame Syntax für das Anmeldeinformationsobjekt „"ClientSecret": "[[parameters('Password')]",“ ist kein Tippfehler! Um die Verteilungsvorlage zu erstellen, die auch Parameter verwendet, müssen Sie die Parameter in diesem Abschnitt mit einem zusätzlichen Anfangszeichen versehen[. Dadurch können die Parameter einen Wert zuweisen, der auf der Interaktion des Benutzers mit dem Konnektor beruht.

Weitere Informationen finden Sie unter Escapezeichen für Vorlagenausdrücke.

Erstellen der Bereitstellungsvorlage

Packen Sie manuell eine ARM-Vorlage (Azure Resource Management). Orientieren Sie sich dabei an der Beispielvorlage mit Codebeispielen. Diese Codebeispiele sind in ARM-Vorlagenabschnitte unterteilt, die Sie verknüpfen müssen.

Wenn Sie einen GCP-CCP-Datenconnector (Google Cloud Platform) erstellen, packen Sie die Bereitstellungsvorlage mithilfe der GCP-CCP-Beispielvorlage. Informationen zum Ausfüllen der GCP-CCP-Vorlage finden Sie in der Referenz zu Verbindungsregeln des GCP-Datenconnectors.

Neben den Beispielvorlagen verwenden auch die im Microsoft Sentinel Content Hub verfügbaren veröffentlichten Lösungen den CCP für ihre Datenconnectors. In den folgenden Lösungen finden Sie weitere Beispiele dafür, wie die Komponenten zu einer ARM-Vorlage zusammengefügt werden können.

Beispiele für RestApiPoller-CCP-Datenconnectors

Beispiele für GCP-CCP-Datenconnectors

Bereitstellen des Connectors

Stellen Sie Ihren codelosen Connector als benutzerdefinierte Vorlage bereit.

Tipp

Löschen Sie Ressourcen, die Sie in den vorherigen Schritten erstellt haben. Die DCR und die benutzerdefinierte Tabelle werden im Rahmen der Bereitstellung erstellt. Wenn Sie diese Ressourcen vor der Bereitstellung nicht entfernen, ist es schwieriger, Ihre Vorlage zu überprüfen.

  1. Kopieren Sie den Inhalt der ARM-Bereitstellungsvorlage.
  2. Führen Sie die Schritte aus, die im Artikel Schnellstart: Erstellen und Bereitstellen von ARM-Vorlagen über das Azure-Portal unter Bearbeiten und Bereitstellen der Vorlage beschrieben sind.

Verwalten der Netzwerkisolation für die Protokollierungsquelle

Wenn Ihre Protokollierungsquelle eine Netzwerkisolation erfordert, konfigurieren Sie eine Zulassungsliste der öffentlichen IP-Adressen, die von der CCP verwendet werden.

Virtuelle Azure-Netzwerke verwenden Diensttags, um Netzwerkzugriffssteuerungen zu definieren. Für die CCP ist dieses Servicetag Scuba.

Informationen zum aktuellen IP-Bereich, der dem Scuba-Servicetag zugeordnet ist, finden Sie unter Verwenden der Diensttag-Ermittlungs-API.

Überprüfen des codelosen Connectors

Zeigen Sie Ihren codelosen Connector im Datenconnectorkatalog an. Öffnen Sie den Datenconnector, und geben Sie alle Authentifizierungsparameter an, die ggf. zum Herstellen der Verbindung benötigt werden. Nach erfolgreicher Verbindungsherstellung werden die DCR und die benutzerdefinierten Tabellen erstellt. Sehen Sie sich die DCR-Ressource in Ihrer Ressourcengruppe und alle benutzerdefinierten Tabellen aus dem Log Analytics-Arbeitsbereich an.

Hinweis

Es kann bis zu 30 Minuten dauern, bis mit der Datenerfassung begonnen wird.

Beispiel

Die einzelnen Schritte der Erstellung des codelosen Connectors sind in den folgenden Beispielabschnitten dargestellt.

Um eine komplexe Datenquelle mit Erfassung in mehreren Tabellen zu veranschaulichen, enthält dieses Beispiel ein Ausgabetabellenschema und eine DCR mit mehreren Ausgabestreams. Diese werden im DCR-Beispiel mit den zugehörigen KQL-Transformationen zusammengeführt. Die Beispiele für die Definition der Datenconnector-Benutzeroberfläche und für die Verbindungsregeln basieren auf der gleichen Beispieldatenquelle. Abschließend werden alle diese Beispielkomponenten von der Lösungsvorlage verwendet, um die gesamte Erstellung des exemplarischen CCP-Datenconnectors zu veranschaulichen.

Beispieldaten

Eine Datenquelle gibt beim Herstellen einer Verbindung mit dem zugehörigen Endpunkt den folgenden JSON-Code zurück.

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

Diese Antwort enthält die Werte Alert (Warnung) und File (Datei) für eventType. Die Dateiereignisse werden in der normalisierten Standardtabelle (AsimFileEventLogs) erfasst. Warnungsereignisse sollen dagegen in einer benutzerdefinierten Tabelle erfasst werden.

Exemplarische benutzerdefinierte Tabelle

Weitere Informationen zur Struktur dieser Tabelle finden Sie unter Tabellen-API. Benutzerdefinierte Protokolltabellennamen müssen über das Suffix _CL verfügen.

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

Exemplarische Datensammlungsregel

Die folgende DCR definiert einen einzelnen Datenstrom (Custom-ExampleConnectorInput) unter Verwendung der Beispieldatenquelle und transformiert die Ausgabe in zwei Tabellen.

  1. Der erste Datenfluss leitet eventType = Alert an die benutzerdefinierte Tabelle ExampleConnectorAlerts_CL weiter.
  2. Der zweite Datenfluss leitet eventType = File an die normalisierte Standardtabelle ASimFileEventLogs weiter.

Weitere Informationen zur Struktur dieses Beispiels finden Sie unter Struktur einer Datensammlungsregel in Azure Monitor.

Gehen Sie gemäß der Anleitung für die API für Datensammlungsregeln vor, um diese DCR in einer Testumgebung zu erstellen. Elemente des Beispiels in {{double curly braces}} geben Variablen an, die Werte für die einfache Verwendung mit einem API-Testtool erfordern. Wenn Sie diese Ressource in der ARM-Vorlage erstellen, werden die hier ausgedrückten Variablen durch Parameter ausgetauscht.

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

Exemplarische Definition der Datenconnector-Benutzeroberfläche

Dieses Beispiel befindet sich in der Referenz zu Datenconnectordefinitionen.

Exemplarische Datenconnector-Verbindungsregeln

Dieses Beispiel befindet sich in der Datenconnectorreferenz.

ARM-Beispielvorlage

Erstellen Sie die ARM-Bereitstellungsvorlage mit der folgenden Struktur, die die vier Abschnitte von JSON-Komponenten enthält, die zum Erstellen des CCP-Datenconnectors erforderlich sind:

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

Fügen Sie die Abschnitte mithilfe eines JSON-fähigen Editors wie Visual Code zusammen, um Syntaxfehler wie Kommas und schließende Klammern zu minimieren.

Als Orientierungshilfe bei der Vorlagenerstellung stehen Kommentare in Metadaten vom Typ description oder inline mit der Kommentarnotation // zur Verfügung. Weitere Informationen finden Sie im Artikel „Bewährte Methoden für ARM-Vorlagen“ unter Kommentare.

Verwenden Sie ggf. das Toolkit zum Testen von ARM-Vorlagen (arm-ttk), um die von Ihnen erstellte Vorlage zu überprüfen. Weitere Informationen finden Sie unter arm-ttk.

Exemplarische ARM-Vorlage: Parameter

Weitere Informationen finden Sie unter Parameter in ARM-Vorlagen.

Warnung

Verwenden Sie securestring für alle Kennwörter und Geheimnisse in Objekten, die nach der Bereitstellung von Ressourcen lesbar sind. Weitere Informationen finden Sie unter Sichere vertrauliche Eingaben sowie unter Sicherheitsempfehlungen für Parameter.

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

Exemplarische ARM-Vorlage: Variablen

Diese empfohlenen Variablen vereinfachen die Vorlage. Verwenden Sie sie nach Bedarf. Weitere Informationen finden Sie unter Variablen in ARM-Vorlagen.

    "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

Exemplarische ARM-Vorlage: Ressourcen

In diesem Vorlagenleitfaden gibt es fünf ARM-Bereitstellungsressourcen, die die vier Komponenten zur Erstellung des CCP-Datenconnectors enthalten.

  1. contentTemplates (eine übergeordnete Ressource)
  2. dataConnectorDefinitions: Weitere Informationen finden Sie unter Benutzeroberfläche des Datenconnectors.
  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!
    ]
}

Weitere Informationen finden Sie unter