Criar um conector sem código para o Microsoft Sentinel

A CCP (Plataforma de Conector Sem Código) fornece aos parceiros, usuários avançados e desenvolvedores a capacidade de criar conectores personalizados para ingerir dados no Microsoft Sentinel.

Os conectores criados usando o CCP são totalmente SaaS, sem requisitos para instalações de serviço. Eles também incluem monitoramento de integridade e suporte total do Microsoft Sentinel.

Use as etapas a seguir para criar seu conector CCP e conectar sua fonte de dados ao Microsoft Sentinel

  • Criar o conector de dados
  • Criar um modelo do ARM
  • Implantar o conector
  • Conectar o Microsoft Sentinel à fonte de dados e começar a ingerir dados

Este artigo mostrará como concluir cada etapa e fornecer um conector sem código de exemplo para compilar ao longo do caminho.

Como esse CCP é diferente da versão anterior?

A versão inicial do CCP foi anunciada em janeiro de 2022. Desde então, melhoramos a plataforma e a versão herdada não é mais recomendada. Esta nova versão do CCP tem os seguintes aprimoramentos principais:

  1. Melhor suporte para vários tipos de autenticação e paginação.

  2. Dá suporte a DCRs (regras padrão de coleta de dados).

  3. As partes de interface do usuário e de configuração de conexão do conector sem código agora estão separadas. Isso permite a criação de conectores com várias conexões que não eram possíveis anteriormente.

Pré-requisitos

Antes de criar um conector, entenda sua fonte de dados e como o Microsoft Sentinel precisa se conectar.

  1. Ponto de Extremidade de Coleta de Dados (DCE)

    Um DCE é um requisito para um DCR. Apenas um DCE é criado por implantação de DCR do workspace do Log Analytics. Cada DCR implantado para um workspace do Microsoft Sentinel usa o mesmo DCE. Para obter mais informações sobre como criar um ou se você precisa de um novo, consulte pontos de extremidade de coleta de dados no Azure Monitor.

  2. Esquema das tabelas de saída.

    É importante entender a forma do fluxo de dados e os campos que você deseja incluir na tabela de saída. Faça referência à documentação da fonte de dados ou analise exemplos de saída suficientes.

Pesquise os seguintes componentes e verifique o suporte para eles na referência da API do Conector de Dados:

  1. Estrutura de solicitação e resposta HTTP para a fonte de dados

  2. Autenticação exigida pela fonte de dados.
    Por exemplo, se a fonte de dados exigir um token assinado com um certificado, a referência à API do conector de dados especifica a autenticação de certificado não terá suporte.

  3. Opções de paginação para a fonte de dados

Testar APIs

Recomendamos testar seus componentes com uma ferramenta de teste de API como uma das seguintes:

Cuidado

Para cenários em que você tem dados confidenciais, como credenciais, segredos, tokens de acesso, chaves de API e outras informações semelhantes, use uma ferramenta que proteja seus dados com os recursos de segurança necessários, funcione offline ou localmente, não sincronize seus dados com a nuvem e não exija que você entre em uma conta online. Dessa forma, você reduz o risco de expor dados confidenciais ao público.

Criar o conector de dados

Há quatro componentes necessários para construir o conector de dados do CCP.

  1. Definição da tabela de saída
  2. Regra de Coleta de Dados (DCR)
  3. Interface do usuário do conector de dados
  4. Regras de conexão do conector de dados

Cada componente tem uma seção detalhando o processo para criar e validar. Tire o JSON de cada componente para o empacotamento final do modelo ARM.

Definição da tabela de saída

Dica

Ignore esta etapa se seus dados forem ingeridos apenas para tabelas padrão do Log Analytics. Exemplos de tabelas padrão incluem CommonSecurityLog e ASimDnsActivityLogs. Para obter mais informações sobre a lista completa de tipos de dados padrão com suporte, consulte Suporte à transformação de dados para conectores de dados personalizados.

Se a fonte de dados não estiver em conformidade com o esquema de uma tabela padrão, você terá duas opções:

  • Criar uma tabela personalizada para todos os dados
  • Criar uma tabela personalizada para alguns dados e dividir dados em conformidade com uma tabela padrão

Use a interface do usuário do Log Analytics para um método direto para criar uma tabela personalizada junto com um DCR. Se você criar a tabela personalizada usando a API Tabelas ou outro método programático, adicione o sufixo _CL manualmente ao nome da tabela. Para obter mais informações, confira Criar uma tabela personalizada.

Para obter mais informações sobre como dividir seus dados em mais de uma tabela, consulte os dados de exemplo e a tabela personalizada de exemplo criada para esses dados.

Regra de coleta de dados

As DCRs (regras de coleta de dados) definem o processo de coleta de dados no Azure Monitor. As DCRs especificam quais dados devem ser coletados, como transformar esses dados e para onde enviar esses dados.

  • Há apenas um DCR que é implantado por conector de dados.
  • Um DCR deve ter um DCE correspondente na mesma região.
  • Quando o conector de dados CCP é implantado, o DCR é criado se ele ainda não existe.

