Поделиться через


Создание соединителя без кода для Microsoft Sentinel

Платформа соединителя без кода (CCP) предоставляет партнерам, расширенным пользователям и разработчикам возможность создавать пользовательские соединители для приема данных в Microsoft Sentinel.

Соединители, созданные с помощью CCP, полностью являются SaaS без требований к установке служб. Они также включают мониторинг работоспособности и полную поддержку От Microsoft Sentinel.

Чтобы создать соединитель CCP и подключить источник данных к Microsoft Sentinel, выполните следующие действия.

  • Создание соединителя данных
  • Создание шаблона ARM
  • Развертывание соединителя
  • Подключите Microsoft Sentinel к источнику данных и начните прием данных

В этой статье показано, как выполнить каждый шаг и предоставить пример соединителя без кода для сборки по пути.

Как этот CCP отличается от предыдущей версии?

Начальная версия CCP была объявлена в январе 2022 года. С тех пор мы улучшили платформу и устаревший выпуск больше не рекомендуется. Эта новая версия CCP имеет следующие ключевые улучшения:

  1. Улучшена поддержка различных типов проверки подлинности и разбиения на страницы.

  2. Поддерживает стандартные правила сбора данных (DCR).

  3. Теперь отдельные части пользовательского интерфейса и конфигурации подключения соединителя без кода. Это позволяет создавать соединители с несколькими подключениями, которые ранее не были возможными.

Необходимые компоненты

Прежде чем создавать соединитель, ознакомьтесь с источником данных и способом подключения Microsoft Sentinel.

  1. Конечная точка сбора данных (DCE)

    DCE — это требование для DCR. Для развертывания DCR рабочей области log analytics создается только один DCE. Каждый DCR, развернутый для рабочей области Microsoft Sentinel, использует тот же DCE. Дополнительные сведения о том, как создать одну или нужно ли вам новую, см . в статье о конечных точках сбора данных в Azure Monitor.

  2. Схема выходных таблиц.

    Важно понимать форму потока данных и поля, которые необходимо включить в выходную таблицу. Ссылка на документацию по источнику данных или анализ достаточного количества выходных примеров.

Изучите следующие компоненты и проверьте их поддержку в справочнике по API соединителя данных:

  1. Структура HTTP-запроса и ответа к источнику данных

  2. Проверка подлинности, необходимая источником данных.
    Например, если для источника данных требуется маркер, подписанный сертификатом, справочник по API соединителя данных указывает, что проверка подлинности сертификата не поддерживается.

  3. Параметры разбиения на страницы в источник данных

Тестирование API

Мы рекомендуем протестировать компоненты с помощью средства тестирования API, например одного из следующих:

Внимание

В сценариях, в которых есть конфиденциальные данные, такие как учетные данные, секреты, маркеры доступа, ключи API и другие аналогичные сведения, обязательно используйте средство, которое защищает данные с помощью необходимых функций безопасности, работает в автономном режиме или локально, не синхронизирует данные с облаком и не требует входа в учетную запись в Сети. Таким образом, вы снижаете риск предоставления конфиденциальных данных общественности.

Создание соединителя данных

Для создания соединителя данных CCP требуется четыре компонента.

  1. Определение выходной таблицы
  2. Правило сбора данных (DCR)
  3. Пользовательский интерфейс соединителя данных
  4. Правила подключения соединителя данных

Каждый компонент содержит раздел, в который подробно описан процесс создания и проверки. Возьмите JSON из каждого компонента для окончательной упаковки шаблона ARM.

Определение выходной таблицы

Совет

Пропустите этот шаг, если данные будут приема только в стандартные таблицы Log Analytics. Примерами стандартных таблиц являются CommonSecurityLog и ASimDnsActivityLogs. Дополнительные сведения о полном списке поддерживаемых стандартных типов данных см. в статье о поддержке преобразования данных для пользовательских соединителей данных.

Если источник данных не соответствует схеме стандартной таблицы, у вас есть два варианта:

  • Создание настраиваемой таблицы для всех данных
  • Создание настраиваемой таблицы для некоторых данных и разделение данных на стандартную таблицу

Используйте пользовательский интерфейс Log Analytics для прямого метода для создания настраиваемой таблицы вместе с DCR. Если вы создаете пользовательскую таблицу с помощью API таблиц или другого программного метода, добавьте _CL суффикс вручную в имя таблицы. Дополнительные сведения см. в разделе "Создание настраиваемой таблицы".

Дополнительные сведения о разбиение данных на несколько таблиц см. в примерах данных и примере настраиваемой таблицы , созданной для данных.

Правило сбора данных

Правила сбора данных (DCR) определяют процесс сбора данных в Azure Monitor. Правила DCR указывают, какие данные следует собирать, как их преобразовывать и куда отправлять.

  • Существует только один DCR, который развертывается для каждого соединителя данных.
  • DCR должен иметь соответствующий DCE в том же регионе.
  • При развертывании соединителя данных CCP создается DCR, если он еще не существует.

Ознакомьтесь с последними сведениями о контроллерах домена в следующих статьях:

Руководство по созданию DCE, включая использование примеров данных для создания пользовательской таблицы и DCR, см. в руководстве по отправке данных в журналы Azure Monitor с помощью API приема журналов журналов (портал Azure). Используйте процесс, приведенный в этом руководстве, чтобы проверить правильность приема данных в таблицу с помощью DCR.

Сведения о создании сложного DCR с несколькими потоками данных см. в разделе примеров DCR.

Пользовательский интерфейс соединителя данных

Этот компонент отображает пользовательский интерфейс соединителя данных в коллекции соединителя данных Microsoft Sentinel. Каждый соединитель данных может иметь только одно определение пользовательского интерфейса.

Создайте пользовательский интерфейс соединителя данных с помощью API определения соединителя данных. Используйте ссылки на определения соединителя данных в качестве дополнения, чтобы объяснить элементы API более подробно.

Примечания:

  1. Свойство kind соединителя опроса API всегда должно быть Customizable.
  2. Так как это тип соединителя опроса API, задайте тип connectivityCriteriahasDataConnectors
  3. instructionSteps Пример включает в себя кнопку типаConnectionToggleButton. Эта кнопка помогает активировать развертывание правил соединителя данных на основе указанных параметров подключения.

Используйте средство тестирования API для вызова API определений соединителя данных, чтобы создать пользовательский интерфейс соединителя данных, чтобы проверить его в коллекции соединителей данных.

Дополнительные сведения см. в разделе "Пример определений соединителя данных".

Правила подключения к данным

В настоящее время существует два типа правил подключения к данным для определения соединителя данных CCP.

  • RestApiPoller kind позволяет настроить разбиение на страницы, авторизацию и ожидаемые полезные данные запроса и ответа для источника данных. Дополнительные сведения см. в справочнике по правилам подключения соединителя данных RestApiPoller.
  • GCP kind позволяет уменьшить время разработки, автоматически настраивая полезные данные разбиения на страницы и ожидаемые полезные данные ответа для источника данных Google Cloud Platform (GCP). Дополнительные сведения см. в разделе "Правила подключения соединителя данных GCP"

Используйте средство тестирования API для вызова API соединителя данных, чтобы создать соединитель данных, который объединяет правила подключения и предыдущие компоненты. Убедитесь, что соединитель подключен к пользовательскому интерфейсу.

Безопасные конфиденциальные входные данные

Независимо от того, какая проверка подлинности используется соединителем данных CCP, выполните эти действия, чтобы обеспечить безопасность конфиденциальной информации. Цель состоит в том, чтобы передать учетные данные из шаблона ARM в CCP, не оставляя доступные для чтения конфиденциальные объекты в журнале развертываний.

Создать метку

Определение соединителя данных создает элемент пользовательского интерфейса для запроса учетных данных безопасности. Например, если соединитель данных проходит проверку подлинности в источнике журнала с помощью OAuth, в разделе определения соединителя данных содержится OAuthForm тип в инструкциях. Это настраивает шаблон ARM для запроса учетных данных.

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

Хранение конфиденциальных входных данных

Раздел шаблона развертывания ARM предоставляет место для администратора, развертывающего соединитель данных для ввода пароля. Используется securestring для сохранения конфиденциальной информации, защищенной в объекте, который не доступен для чтения после развертывания. Дополнительные сведения см. в рекомендациях по безопасности для параметров.

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

Использование объектов securestring

Наконец, CCP использует объекты учетных данных в разделе соединителя данных.

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

Примечание.

