Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O CCF (Codeless Connector Framework) fornece aos parceiros, usuários avançados e desenvolvedores a capacidade de criar conectores personalizados para ingerir dados no Microsoft Sentinel.
Os conectores podem ser conectores de pull/polling ou conectores push, dependendo da fonte de dados e da preferência do desenvolvedor. Este artigo se concentra em conectores pull, que são baseados em sondagem e buscam periodicamente dados por meio de APIs. Para obter informações sobre conectores por push, consulte Criar um conector sem código por push para Microsoft Sentinel.
Os conectores criados usando o CCF são totalmente SaaS, sem requisitos para instalações de serviço. Também incluem a monitorização do estado de funcionamento e o suporte total de Microsoft Sentinel.
Use as seguintes etapas para criar seu conector CCF e conectar sua fonte de dados ao Microsoft Sentinel:
- Criar o conector de dados
- Criar o modelo do ARM
- Implantar o conector
- Ligar Microsoft Sentinel à origem de dados e começar a ingerir dados
Cada etapa inclui um conector sem código de exemplo para compilar ao longo do caminho.
Se você for um parceiro de desenvolvimento de software e precisar de suporte para criar um conector de dados CCF, entre em contato com os Parceiros AzureSentinelPartner@microsoft.com do Microsoft Sentinel para obter assistência.
Melhorias em relação à versão anterior do CCF
A versão inicial do CCF foi anunciada no blog Microsoft Tech Community em janeiro de 2022. Desde então, a plataforma foi aprimorada e a versão herdada não é mais recomendada. Esta nova versão do CCF tem os seguintes aprimoramentos principais:
Melhor suporte para vários tipos de autenticação e paginação.
Suporta regras de recolha de dados padrão (DCRs).
A interface do usuário e a configuração da conexão do conector sem código agora são partes separadas. Isto permite a criação de conectores com várias ligações que não eram possíveis anteriormente.
Pré-requisitos
Antes de criar um conector, compreenda a sua origem de dados e como Microsoft Sentinel precisa de se ligar.
Ponto de Extremidade de Coleta de Dados (DCE)
Uma DCE é um requisito para um DCR. Apenas um DCE é criado por implantação de DCR do workspace do Log Analytics. Cada DCR implementado para uma área de trabalho Microsoft Sentinel utiliza o mesmo DCE. Para obter mais informações sobre como criar um ou se precisa de um novo, veja Pontos finais de recolha de dados no Azure Monitor.
Esquema das tabelas de saída.
É importante compreender a forma do fluxo de dados e os campos que pretende incluir na tabela de saída. Consulte a documentação da sua fonte de dados ou analise exemplos de saída suficientes.
Procure os seguintes componentes e verifique o suporte para os mesmos na referência da API do Conector de Dados:
Pedido HTTP e estrutura de resposta à origem de dados
Autenticação necessária pela origem de dados.
Por exemplo, se a origem de dados necessitar de 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.Opções de paginação para a origem de dados
Testar APIs
Teste seus componentes com uma ferramenta de teste de API, como uma das seguintes:
- Visual Studio Code com a extensão Microsoft Sentinel do Visual Studio Marketplace. A extensão permite implementar e testar fluxos de trabalho aninhados de polling de API. Para informações sobre configuração e uso, veja Construir conectores personalizados com IA no Microsoft Sentinel.
- Invoke-RestMethod do PowerShell
- Ferramenta Microsoft Edge Network Console
- Bruno
- curl
Caution
Para cenários que utilizam dados sensíveis, como credenciais, segredos, tokens de acesso ou chaves de API, utilize uma ferramenta que proteja seus dados. Escolha uma ferramenta que funcione offline ou localmente, que não sincronize seus dados com a nuvem e que não exija que você faça login em uma conta online. Essas salvaguardas reduzem o risco de expor dados sensíveis.
Criar o conector de dados
Dica
Se você for um ISV (Fornecedor de Software Independente) e precisar de suporte ao criar uma integração do Microsoft Sentinel usando o Microsoft Sentinel Codeless Connector Framework, a equipe do Microsoft App Assure poderá ajudar. Para envolver a equipe do App Assure, envie um email para azuresentinelpartner@microsoft.com.
Há quatro componentes necessários para criar o conector de dados CCF.
- Definição da tabela de saída
- Regra de Recolha de Dados (DCR)
- Interface de utilizador do conector de dados
- Regras de ligação do conector de dados
Cada componente tem uma secção que detalha 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 este passo se os 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, veja Suporte de transformação de dados para conectores de dados personalizados.
Se a origem de dados não estiver em conformidade com o esquema de uma tabela padrão, tem duas opções:
- Criar uma tabela personalizada para todos os dados
- Criar uma tabela personalizada para alguns dados e dividir os dados em conformidade com uma tabela padrão
Use a interface do usuário do Log Analytics como uma maneira simples de criar uma tabela personalizada em conjunto com um DCR. Se criar a tabela personalizada com a API tabelas ou outro método programático, adicione o _CL sufixo manualmente ao nome da tabela. Para obter mais informações, consulte Criar uma tabela personalizada.
Para obter mais informações sobre como dividir os seus dados em mais do que uma tabela, veja os dados de exemplo e a tabela personalizada de exemplo criada para esses dados.
Regra de coleta de dados
As regras de recolha de dados (DCRs) definem o processo de recolha de dados no Azure Monitor. Os DCRs especificam que dados devem ser recolhidos, como transformar esses dados e para onde enviar esses dados.
- Existe apenas um DCR que é implementado por conector de dados.
- Um DCR deve ter um DCE correspondente na mesma região.
- Quando o conector de dados CCF é implantado, a DCR é criada, se ainda não existir.
Veja as informações mais recentes sobre DCRs nestes artigos:
Para um tutorial que demonstra a criação de uma DCE, incluindo a utilização de dados de exemplo para criar a tabela personalizada e o DCR, veja Tutorial: Enviar dados para Azure Monitorizar Registos com a API de ingestão de Registos (portal do Azure). Use o processo descrito neste tutorial para verificar se os dados são ingeridos corretamente na sua tabela usando seu DCR.
Para compreender como criar um DCR complexo com vários fluxos de dados, veja a secção de exemplo DCR.
Interface de utilizador do conector de dados
Este 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 IU.
Crie a interface de utilizador 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:
- A propriedade
kinddo conector de sondagem da API deve ser sempreCustomizable. - Como este é um tipo de conector de polling de API, defina o tipo
connectivityCriteriacomohasDataConnectors. - O exemplo
instructionStepsinclui um botão do tipoConnectionToggleButton. Este botão ajuda a acionar a implementação de regras do conector de dados com base nos parâmetros de ligação especificados.
Use uma ferramenta de teste de API para chamar a API de definições de conectores de dados, criar a interface de usuário do conector de dados e 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á três tipos de regras de conexão de dados possíveis para definir seu conector de dados CCF.
-
RestApiPollerO KIND permite personalizar paginação, autorização e cargas úteis esperadas de solicitação e resposta para sua fonte de dados. Você também pode usar a consulta de API aninhada, atualmente em pré-visualização pública, para encadear requisições dependentes da API em um único ciclo de pesquisa. Para propriedades padrão da regra de conexão, veja referência às regras de conexão do conector de dados RestApiPoller. Para configurar solicitações dependentes, consulte Criar conectores de dados de extração sem código usando sondagem aninhada de API. -
GCPkind permite reduzir o tempo de desenvolvimento configurando automaticamente a paginação e as cargas úteis de resposta esperadas para sua fonte de dados do Google Cloud Platform (GCP). Para obter mais informações, consulte a referência de regras de conexão do conector de dados GCP. - O tipo
StorageAccountBlobContainerpermite que você ingira de uma fonte de dados do Armazenamento do Azure Blob. Para obter mais informações, consulte Referência da API dos conectores de Blob do Armazenamento do Azure e Exemplo de conector de Blob do Armazenamento do Azure.
Utilize uma ferramenta de teste de API para chamar a API do conector de dados para criar o conector de dados que combina as regras de ligação e os componentes anteriores. Verifique se o conector está agora ligado na IU.
Entrada confidencial segura
Seja qual for a autenticação usada pelo conector de dados do CCF, execute estas etapas para garantir que as informações confidenciais sejam mantidas seguras. A meta é passar as credenciais do modelo do ARM para o CCF sem deixar objetos confidenciais legíveis no histórico de implantações.
Criar o rótulo de credencial na interface do usuário do conector
A definição do conector de dados cria um elemento de IU para pedir 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 ARM para solicitar as credenciais.
"instructions": [
{
"type": "OAuthForm",
"parameters": {
"UsernameLabel": "Username",
"PasswordLabel": "Password",
"connectButtonLabel": "Connect",
"disconnectButtonLabel": "Disconnect"
}
}
],
Armazenar entradas confidenciais
Uma secção do modelo de implementação do ARM fornece um local para o administrador implementar o conector de dados para introduzir a palavra-passe. Utilize securestring para manter as informações confidenciais protegidas num objeto que não é legível após a implementação. Para obter mais informações, veja 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."
}
},
}
}
Use os objetos SecureString
Por fim, o CCF usa os objetos de credenciais 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"
}
}
Note
A sintaxe estranha do 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, escape os parâmetros nessa seção com um [ inicial extra. Isto permite que os parâmetros atribuam um valor com base na interação do utilizador com o conector.
Para obter mais informações, consulte Caracteres de escape de expressões de modelo.
Criar o modelo de implementação
Empacote manualmente um modelo do Azure Resource Management (ARM) com os exemplos de código de modelo como guia. Estes exemplos de código estão divididos por seções do modelo ARM que você deve unir.
Se você estiver criando um conector de dados CCF do GCP (Google Cloud Platform), empacote o modelo de implantação usando o modelo de exemplo CCF GCP. Para obter informações sobre como preencher o modelo GCP CCF, consulte a referência de regras de conexão do conector de dados GCP.
Além dos modelos de exemplo, as soluções publicadas disponíveis no hub de conteúdo do Microsoft Sentinel usam o CCF para seus conectores de dados. Analise as soluções a seguir como exemplos adicionais de como integrar os componentes em um modelo ARM.
RestApiPoller Exemplos de conector de dados CCF
- Segurança do Navegador Ermes
- Palo Alto Prisma Cloud CWPP
- Proteção de Endpoint Sophos
- Workday
- Atlassian Jira
- Logon único do Okta
GCP Exemplos de conector de dados CCF
Implantar o conector
Implemente o conector sem código como um modelo personalizado.
Dica
Elimine os recursos que criou nos passos anteriores. O DCR e a tabela personalizada são criados com a implementação. Se não remover esses recursos antes de implementar, é mais difícil verificar o modelo.
- Copie o conteúdo do modelo de implementação do ARM.
- Siga as instruções Editar e implantar o modelo do artigo Início Rápido: Criar e implantar modelos ARM usando o portal do Azure.
Manter o isolamento de rede para a fonte do registro em log
Se a origem do log exigir isolamento de rede, configure uma lista de IPs públicos permitidos usados pelo CCF.
Azure redes virtuais utilizam etiquetas de serviço para definir controlos de acesso à rede. Para o CCF, essa marca de serviço é Scuba.
Para localizar o intervalo de IP atual associado à etiqueta de serviço Scuba , veja Utilizar a API de Deteção de Etiquetas de Serviço.
Verifique o conector sem código
Veja 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 ligar. Depois de conectado com sucesso, o DCR e as tabelas personalizadas são criados. Veja o recurso DCR no seu grupo de recursos e quaisquer tabelas personalizadas da área de trabalho de análise de registos.
Note
Pode levar até 30 minutos para ver os dados começarem a ser ingeridos.
Example
Cada passo na criação do conector sem código é representado nas secções de exemplo seguintes.
- Dados de exemplo
- Exemplo de tabela personalizada
- Regra de recolha de dados de exemplo
- Exemplo de definição da interface do usuário para conector de dados
- Regras de ligação de dados de exemplo
- Utilizar dados de exemplo com um modelo de exemplo
Para demonstrar uma origem de dados complexa com ingestão para mais do que 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 definição da interface do usuário e de regras de conexão do conector de dados continuam com base nesta 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 CCF de exemplo.
Dados de exemplo
Uma origem de dados devolve o seguinte JSON ao ligar ao ponto final.
[
{
"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 eventTypeAlerta e Ficheiro. Os eventos de ficheiro devem ser ingeridos na tabela padrão normalizada, AsimFileEventLogs, enquanto os eventos de alerta devem ser ingeridos numa tabela personalizada.
Exemplo de tabela personalizada
Para obter mais informações sobre a estrutura desta tabela, veja API de Tabelas. Os nomes de tabelas de registo personalizados 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"
}
]
}
}
}
Regra de recolha 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.
- O primeiro fluxo de dados direciona
eventType= Alerta para a tabela personalizadaExampleConnectorAlerts_CL. - O segundo fluxo de dados direciona
eventType= Arquivo para a tabelaASimFileEventLogspadrão normalizada.
Para obter mais informações sobre a estrutura deste exemplo, veja Estrutura de uma regra de recolha de dados.
Para criar este DCR num ambiente de teste, siga a API de Regras de Recolha de Dados. Os elementos do exemplo em {{double curly braces}} indicam variáveis que requerem valores para facilitar a utilização com uma ferramenta de teste de API. Quando cria este recurso no modelo do ARM, as variáveis aqui expressas 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 da interface do usuário de um conector de dados de exemplo
Este exemplo está na referência de definições de conectores de dados.
Regras de ligação do conector de dados de exemplo
Este exemplo está localizado na referência de Conectores de dados.
Exemplo de modelo do ARM
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 CCF:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {},
"variables": {},
"resources": [],
}
Una as seções com um editor com suporte a JSON, como o Visual Studio Code, para minimizar erros de sintaxe, como erros com vírgulas, colchetes e parênteses de fechamento.
Para orientar o processo de construção de modelos, os comentários aparecem nos metadadosdescription ou em linha, usando a notação de comentário //. Para obter mais informações, consulte práticas recomendadas para modelos ARM - comentários.
Considere utilizar o toolkit de testes de modelos do ARM (arm-ttk) para validar o modelo que criar. Para obter mais informações, veja arm-ttk.
Exemplo de template ARM - parâmetros
Para obter mais informações, veja Parâmetros nos modelos do ARM.
Aviso
Utilize securestring para todas as palavras-passe e segredos em objetos legíveis após a implementação de recursos.
Para obter mais informações, consulte Inserção 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
Estas variáveis recomendadas ajudam a simplificar o modelo. Utilize 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 CCF.
-
contentTemplates (um recurso principal)
- metadados
- dataCollectionRules – para obter mais informações, veja Regra de recolha de dados.
- tabelas – para obter mais informações, veja Definição da tabela de saída.
- dataConnectorDefinitions – para obter mais informações, veja Interface de utilizador do conector de dados.
- metadados
-
contentTemplates
- metadados
- RestApiPoller – para obter mais informações, veja Regras de ligação de dados.
- 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')]"
}
}
]
}