Faça referência às informações mais recentes sobre DCRs nestes artigos:

Para obter um tutorial que demonstra a criação de um DCE, incluindo o uso de dados de exemplo para criar a tabela personalizada e o DCR, consulte Tutorial: Enviar dados para logs do Azure Monitor com a API de ingestão de logs (portal do Azure). Use o processo neste tutorial para verificar se os dados foram ingeridos corretamente em sua tabela com o DCR.

Para entender como criar um DCR complexo com vários fluxos de dados, consulte a seção de exemplo do DCR.

Interface do usuário do conector de dados

Esse componente renderiza a interface do usuário do conector de dados na galeria de conectores de dados do Microsoft Sentinel. Cada conector de dados pode ter apenas uma definição de interface do usuário.

Crie a interface do usuário do conector de dados com a API de Definição do Conector de Dados. Use a Referência de definições do conector de dados como um suplemento para explicar os elementos da API com mais detalhes.

Observações:

  1. A propriedade kind do conector de sondagem da API sempre deve ser Customizable.
  2. Como esse é um tipo de conector de sondagem de API, defina o tipo connectivityCriteria como hasDataConnectors
  3. O exemplo instructionSteps inclui um botão do tipo ConnectionToggleButton. Esse botão ajuda a disparar a implantação de regras do conector de dados com base nos parâmetros de conexão especificados.

Use a ferramenta de teste de API para chamar a API de definições do conector de dados para criar a interface do usuário do conector de dados para validá-la na galeria de conectores de dados.

Para saber mais sobre um exemplo, consulte a seção de exemplo de referência de definições do conector de dados.

Regras de conexão de dados

Atualmente, há dois tipos de regras de conexão de dados possíveis para definir seu conector de dados CCP.

Use a ferramenta de teste de API para chamar a API do conector de dados para criar o conector de dados que combina as regras de conexão e os componentes anteriores. Verifique se o conector agora está conectado na interface do usuário.

Proteger a entrada confidencial

Seja qual for a autenticação usada pelo conector de dados do CCP, execute estas etapas para garantir que as informações confidenciais sejam mantidas em segurança. A meta é transmitir credenciais do modelo do ARM para o CCP sem deixar objetos confidenciais legíveis no histórico de implantações.

Criar rótulo

A definição do conector de dados cria um elemento de interface do usuário para solicitar credenciais de segurança. Por exemplo, se o conector de dados for autenticado em uma fonte de log com o OAuth, a seção de definição do conector de dados incluirá o tipo OAuthForm nas instruções. Isso configura o modelo do ARM para solicitar as credenciais.

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

Armazenar a entrada confidencial

Uma seção do modelo de implantação do ARM fornece um local para o administrador implantar o conector de dados para inserir a senha. Use securestring para manter as informações confidenciais protegidas em um objeto que não é legível após a implantação. Para obter mais informações, confira Recomendações de segurança para parâmetros.

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

Usar os objetos securestring

Por fim, o CCP utiliza os objetos de credencial na seção do conector de dados.

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

Observação