Странный синтаксис объекта "ClientSecret": "[[parameters('Password')]", учетных данных не является опечаткой! Чтобы создать шаблон развертывания, который также использует параметры, необходимо экранировать параметры в этом разделе с дополнительным запуском[. Это позволяет параметрам назначать значение на основе взаимодействия пользователя с соединителем.

Дополнительные сведения см. в статье "Выражения шаблонов", экранные символы.

Создание шаблона развертывания

Вручную упаковайте шаблон Azure Resource Management (ARM), используя примеры кода шаблона в качестве руководства. Эти примеры кода разделены разделами шаблонов ARM, которые необходимо объединить вместе.

Если вы создаете соединитель данных CCP Google Cloud Platform (GCP), упаковите шаблон развертывания с помощью примера шаблона CCP GCP. Сведения о том, как заполнить шаблон GCP CCP, см. в справочнике по правилам подключения соединителя данных GCP.

Помимо примеров шаблонов опубликованные решения, доступные в центре содержимого Microsoft Sentinel, используют CCP для своих соединителей данных. Ознакомьтесь со следующими решениями в качестве дополнительных примеров того, как объединить компоненты в шаблон ARM.

RestApiPoller Примеры соединителя данных CCP

GCP Примеры соединителя данных CCP

Развертывание соединителя

Разверните соединитель без кода в качестве пользовательского шаблона.

Совет

Удалите ресурсы, созданные на предыдущих шагах. DCR и настраиваемая таблица создаются с развертыванием. Если вы не удалите эти ресурсы перед развертыванием, вам будет сложнее проверить шаблон.

  1. Скопируйте содержимое шаблона развертывания ARM.
  2. Следуйте инструкциям по редактированию и развертыванию шаблонов из статьи Краткое руководство. Создание и развертывание шаблонов ARM с помощью портал Azure.

Сохранение сетевой изоляции для источника ведения журнала

Если источник ведения журнала требует сетевой изоляции, настройте список разрешений общедоступных IP-адресов, используемых CCP.

Виртуальные сети Azure используют теги служб для определения элементов управления доступом к сети. Для CCP этот тег службы — Scuba.

Чтобы найти текущий диапазон IP-адресов, связанный с тегом службы scuba , см. раздел "Использование API обнаружения тегов службы".

Проверка соединителя без кода

Просмотрите соединитель без кода в коллекции соединителей данных. Откройте соединитель данных и завершите все параметры проверки подлинности, необходимые для подключения. После успешного подключения создаются DCR и пользовательские таблицы. Просмотрите ресурс DCR в группе ресурсов и любые пользовательские таблицы из рабочей области logs analytics.

Примечание.

Для начала приема данных может потребоваться до 30 минут.

Пример

Каждый шаг в создании соединителя без кода представлен в следующих примерах.

Чтобы продемонстрировать сложный источник данных с приемом в несколько таблиц, в этом примере представлена схема выходной таблицы и DCR с несколькими выходными потоками. Пример DCR объединяет их вместе со своими преобразованиями KQL. Примеры определения пользовательского интерфейса соединителя данных и правил подключения продолжаются из этого же примера источника данных. Наконец, шаблон решения использует все эти примеры компонентов, чтобы показать конец созданию примера соединителя данных CCP.

Демонстрационные данные

Источник данных возвращает следующий код JSON при подключении к конечной точке.

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

Этот ответ содержит оповещение eventType и файл. События файла должны быть приема в нормализованную стандартную таблицу AsimFileEventLogs, а события генерации оповещений должны быть приема в настраиваемую таблицу.

Пример настраиваемой таблицы

Дополнительные сведения о структуре этой таблицы см. в разделе API таблиц. Пользовательские имена таблиц журналов должны иметь _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"
        }
        ]
      }
    }
}

Пример правила сбора данных

Следующий DCR определяет один поток Custom-ExampleConnectorInput с помощью примера источника данных и преобразует выходные данные в две таблицы.

  1. Первый поток данных направляет оповещение eventType = в настраиваемую ExampleConnectorAlerts_CL таблицу.
  2. второй поток данных направляет eventType = файл в нормализованную стандартную таблицу.ASimFileEventLogs

Дополнительные сведения о структуре этого примера см. в разделе "Структура правила сбора данных".

Чтобы создать этот DCR в тестовой среде, следуйте API правил сбора данных. Элементы примера указывают {{double curly braces}} на переменные, требующие значений для удобства использования с средством тестирования API. При создании этого ресурса в шаблоне ARM переменные, выраженные здесь, обмениваются параметрами.

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

Пример определения пользовательского интерфейса соединителя данных

Этот пример находится в справочнике по определениям соединителя данных.

Примеры правил подключения соединителя данных

Этот пример находится в справочнике по соединителям данных.

Пример шаблона ARM

Создайте шаблон развертывания ARM со следующей структурой, которая включает в себя 4 раздела компонентов JSON, необходимых для создания соединителя данных CCP:

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

Скройте разделы вместе с редактором с поддержкой JSON, например Visual Code, чтобы свести к минимуму синтаксические ошибки, такие как запятые и закрывающие скобки и скобки.

Чтобы руководствоваться процессом создания шаблона, комментарии отображаются в метаданных description или встроенных с // нотацией комментариев. Дополнительные сведения см . в рекомендациях по шаблону ARM — комментарии.

Рекомендуется использовать набор средств тестирования шаблонов ARM (arm-ttk), чтобы проверить сборку шаблона. Дополнительные сведения см . в разделе arm-ttk.

Пример шаблона ARM — параметры

Дополнительные сведения см. в разделе "Параметры" в шаблонах ARM.

Предупреждение

Используется securestring для всех паролей и секретов в объектах, доступных для чтения после развертывания ресурсов. Дополнительные сведения см. в разделе "Безопасные конфиденциальные входные данные " и рекомендации по безопасности для параметров.

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

Пример шаблона ARM — переменные

Эти рекомендуемые переменные помогают упростить шаблон. Используйте больше или меньше по мере необходимости. Дополнительные сведения см. в разделе "Переменные" в шаблонах 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

Пример шаблона ARM — ресурсы

В этом шаблоне содержится 5 ресурсов развертывания ARM, в которых размещено 4 компонента соединителя данных CCP.

  1. contentTemplates (родительский ресурс)
    • metadata
    • dataCollectionRules — дополнительные сведения см . в правиле сбора данных.
    • таблицы . Дополнительные сведения см . в определении выходной таблицы.
  2. dataConnectorDefinitions — дополнительные сведения см. в пользовательском интерфейсе соединителя данных.
  3. metadata
  4. contentTemplates
    • metadata
    • RestApiPoller — дополнительные сведения см. в разделе "Правила подключения к данным".
  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!
    ]
}

Дополнительные сведения см. в разделе