Criar um conector sem código para o Microsoft Sentinel

A CCP (Codeless Connector Platform) oferece aos parceiros, usuários avançados e desenvolvedores a capacidade de criar conectores personalizados para a ingestão de dados para o 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 o modelo ARM
  • Implantar o conector
  • Conecte o Microsoft Sentinel à sua fonte de dados e comece a ingerir dados

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

Qual é a diferença entre este PCC e a versão anterior?

A versão inicial do PCC foi anunciada em janeiro de 2022. Desde então, melhoramos a plataforma e a versão legada não é mais recomendada. Esta nova versão do PCC apresenta as seguintes melhorias fundamentais:

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

  2. Suporta regras padrão de coleta de dados (DCRs).

  3. A interface do usuário e as partes de configuração de conexão do conector sem código estão separadas agora. Isso permite a criação de conectores com várias conexões, o que não era possível 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 espaço de trabalho de análise de log. Cada DCR implantado para um espaço de trabalho 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 da(s) tabela(s) de saída.

    É importante entender a forma do seu fluxo de dados e os campos que você deseja incluir na tabela de saída. Consulte a 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 Data Connector:

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

  2. Autenticação exigida pela fonte de dados.
    Por exemplo, se sua fonte de dados exigir um token assinado com um certificado, a referência da API do conector de dados especifica que a autenticação de certificado não é suportada.

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

Também recomendamos testar seus componentes com uma ferramenta de teste de API como uma das seguintes:

Atenção

Para cenários em que você tem dados confidenciais, como credenciais, segredos, tokens de acesso, chaves de API e outras informações semelhantes, certifique-se de usar 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 exposição de dados confidenciais ao público.

Criar o conector de dados

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

  1. Definição da tabela de saída
  2. Regra de Recolha 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. Pegue o JSON de cada componente para a embalagem final do modelo ARM.

Definição da tabela de saída

Gorjeta

Ignore esta etapa se seus dados forem ingeridos apenas em 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 suportados, consulte Suporte à transformação de dados para conectores de dados personalizados.

Se sua 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 os dados de conformidade em 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 Tables ou outro método programático, adicione o sufixo _CL manualmente ao nome da tabela. Para obter mais informações, consulte 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 recolha de dados

As regras de coleta de dados (DCRs) definem o processo de coleta de dados no Azure Monitor. Os DCRs especificam os dados que devem ser recolhidos, como transformá-los e para onde enviá-los.

  • 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 ainda não existir.

Consulte as informações mais recentes sobre DCRs nestes artigos:

Para obter um tutorial demonstrando 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 o Azure Monitor Logs com API de ingestão de logs (portal do Azure). Use o processo neste tutorial para verificar se os dados foram ingeridos corretamente na sua tabela com o DCR.

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

Interface do usuário do conector de dados

Este componente renderiza a interface do usuário para o 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.

Notas:

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

Use o Postman 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 aprender com um exemplo, consulte a seção Exemplo de referência de definições de conector de dados.

Regras de conexão de dados

Esta parte define as regras de conexão, incluindo:

  • Votação
  • autenticação
  • paginação

Para obter mais informações sobre como criar esta seção, consulte a Referência de regras de conexão do conector de dados.

Para aprender com um exemplo, consulte o Exemplo de referência de regras de conexão do conector de dados.

Use o Postman 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.

Entrada confidencial segura

Seja qual for a autenticação usada pelo conector de dados da CCP, siga estas etapas para garantir que as informações confidenciais sejam mantidas seguras. O objetivo é passar credenciais do modelo ARM para a CCP sem deixar objetos confidenciais legíveis no histórico de implantações.

Criar etiqueta

A definição do conector de dados cria um elemento da 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 OAuth, a seção de definição do conector de dados incluirá o OAuthForm tipo nas instruções. Isso configura o modelo ARM para solicitar as credenciais.

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

Armazene informações confidenciais

Uma seção do modelo de implantação ARM fornece um local para o administrador que implanta o conector de dados 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, consulte 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

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

Nota

A sintaxe estranha para o objeto "ClientSecret": "[[parameters('Password')]", de credencial 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 início[ extra. 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 de Gerenciamento de Recursos do Azure (ARM) usando os exemplos de código de modelo de exemplo como seu guia. Esses exemplos de código são divididos por seções de modelo ARM para você emendar.

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

Implantar o conector

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

Gorjeta

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 da implantação, será mais difícil verificar seu modelo.

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

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

Se a origem do log exigir isolamento de rede, configure uma lista permitida de endereços IP públicos usados pela CCP.

As redes virtuais do Azure usam marcas de serviço para definir controles de acesso à rede. Para o CCP, essa etiqueta 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.

Verifique o conector sem código

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

Nota

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

Exemplo

Cada etapa na construçã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 DCR os reúne junto com suas transformações KQL. Os exemplos de definição de interface do usuário do conector de dados e regras de conexão continuam a partir dessa mesma fonte de dados de exemplo. Finalmente, 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 seu 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"
        }
]

Esta resposta contém eventType 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 de tabelas. Os nomes de tabelas de log personalizadas devem ter um _CL sufixo.

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

Exemplo de regra de coleta de dados

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 = Alert para a tabela personalizadaExampleConnectorAlerts_CL.
  2. o segundo fluxo de dados direciona eventType = o 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 indicam {{double curly braces}} variáveis que requerem valores com facilidade de uso para Postman. Quando você cria esse recurso no modelo 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"
      }
    ]
  }
}

Exemplo de definição da interface do usuário do conector de dados

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

Exemplo de regras de conexão do conector de dados

Este exemplo está localizado na referência Conectores de dados.

Exemplo de modelo ARM

Crie o modelo de implantação ARM com a seguinte estrutura, que inclui as 4 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": [],
}

Costurar as seções com um editor com reconhecimento de 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 em linha com // a notação do comentário. Para obter mais informações, consulte Práticas recomendadas de modelo ARM - comentários.

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

Exemplo de modelo ARM - parâmetros

Para obter mais informações, consulte Parâmetros em modelos 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 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 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 ARM - recursos

Há 5 recursos de implantação 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
    • do IdP
    • RestApiPoller - Para obter mais informações, consulte Regras de conexão de dados.
  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!
    ]
}

Próximos passos

Para obter mais informações, consulte,