A sintaxe estranha do objeto de credencial, "ClientSecret": "[[parameters('Password')]",, não é um erro de digitação. Para criar o modelo de implantação que também usa parâmetros, você precisa escapar dos parâmetros nessa seção com um[ inicial adicional. Isso permite que os parâmetros atribuam um valor com base na interação do usuário com o conector.

Para obter mais informações, consulte Caracteres de escape de expressões de modelo.

Criar o modelo de implantação

Empacote manualmente um modelo do Gerenciamento de Recursos do Azure (ARM) usando os exemplos de amostras de código de modelo como seu guia. Esses exemplos de código são divididos por seções de modelo ARM que você deve unir.

Se você estiver criando um conector de dados CCP do Google Cloud Platform (GCP), empacote o modelo de implantação usando o modelo CCP do GCP de exemplo. Para obter informações sobre como preencher o modelo CCP do GCP, veja Referência de regras de conexão do conector de dados do GCP.

Além dos modelos de exemplo, as soluções publicadas disponíveis no hub de conteúdo do Microsoft Sentinel usam o CCP para seus conectores de dados. Examine as soluções a seguir como mais exemplos de como unir os componentes em um modelo do ARM.

RestApiPoller Exemplos de conectores de dados CCP

GCP Exemplos de conectores de dados CCP

Implantar o conector

Implante seu conector sem código como um modelo personalizado.

Dica

Exclua os recursos criados nas etapas anteriores. O DCR e a tabela personalizada são criados com a implantação. Se você não remover esses recursos antes de implantar, é mais difícil verificar seu modelo.

  1. Copie o conteúdo do modelo de implantação do ARM.
  2. Siga as instruções Editar e implantar o modelo no artigo Início Rápido: Criar e implantar modelos do ARM usando o portal do Azure.

Manter o isolamento de rede para a fonte do registro em log

Se a fonte de registro em log exigir isolamento de rede, configure uma lista de permitidos dos endereços IP públicos usados pelo CCP.

As redes virtuais do Azure usam marcas de serviço para definir controles de acesso à rede. Para o CCP, essa marca de serviço é Scuba.

Para localizar o intervalo de IP atual associado à marca de serviço Scuba, consulte Usar a API de Descoberta de Marca de Serviço.

Verificar o conector sem código

Exiba seu conector sem código na galeria do conector de dados. Abra o conector de dados e conclua todos os parâmetros de autenticação necessários para se conectar. Depois de conectados com êxito, o DCR e as tabelas personalizadas são criados. Exiba o recurso DCR em seu grupo de recursos e quaisquer tabelas personalizadas do workspace de análise de logs.

Observação

Pode levar até 30 minutos para ver os dados começarem a ser ingeridos.

Exemplo

Cada etapa na criação do conector sem código é representada nas seções de exemplo a seguir.

Para demonstrar uma fonte de dados complexa com ingestão em mais de uma tabela, este exemplo apresenta um esquema de tabela de saída e um DCR com vários fluxos de saída. O exemplo de DCR os reúne junto com suas transformações de KQL. Os exemplos de regras de conexão e definição de interface do usuário do conector de dados continuam a partir dessa mesma fonte de dados de exemplo. Por fim, o modelo de solução usa todos esses componentes de exemplo para mostrar de ponta a ponta como criar o conector de dados CCP de exemplo.

Dados de exemplo

Uma fonte de dados retorna o JSON a seguir ao se conectar ao ponto de extremidade.

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

Essa resposta contém eventType de Alerta e Arquivo. Os eventos de arquivo devem ser ingeridos na tabela padrão normalizada, AsimFileEventLogs, enquanto os eventos de alerta devem ser ingeridos em uma tabela personalizada.

Exemplo de tabela personalizada

Para obter mais informações sobre a estrutura desta tabela, consulte API Tabelas. Os nomes personalizados da tabela de log devem ter um sufixo _CL.

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

Regra de coleta de dados de exemplo

O DCR a seguir define um único fluxo Custom-ExampleConnectorInput usando a fonte de dados de exemplo e transforma a saída em duas tabelas.

  1. O primeiro fluxo de dados direciona eventType = Alerta para a tabela personalizada ExampleConnectorAlerts_CL.
  2. o segundo fluxo de dados direciona eventType = Arquivo para a tabela padrão normalizada ASimFileEventLogs.

Para obter mais informações sobre a estrutura deste exemplo, consulte Estrutura de uma regra de coleta de dados.

Para criar esse DCR em um ambiente de teste, siga a API de Regras de Coleta de Dados. Elementos do exemplo em {{double curly braces}} indicam variáveis que exigem valores para facilitar o uso com uma ferramenta de teste de API. Quando você cria esse recurso no modelo do ARM, as variáveis expressas aqui são trocadas por parâmetros.

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

Definição de interface do usuário do conector de dados de exemplo

Este exemplo está localizado na Referência de definições do conector de dados.

Regras de conexão do conector de dados de exemplo

Este exemplo está localizado na Referência de conectores de dados.

Modelo do ARM de exemplo

Crie o modelo de implantação do ARM com a seguinte estrutura, que inclui as quatro seções de componentes JSON necessárias para criar o conector de dados CCP:

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

Costure as seções com um editor com reconhecimento JSON, como o Visual Code, para minimizar erros de sintaxe, como vírgulas e colchetes de fechamento e parênteses.

Para orientar o processo de criação do modelo, os comentários aparecem nos metadados description ou embutidos com a notação de comentário //. Para obter mais informações, consulte Práticas recomendadas do modelo do ARM – comentários.

Considere usar o kit de ferramentas de teste de modelo do ARM (arm-ttk) para validar o modelo que você cria. Para obter mais informações, consulte arm-ttk.

Exemplo de modelo do ARM – parâmetros

Para obter mais informações, confira Parâmetros em modelos do ARM.

Aviso

Use securestring para todas as senhas e segredos em objetos legíveis após a implantação do recurso. Para obter mais informações, consulte Entrada confidencial segura e Recomendações de segurança para parâmetros.

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

Exemplo de modelo do ARM – variáveis

Essas variáveis recomendadas ajudam a simplificar o modelo. Use mais ou menos conforme necessário. Para obter mais informações, consulte Variáveis em modelos do 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

Exemplo de modelo do ARM – recursos

Há 5 recursos de implantação do ARM neste guia de modelo que abrigam os 4 componentes de construção do conector de dados CCP.

  1. contentTemplates (um recurso pai)
  2. dataConnectorDefinitions – Para obter mais informações, consulte Interface do usuário do conector de dados.
  3. metadados
  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!
    ]
}

Para obter mais informações, consulte