Ir al contenido principal

Integración con Microsoft Sentinel

Actualizado hace más de 2 meses

Esta guía explica cómo ingerir feeds de la Plataforma Axur en Microsoft Sentinel utilizando una Logic App (Consumption), un Data Collection Endpoint (DCE), una Data Collection Rule (DCR) y una tabla personalizada en un Log Analytics Workspace.

Nota: Este tutorial asume que ya tiene acceso a la Plataforma Axur y la API Key requerida.


Requisitos previos

  • Suscripción de Azure con permiso para crear recursos de Logic Apps, DCE, DCR y Log Analytics.

  • API Key de la Plataforma Axur y un Feed ID.


Consideraciones de costo y facturación

  • Importante: La implementación y ejecución de esta integración en su suscripción de Microsoft Azure puede generar cargos. Todos los costos son facturados por Microsoft a su suscripción y son responsabilidad del usuario. Axur no factura, gestiona ni asume responsabilidad por los cargos de Azure.

  • Factores comunes que impulsan los costos:

    • Logic Apps (Consumption): facturado por activador/ejecución y por acción. Consulte los precios oficiales en Precios de Azure Logic Apps.

    • Ingesta de logs (Azure Monitor / Log Analytics): facturado por GB ingerido y por retención de datos más allá del período gratuito. Consulte Precios de Azure Monitor y Precios de Log Analytics.

    • Microsoft Sentinel: cargos adicionales por análisis por GB ingerido en un workspace habilitado para Sentinel, además de características opcionales. Consulte Precios de Microsoft Sentinel.

  • Consejos para controlar el costo:

    • Comience con un intervalo de recurrencia más largo y filtros de feed más restrictivos para limitar el volumen.

    • Utilice suscripciones de ensayo/prueba y configure presupuestos y alertas de costos en Azure Cost Management.

    • Revise el volumen de ingesta en el Log Analytics workspace y ajuste según sea necesario (filtros, programación, modelado de datos).

Consejo: Un glosario de términos de Azure utilizados en este tutorial está disponible al final del documento.


1) Crear el Feed de la Plataforma Axur

Cree una API Key y un Feed directamente en la Plataforma Axur. Mantenga ambos valores a mano para los pasos posteriores.

  1. Generar una API Key

    1. En la Plataforma Axur, vaya a configuración de API Keys.

    2. Cree una nueva API key y copie el valor de la API Key de forma segura.

    3. Nota: El feed solo devuelve datos a los que el usuario de la API key tiene permiso de acceso.

      Capturas de pantalla:

  2. Crear el Feed y copiar su ID

    1. En la Plataforma Axur, vaya a API & IntegrationsFeeds.

    2. Cree un nuevo feed de acuerdo con su caso de uso (por ejemplo, phishing, brand abuse, credential leaks), configurando los filtros deseados.

    3. Después de guardar, abra el feed recién creado. Copie solo el Feed ID de la URL y guárdelo para más tarde.

      Capturas de pantalla:

  3. (Opcional) Validar el feed a través de la API Utilice curl para confirmar que el feed devuelve datos utilizando su API Key y Feed ID:

    curl -sS \ -H "Authorization: Bearer YOUR_AXUR_API_KEY" \ -H "Accept: application/json" \ "https://api.axur.com/gateway/1.0/api/integration-feed/feeds/feed/YOUR_FEED_ID" | jq '.'
  • En API & IntegrationsFeeds, también puede monitorear el estado del feed a lo largo del tiempo (por ejemplo, timestamp de la última solicitud).

  • Si no se devuelven eventos, verifique los filtros del feed y los permisos del usuario de la API key.

A partir de este punto (Paso 2+), toda la configuración se realiza en la nube de Microsoft Azure utilizando el Azure portal.


Opción 1: Implementar a través de plantilla personalizada

Si prefiere una implementación plug-and-play a través de Azure Portal, utilice esta plantilla personalizada. Crea: Log Analytics Workspace (y habilita Microsoft Sentinel), Data Collection Endpoint (DCE), Tabla personalizada (basada en DCR), Data Collection Rule (DCR) con la transformación KQL, Logic App (Consumption) con managed identity, y la asignación de rol IAM en el DCR.

Cómo implementar (copiar y pegar):

  1. En Azure Portal, busque Deploy a custom template.

  2. Haga clic en Build your own template in the editor.

  3. Pegue el JSON a continuación → Save.

  4. Rellene: workspaceName, logicAppName, tableName, feedId, apiKey (seguro), y elija ubicación/RG → Deploy.

Notas: - Parámetro de permisos: dcrIngestRoleDefinitionIdOptional (opcional). Déjelo vacío para usar Monitoring Metrics Publisher (predeterminado). Para forzar otro rol (por ejemplo, Monitoring Data Sender), pegue su RoleDefinitionId (GUID). El texto emergente explica cómo recuperarlo rápidamente a través de Azure CLI. - Propagación: después de la implementación, el registro de DCR/tabla puede tardar unos minutos. Las ejecuciones iniciales de la Logic App pueden fallar con 401/403 o InvalidOutputTable hasta que los permisos y la configuración se propaguen. Espere de 20 a 30 minutos. - Puede verificar Run History en la Logic App para ver si se está ejecutando correctamente. - Después de la implementación, salte a la sección Validación a continuación (los Pasos manuales 2–7 no son necesarios si utilizó esta plantilla).

JSON de la plantilla:

{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]"
},
"workspaceName": {
"type": "string",
"defaultValue": "wk-axur-integration"
},
"logicAppName": {
"type": "string",
"defaultValue": "la-axur-ingest"
},
"tableName": {
"type": "string",
"defaultValue": "AxurIntegration"
},
"prefix": {
"type": "string",
"defaultValue": "axur-sentinel"
},
"feedId": {
"type": "string",
"defaultValue": "GET_FROM_AXUR_PLATFORM_FEED_ID"
},
"apiKey": {
"type": "securestring",
"defaultValue": ""
},
"recurrenceFrequency": {
"type": "string",
"defaultValue": "Minute",
"allowedValues": [ "Minute", "Hour", "Day" ]
},
"recurrenceInterval": {
"type": "int",
"defaultValue": 5,
"minValue": 1
},
"dcrIngestRoleDefinitionIdOptional": {
"type": "string",
"defaultValue": "",
"metadata": {
"description": "Optional. Paste a RoleDefinitionId (GUID) to use for DCR ingest (e.g., Monitoring Data Sender). Leave empty to fallback to Monitoring Metrics Publisher."
}
}
},
"variables": {
"streamName": "[concat('Custom-', parameters('tableName'), '_CL')]"
},
"resources": [
{
"type": "Microsoft.OperationalInsights/workspaces",
"apiVersion": "2022-10-01",
"name": "[parameters('workspaceName')]",
"location": "[parameters('location')]",
"properties": {
"retentionInDays": 30,
"features": {
"enableDataExport": true
}
},
"sku": {
"name": "PerGB2018"
}
},
{
"type": "Microsoft.OperationsManagement/solutions",
"apiVersion": "2015-11-01-preview",
"name": "[concat('SecurityInsights(', parameters('workspaceName'), ')')]",
"location": "[parameters('location')]",
"dependsOn": [
"[resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspaceName'))]"
],
"plan": {
"name": "[concat('SecurityInsights(', parameters('workspaceName'), ')')]",
"publisher": "Microsoft",
"product": "OMSGallery/SecurityInsights",
"promotionCode": ""
},
"properties": {
"workspaceResourceId": "[resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspaceName'))]"
}
},
{
"type": "Microsoft.Insights/dataCollectionEndpoints",
"apiVersion": "2022-06-01",
"name": "[concat(parameters('prefix'), '-dce')]",
"location": "[parameters('location')]",
"properties": {
"networkAcls": {
"publicNetworkAccess": "Enabled"
}
}
},
{
"type": "Microsoft.OperationalInsights/workspaces/tables",
"apiVersion": "2022-10-01",
"name": "[concat(parameters('workspaceName'), '/', parameters('tableName'), '_CL')]",
"dependsOn": [
"[resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspaceName'))]"
],
"properties": {
"tableType": "DataCollectionRule",
"schema": {
"name": "[concat(parameters('tableName'), '_CL')]",
"columns": [
{ "name": "TimeGenerated", "type": "datetime" },
{ "name": "last_update_date", "type": "datetime" },
{ "name": "open_date", "type": "datetime" },
{ "name": "ticket_reference", "type": "string" },
{ "name": "ticket_key", "type": "string" },
{ "name": "customer_key", "type": "string" },
{ "name": "collector", "type": "string" },
{ "name": "detection_type", "type": "string" },
{ "name": "status", "type": "string" },
{ "name": "assets", "type": "dynamic" },
{ "name": "attachments", "type": "dynamic" },
{ "name": "ticket_raw", "type": "dynamic" },
{ "name": "detection_raw", "type": "dynamic" },
{ "name": "feed_meta", "type": "dynamic" },
{ "name": "feed_id", "type": "string" }
]
}
}
},
{
"type": "Microsoft.Insights/dataCollectionRules",
"apiVersion": "2022-06-01",
"name": "[concat(parameters('prefix'), '-dcr')]",
"location": "[parameters('location')]",
"dependsOn": [
"[resourceId('Microsoft.Insights/dataCollectionEndpoints', concat(parameters('prefix'), '-dce'))]",
"[resourceId('Microsoft.OperationalInsights/workspaces/tables', parameters('workspaceName'), concat(parameters('tableName'), '_CL'))]"
],
"properties": {
"dataCollectionEndpointId": "[resourceId('Microsoft.Insights/dataCollectionEndpoints', concat(parameters('prefix'), '-dce'))]",
"destinations": {
"logAnalytics": [
{
"name": "la",
"workspaceResourceId": "[resourceId('Microsoft.OperationalInsights/workspaces', parameters('workspaceName'))]"
}
]
},
"dataSources": {
"customLogs": [
{
"name": "custom",
"streams": [
"[variables('streamName')]"
]
}
]
},
"dataFlows": [
{
"streams": [
"[variables('streamName')]"
],
"destinations": [
"la"
],
"transformKql": "source\n| extend\n last_update_date = todatetime(last_update_date),\n open_date = todatetime(open_date)\n| project\n TimeGenerated,\n last_update_date,\n open_date,\n ticket_reference,\n ticket_key,\n customer_key,\n collector,\n detection_type,\n status,\n assets,\n attachments,\n ticket_raw,\n detection_raw,\n feed_meta,\n feed_id"
}
]
}
},
{
"type": "Microsoft.Logic/workflows",
"apiVersion": "2019-05-01",
"name": "[parameters('logicAppName')]",
"location": "[parameters('location')]",
"identity": { "type": "SystemAssigned" },
"dependsOn": [
"[resourceId('Microsoft.Insights/dataCollectionRules', concat(parameters('prefix'), '-dcr'))]",
"[resourceId('Microsoft.Insights/dataCollectionEndpoints', concat(parameters('prefix'), '-dce'))]"
],
"properties": {
"state": "Enabled",
"definition": {
"$schema": "https://schema.management.azure.com/schemas/2016-06-01/workflowdefinition.json#",
"triggers": {
"Recurrence": {
"type": "Recurrence",
"recurrence": {
"frequency": "[parameters('recurrenceFrequency')]",
"interval": "[parameters('recurrenceInterval')]"
},
"evaluatedRecurrence": {
"frequency": "[parameters('recurrenceFrequency')]",
"interval": "[parameters('recurrenceInterval')]"
}
}
},
"actions": {
"HTTP_GET_Feed": {
"type": "Http",
"inputs": {
"uri": "https://api.axur.com/gateway/1.0/api/integration-feed/feeds/feed/@{parameters('feed_id')}",
"method": "GET",
"headers": {
"Authorization": "Bearer @{parameters('api_token')}",
"Accept": "application/json"
}
}
},
"Parse_JSON": {
"runAfter": { "HTTP_GET_Feed": [ "Succeeded" ] },
"type": "ParseJson",
"inputs": {
"content": "@body('HTTP_GET_Feed')",
"schema": {
"type": "object",
"properties": {
"feedData": { "type": "object" },
"collectionData": {
"type": "object",
"properties": {
"tickets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"ticket": { "type": "object" },
"detection": { "type": "object" },
"attachments": { "type": "array" },
"texts": { "type": "array" }
}
}
}
}
}
}
}
}
},
"Select_Tickets": {
"runAfter": { "Parse_JSON": [ "Succeeded" ] },
"type": "Select",
"inputs": {
"from": "@body('Parse_JSON')?['collectionData']?['tickets']",
"select": {
"TimeGenerated": "@item()?['ticket']?['last-update.date']",
"last_update_date": "@item()?['ticket']?['last-update.date']",
"open_date": "@item()?['detection']?['open.date']",
"ticket_reference": "@item()?['ticket']?['reference']",
"ticket_key": "@item()?['ticket']?['ticketKey']",
"customer_key": "@item()?['ticket']?['customerKey']",
"collector": "@item()?['ticket']?['creation.collector']",
"detection_type": "@item()?['detection']?['type']",
"status": "@item()?['detection']?['status']",
"assets": "@item()?['detection']?['assets']",
"attachments": "@item()?['attachments']",
"ticket_raw": "@item()?['ticket']",
"detection_raw": "@item()?['detection']",
"feed_meta": "@body('Parse_JSON')?['feedData']",
"feed_id": "@{parameters('feed_id')}"
}
}
},
"HTTP_POST_to_Sentinel": {
"runAfter": { "Select_Tickets": [ "Succeeded" ] },
"type": "Http",
"inputs": {
"uri": "@{parameters('dce_ingestion_base_url')}/dataCollectionRules/@{parameters('dcr_immutable_id')}/streams/@{parameters('stream_name')}?api-version=2023-01-01",
"method": "POST",
"headers": { "Content-Type": "application/json" },
"body": "@body('Select_Tickets')",
"authentication": {
"type": "ManagedServiceIdentity",
"audience": "https://monitor.azure.com"
}
}
}
},
"outputs": {},
"parameters": {
"feed_id": { "type": "String" },
"api_token": { "type": "SecureString" },
"dce_ingestion_base_url": { "type": "String" },
"dcr_immutable_id": { "type": "String" },
"stream_name": { "type": "String" },
"$connections": { "type": "Object", "defaultValue": {} }
}
},
"parameters": {
"feed_id": { "value": "[parameters('feedId')]" },
"api_token": { "value": "[parameters('apiKey')]" },
"dce_ingestion_base_url": { "value": "[reference(resourceId('Microsoft.Insights/dataCollectionEndpoints', concat(parameters('prefix'), '-dce'))).logsIngestion.endpoint]" },
"dcr_immutable_id": { "value": "[reference(resourceId('Microsoft.Insights/dataCollectionRules', concat(parameters('prefix'), '-dcr'))).immutableId]" },
"stream_name": { "value": "[variables('streamName')]" },
"$connections": { "value": {} }
}
}
},
{
"type": "Microsoft.Authorization/roleAssignments",
"apiVersion": "2022-04-01",
"name": "[guid(resourceId('Microsoft.Insights/dataCollectionRules', concat(parameters('prefix'), '-dcr')), parameters('logicAppName'), 'dcr-ingest-role')]",
"scope": "[resourceId('Microsoft.Insights/dataCollectionRules', concat(parameters('prefix'), '-dcr'))]",
"dependsOn": [
"[resourceId('Microsoft.Logic/workflows', parameters('logicAppName'))]"
],
"properties": {
"roleDefinitionId": "[if(equals(parameters('dcrIngestRoleDefinitionIdOptional'), ''), subscriptionResourceId('Microsoft.Authorization/roleDefinitions','3913510d-42f4-4e42-8a64-420c390055eb'), subscriptionResourceId('Microsoft.Authorization/roleDefinitions', parameters('dcrIngestRoleDefinitionIdOptional')))]",
"principalId": "[reference(resourceId('Microsoft.Logic/workflows', parameters('logicAppName')), '2019-05-01', 'Full').identity.principalId]",
"principalType": "ServicePrincipal"
}
}
],
"outputs": {
"table": { "type": "string", "value": "[concat(parameters('tableName'), '_CL')]" },
"stream": { "type": "string", "value": "[variables('streamName')]" },
"dceIngestUrl": { "type": "string", "value": "[reference(resourceId('Microsoft.Insights/dataCollectionEndpoints', concat(parameters('prefix'), '-dce'))).logsIngestion.endpoint]" },
"dcrImmutableId": { "type": "string", "value": "[reference(resourceId('Microsoft.Insights/dataCollectionRules', concat(parameters('prefix'), '-dcr'))).immutableId]" }
}
}

Capturas de pantalla:


Opción 2: Implementación manual

Siga los pasos a continuación para aprovisionar cada recurso de Azure manualmente a través del portal.


(Opcional) En Azure: Crear un Grupo de Recursos

Crear un Grupo de Recursos (RG) dedicado antes de aprovisionar recursos ayuda a la organización, el control de acceso y la gestión del ciclo de vida.

En el Azure portal:

  1. Busque Resource groupsCreate.

  2. Seleccione la Subscription de destino y elija un nombre de Resource group (por ejemplo, rg-sentinel-axur-prod).

  3. Elija una Region alineada con donde planea crear Logic App, DCE, DCR y Log Analytics → Review + createCreate.

Seleccionará este RG en los siguientes pasos al crear la Logic App, DCE y Workspace.

Capturas de pantalla:


2) En Azure: Crear la Logic App (Consumption)

Cree una nueva Logic App (Consumption). Habilite la system-assigned managed identity para que pueda autenticarse en la ingesta de Azure Monitor.

En el Azure portal:

  1. Busque y seleccione Logic appsAdd.

Opción de hosting

  • Durante la creación, Azure muestra una “Opción de hosting” para Logic Apps: Consumption (multitenant/sin servidor, facturado por acción) o Standard (monotenant en App Service, diferentes tiempos de ejecución/características y precios).

  • Para este tutorial, seleccione Consumption.

  • Más información: consulte Microsoft Docs para los planes y el hosting de Logic Apps: https://learn.microsoft.com/azure/logic-apps/logic-apps-overview#plans-and-hosting y la descripción general de un solo tenant: https://learn.microsoft.com/azure/logic-apps/single-tenant-overview

  • Aspectos básicos: elija la Subscription correcta (para facturación/gobernanza), seleccione su Resource group (o cree uno como se indicó anteriormente), establezca un Logic app name y elija una Region (mantenga la misma región que utilizará para Log Analytics). Establezca Plan en ConsumptionReview + createCreate.

  • Después de la implementación, vaya al recurso de Logic App.

  • Habilitar Managed Identity: IdentitySystem assignedStatus: OnSave.

Cree el flujo de trabajo para extraer el feed de Axur y enviarlo a la ingesta de Azure Monitor utilizando Managed Identity.

  • En la Logic App, abra Development ToolsLogic App Code view y pegue la definición a continuación, luego guarde. Por ahora, deje “parameters” tal como está. Los completaremos más tarde.

{
"definition": {
"$schema": "https://schema.management.azure.com/schemas/2016-06-01/workflowdefinition.json#",
"triggers": {
"Recurrence": {
"recurrence": {
"frequency": "Minute",
"interval": 1
},
"evaluatedRecurrence": {
"frequency": "Minute",
"interval": 1
},
"type": "Recurrence"
}
},
"actions": {
"HTTP_GET_Feed": {
"runAfter": {},
"type": "Http",
"inputs": {
"uri": "https://api.axur.com/gateway/1.0/api/integration-feed/feeds/feed/@{parameters('feed_id')}",
"method": "GET",
"headers": {
"Authorization": "Bearer @{parameters('api_token')}",
"Accept": "application/json"
}
}
},
"Parse_JSON": {
"runAfter": {
"HTTP_GET_Feed": [
"Succeeded"
]
},
"type": "ParseJson",
"inputs": {
"content": "@body('HTTP_GET_Feed')",
"schema": {
"type": "object",
"properties": {
"feedData": {
"type": "object"
},
"collectionData": {
"type": "object",
"properties": {
"tickets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"ticket": {
"type": "object"
},
"detection": {
"type": "object"
},
"attachments": {
"type": "array"
},
"texts": {
"type": "array"
}
}
}
}
}
}
}
}
}
},
"Select_Tickets": {
"runAfter": {
"Parse_JSON": [
"Succeeded"
]
},
"type": "Select",
"inputs": {
"from": "@body('Parse_JSON')?['collectionData']?['tickets']",
"select": {
"TimeGenerated": "@item()?['ticket']?['last-update.date']",
"last_update_date": "@item()?['ticket']?['last-update.date']",
"open_date": "@item()?['detection']?['open.date']",
"ticket_reference": "@item()?['ticket']?['reference']",
"ticket_key": "@item()?['ticket']?['ticketKey']",
"customer_key": "@item()?['ticket']?['customerKey']",
"collector": "@item()?['ticket']?['creation.collector']",
"detection_type": "@item()?['detection']?['type']",
"status": "@item()?['detection']?['status']",
"assets": "@item()?['detection']?['assets']",
"attachments": "@item()?['attachments']",
"ticket_raw": "@item()?['ticket']",
"detection_raw": "@item()?['detection']",
"feed_meta": "@body('Parse_JSON')?['feedData']",
"feed_id": "@{parameters('feed_id')}"
}
}
},
"HTTP_POST_to_Sentinel": {
"runAfter": {
"Select_Tickets": [
"Succeeded"
]
},
"type": "Http",
"inputs": {
"uri": "@{parameters('dce_ingestion_base_url')}/dataCollectionRules/@{parameters('dcr_immutable_id')}/streams/@{parameters('stream_name')}?api-version=2023-01-01",
"method": "POST",
"headers": {
"Content-Type": "application/json"
},
"body": "@body('Select_Tickets')",
"authentication": {
"type": "ManagedServiceIdentity",
"audience": "https://monitor.azure.com"
}
}
}
},
"outputs": {},
"parameters": {
"feed_id": {
"type": "String"
},
"api_token": {
"type": "SecureString"
},
"dce_ingestion_base_url": {
"type": "String"
},
"dcr_immutable_id": {
"type": "String"
},
"stream_name": {
"type": "String"
},
"$connections": {
"type": "Object",
"defaultValue": {}
}
}
},
"parameters": {
"feed_id": { "value": "YOUR_FEED_ID" },
"api_token": { "value": "YOUR_AXUR_API_KEY" },
"dce_ingestion_base_url": { "value": "YOUR_DCE_INGEST_URL" },
"dcr_immutable_id": { "value": "YOUR_DCR_IMMUTABLE_ID" },
"stream_name": { "value": "Custom-YOUR_TABLE_NAME" },
"$connections": { "type": "Object", "value": {} }
}
}

Capturas de pantalla:


3) En Azure: Crear el Data Collection Endpoint (DCE)

Cree un DCE en la misma región que su Log Analytics Workspace. Copie la URL del endpoint de ingesta (URL base).

En el Azure portal:

  1. Busque Data collection endpointsCreate.

  2. Aspectos básicos: seleccione la Subscription correcta, elija su Resource group (preferiblemente el mismo que el de la Logic App), establezca un Name y elija la Region (que coincida con la región de su Log Analytics) → Review + createCreate.

  3. Después de la implementación, abra el DCE. En Overview, copie la URL base del Ingestion (Data Collection) endpoint; la pegará como dce_ingestion_base_url en la Logic App.

Capturas de pantalla:


4) En Azure: Crear el Log Analytics Workspace y habilitar Microsoft Sentinel

Cree o identifique un Log Analytics Workspace conectado a Microsoft Sentinel.

En el Azure portal:

  1. Busque Log Analytics workspacesCreate (o seleccione uno existente).

  2. Aspectos básicos: seleccione la Subscription correcta, elija su Resource group (idealmente el mismo utilizado para Logic App/DCE), establezca un Name y elija la Region (mantenga la coherencia con el DCE y la Logic App) → Review + createCreate.

  3. Habilitar Sentinel: vaya a Microsoft SentinelCreate → elija el workspace creado/seleccionado anteriormente → Add.

Capturas de pantalla:


5) En Azure: Crear la Tabla personalizada (crea automáticamente el DCR)

Cree una tabla de log personalizada y defina el esquema y la transformación para que coincidan con la carga útil de la Logic App. Azure creará automáticamente una Data Collection Rule (DCR) adjunta a esta tabla.

En el Azure portal:

  1. Abra su Log Analytics workspace → haga clic en el workspace creado → SettingsTablesCreate → seleccione Custom log (DCR-based).

  2. Asigne un nombre a la tabla (por ejemplo, AxurTickets). En Logs, la tabla aparecerá con el sufijo _CL (por ejemplo, AxurTickets_CL).

  3. Cuando se le solicite, seleccione el DCE que creó para el enrutamiento de ingesta.

  4. En Schema and transformations:

    1. Haga clic en Upload sample data, copie el ejemplo JSON a continuación en un archivo (por ejemplo, sample_output.json) y cárguelo:

[
{
"TimeGenerated": "2025-09-11T13:57:30Z",
"last_update_date": "2025-09-11T13:57:30Z",
"open_date": "2025-09-11T13:57:09Z",
"ticket_reference": "https://example.com/path/sample-1",
"ticket_key": "abc123",
"customer_key": "CUSTOMER_X",
"collector": "urlscan",
"detection_type": "phishing",
"status": "closed",
"assets": [
"BRAND123"
],
"attachments": [
{
"name": "screenshot_example_com_01.jpg",
"url": "https://api.axur.com/gateway/1.0/api/files/file/screenshot_example_com_01.jpg"
},
{
"name": "html_example_com_01.html",
"url": "https://api.axur.com/gateway/1.0/api/files/file/html_example_com_01.html"
},
{
"name": "whois_example_com_01.txt",
"url": "https://api.axur.com/gateway/1.0/api/files/file/whois_example_com_01.txt"
}
],
"ticket_raw": {
"reference": "https://example.com/path/sample-1",
"ticketKey": "abc123",
"customerKey": "CUSTOMER_X",
"creation.collector": "urlscan",
"last-update.date": "2025-09-11T13:57:30Z",
"creation.collection": "10000001",
"creation.originator": "collector",
"creation.date": "2023-12-07T02:01:36Z"
},
"detection_raw": {
"creation.user": "3",
"close.date": "2025-09-11T13:57:30Z",
"resolution.reason": "dns-down",
"open.date": "2025-09-11T13:57:09Z",
"assets": [
"BRAND123"
],
"type": "phishing",
"resolution": "discarded",
"status": "closed"
},
"feed_meta": {
"id": "11111111-1111-1111-1111-111111111111",
"title": "Sample feed",
"url": "https://api.axur.com/gateway/1.0/api/integration-feed/feeds/feed/11111111-1111-1111-1111-111111111111",
"lastDataRetrieved": "sample",
"createdAt": 1700000000000,
"lastRequest": 1700000100000,
"isActive": true,
"customerKey": "CUSTOMER_X",
"params": "open.date=ge:2025-09-05",
"eventDate": "open.date",
"nextPage": 2,
"lastDateRetrieved": "2025-09-11T13:57:09",
"feedType": "ticket",
"applyOnDescendants": false
},
"feed_id": "11111111-1111-1111-1111-111111111111"
},
{
"TimeGenerated": "2025-09-11T13:57:11Z",
"last_update_date": "2025-09-11T13:57:11Z",
"open_date": "2025-09-11T13:57:09Z",
"ticket_reference": "https://example.org/contact",
"ticket_key": "def456",
"customer_key": "CUSTOMER_X",
"collector": "google websearch",
"detection_type": "fraudulent-brand-use",
"status": "closed",
"assets": [
"BRAND123"
],
"attachments": [
{
"name": "whois_example_org_01.txt",
"url": "https://api.axur.com/gateway/1.0/api/files/file/whois_example_org_01.txt"
},
{
"name": "html_example_org_01.html",
"url": "https://api.axur.com/gateway/1.0/api/files/file/html_example_org_01.html"
},
{
"name": "screenshot_example_org_01.jpg",
"url": "https://api.axur.com/gateway/1.0/api/files/file/screenshot_example_org_01.jpg"
}
],
"ticket_raw": {
"reference": "https://example.org/contact",
"ticketKey": "def456",
"customerKey": "CUSTOMER_X",
"creation.collector": "google websearch",
"last-update.date": "2025-09-11T13:57:11Z",
"creation.collection": "10000002",
"creation.originator": "collector",
"creation.date": "2023-09-08T00:46:02Z"
},
"detection_raw": {
"creation.user": "3",
"close.date": "2025-09-11T13:57:11Z",
"resolution.reason": "dns-down",
"open.date": "2025-09-11T13:57:09Z",
"assets": [
"BRAND123"
],
"type": "fraudulent-brand-use",
"resolution": "discarded",
"status": "closed"
},
"feed_meta": {
"id": "22222222-2222-2222-2222-222222222222",
"title": "Sample feed",
"url": "https://api.axur.com/gateway/1.0/api/integration-feed/feeds/feed/22222222-2222-2222-2222-222222222222",
"lastDataRetrieved": "sample",
"createdAt": 1700000000000,
"lastRequest": 1700000100000,
"isActive": true,
"customerKey": "CUSTOMER_X",
"params": "open.date=ge:2025-09-05",
"eventDate": "open.date",
"nextPage": 2,
"lastDateRetrieved": "2025-09-11T13:57:09",
"feedType": "ticket",
"applyOnDescendants": false
},
"feed_id": "22222222-2222-2222-2222-222222222222"
},
{
"TimeGenerated": "2025-09-11T13:57:27Z",
"last_update_date": "2025-09-11T13:57:27Z",
"open_date": "2025-09-11T13:57:09Z",
"ticket_reference": "https://shop.example.net/",
"ticket_key": "ghi789",
"customer_key": "CUSTOMER_X",
"collector": "urlscan",
"detection_type": "phishing",
"status": "closed",
"assets": [
"BRAND123"
],
"attachments": [
{
"name": "whois_example_net_01.txt",
"url": "https://api.axur.com/gateway/1.0/api/files/file/whois_example_net_01.txt"
},
{
"name": "screenshot_example_net_01.jpg",
"url": "https://api.axur.com/gateway/1.0/api/files/file/screenshot_example_net_01.jpg"
},
{
"name": "html_example_net_01.html",
"url": "https://api.axur.com/gateway/1.0/api/files/file/html_example_net_01.html"
}
],
"ticket_raw": {
"reference": "https://shop.example.net/",
"ticketKey": "ghi789",
"customerKey": "CUSTOMER_X",
"creation.collector": "urlscan",
"last-update.date": "2025-09-11T13:57:27Z",
"creation.collection": "10000003",
"creation.originator": "collector",
"creation.date": "2023-12-11T15:23:20Z",
"tags": [
"MOBILE INSPECTION"
]
},
"detection_raw": {
"creation.user": "3",
"close.date": "2025-09-11T13:57:27Z",
"resolution.reason": "dns-down",
"open.date": "2025-09-11T13:57:09Z",
"assets": [
"BRAND123"
],
"type": "phishing",
"resolution": "discarded",
"status": "closed"
},
"feed_meta": {
"id": "33333333-3333-3333-3333-333333333333",
"title": "Sample feed",
"url": "https://api.axur.com/gateway/1.0/api/integration-feed/feeds/feed/33333333-3333-3333-3333-333333333333",
"lastDataRetrieved": "sample",
"createdAt": 1700000000000,
"lastRequest": 1700000100000,
"isActive": true,
"customerKey": "CUSTOMER_X",
"params": "open.date=ge:2025-09-05",
"eventDate": "open.date",
"nextPage": 2,
"lastDateRetrieved": "2025-09-11T13:57:09",
"feedType": "ticket",
"applyOnDescendants": false
},
"feed_id": "33333333-3333-3333-3333-333333333333"
}
]
  • Azure inferirá el esquema a partir del ejemplo. Revise los tipos de campo y ajústelos si es necesario (por ejemplo, asegúrese de que open_date y last_update_date sean datetime).

  • En Transform and filter, pegue la transformación Kusto a continuación, haga clic en RUN, verifique los datos y haga clic en Apply.

Utilice esta proyección Kusto para normalizar campos:

source
| extend
last_update_date = todatetime(last_update_date),
open_date = todatetime(open_date)
| project
TimeGenerated,
last_update_date,
open_date,
ticket_reference,
ticket_key,
customer_key,
collector,
detection_type,
status,
assets,
attachments,
ticket_raw,
detection_raw,
feed_meta,
feed_id

Azure creará un DCR adjunto a la tabla. Anote el nombre del stream (normalmente Custom-<TableName>) y copie el DCR immutable ID.

Capturas de pantalla:


6) En Azure: Asignar IAM en el DCR

Otorgue a la Managed Identity de la Logic App permiso en el DCR para enviar datos.

Pasos:

  1. Vaya al DCR → Access control (IAM)Add role assignment.

  2. Seleccionar rol: prefiera Monitoring Data Sender. Si no está disponible en su tenant, utilice Monitoring Metrics Publisher como alternativa.

  3. Siguiente → Members → Seleccione la managed identity de la Logic App (system-assigned).

  4. Review + assign. Espere 1–2 minutos para la propagación.

Capturas de pantalla:


7) En Azure: Rellenar los parámetros de la Logic App

Con el DCR y el DCE creados, establezca todos los parámetros requeridos en la Logic App: dce_ingestion_base_url, dcr_immutable_id, stream_name, feed_id, api_token.

Dónde configurar:

  • En la Logic App, abra WorkflowParameters (o Development ToolsLogic App Code view y edite el bloque parameters), luego introduzca los valores a continuación y guarde.

Valores a proporcionar:

  • URL base de ingesta del DCE (desde Overview del DCE → Ingestion (Data Collection) endpoint).

  • DCR immutable ID (desde Properties del DCR).

  • Stream name (Custom-<TableName>, de la tabla personalizada/DCR).

  • feed_id: el Feed ID que copió de la Plataforma Axur.

  • api_token: su API Key de Axur (almacenada como un parámetro SecureString en la Logic App).

Capturas de pantalla:

Después de completar todos los pasos manuales, continúe con la sección Validación para verificar que la integración funciona correctamente.


Validación

Después de ejecutar la Logic App (ya sea a través de plantilla o implementación manual), espere unos minutos. Si el feed tiene eventos, busque la tabla personalizada en Logs:

  • En los Logs de Sentinel, ejecute una consulta como: YOUR_TABLE_NAME_CL | take 10 (por ejemplo, AxurIntegration_CL).

  • Puede tardar hasta ~10 minutos en mostrarse los eventos en los logs después de que hayan sido recopilados del feed.

  • Puede verificar Run History en la Logic App para ver si se está ejecutando correctamente.

Consejos para la resolución de problemas:

  • Verifique que la asignación de IAM se haya propagado.

  • Asegúrese de que la managed identity de la Logic App esté habilitada.

  • Confirme que la región de DCE/DCR coincide con el Log Analytics Workspace.

  • Compruebe que stream_name coincide con la tabla personalizada creada (prefijo Custom-).

  • Inspeccione el historial de ejecución de la Logic App en busca de errores HTTP y específicamente la acción HTTP_POST_to_Sentinel.

Capturas de pantalla:


Glosario

  • Subscription

    • Un contenedor de facturación y gobernanza en Azure. Todos los recursos creados bajo él se facturan a esta subscription y siguen sus cuotas y políticas.

    • Elija la subscription donde su equipo de seguridad/operaciones espera gestionar y pagar por estos recursos.

  • Resource Group (RG)

    • Un contenedor lógico dentro de una subscription para organizar recursos relacionados (por ejemplo, Logic App, DCE, DCR, Log Analytics).

    • Útil para aplicar permisos como un conjunto y gestionar el ciclo de vida (eliminar el RG elimina todos los recursos contenidos).

Recomendaciones para este tutorial

  • Facturación/gobernanza: Asegúrese de implementar en la subscription correcta para la propiedad de costos y el cumplimiento de políticas.

  • Consistencia de región: Mantenga la Logic App, DCE, DCR y Log Analytics Workspace en la misma región cuando sea posible.

  • Higiene del grupo de recursos: Utilice un RG dedicado (por ejemplo, rg-sentinel-axur-<env>) para simplificar el control de acceso y la limpieza.

  • Nombres y tags: Aplique nombres y tags consistentes (por ejemplo, env, owner, costCenter) para el seguimiento y la atribución de costos.

  • Entornos: Valide en una subscription/RG de prueba/staging antes de promover a producción.

  • Region

    • La ubicación geográfica donde se ejecutan los recursos de Azure. Mantenga todos los componentes (Logic App, DCE, DCR, Log Analytics Workspace) coubicados cuando sea posible para reducir la latencia y los problemas.

  • Logic App (Consumption)

    • Un servicio de flujo de trabajo de Azure facturado por ejecución y acción. Se utiliza aquí para extraer datos del feed de Axur y enviarlos a la ingesta de Azure Monitor.

  • Managed Identity (System-assigned)

    • Una identidad vinculada al recurso de Logic App, utilizada para autenticarse de forma segura en los servicios de Azure (por ejemplo, Azure Monitor) sin secretos.

  • Data Collection Endpoint (DCE)

    • El endpoint de ingesta de Azure Monitor al que se envían los datos. Copiará su URL base de ingesta para el parámetro de la Logic App.

  • Data Collection Rule (DCR) e Immutable ID

    • Una regla que define cómo se recopilan y enrutan los datos a una tabla de Log Analytics, creada al definir la tabla personalizada. El DCR tiene un immutable ID requerido por la API de ingesta.

  • Stream name (Custom-<TableName>)

    • El stream del DCR asociado a su tabla personalizada. Utilice este nombre de stream exacto en los parámetros de la Logic App.

  • Log Analytics Workspace y tabla personalizada

    • El Workspace almacena logs; las tablas personalizadas creadas a través de logs personalizados basados en DCR aparecen en Queries con el sufijo _CL (por ejemplo, AxurTickets_CL).

  • Microsoft Sentinel

    • SIEM/SOAR sobre Log Analytics. Habilitar Sentinel en un workspace puede introducir cargos adicionales por análisis.

  • Kusto Query Language (KQL)

    • El lenguaje de consulta para Log Analytics. La transformación que añade al crear la tabla da forma a los datos entrantes; más tarde, consulta con KQL en Logs.

  • Rol IAM en el DCR

    • Otorgue a la managed identity de la Logic App el rol Monitoring Data Sender en el DCR (o Monitoring Metrics Publisher como alternativa) para que pueda enviar datos.

  • Ingesta de Azure Monitor

    • El servicio que recibe datos a través del DCE. La Logic App envía datos al stream del DCR utilizando la URL base del DCE y el DCR immutable ID.

  • Parámetros del flujo de trabajo utilizados aquí

    • feed_id: su Feed ID de Axur.

    • api_token: su API Key de Axur.

    • dce_ingestion_base_url: URL base del DCE.

    • dcr_immutable_id: el immutable ID del DCR de destino.

    • stream_name: el stream del DCR (por ejemplo, Custom-AxurTickets).


Si tienes cualquier duda, puedes contactarnos en [email protected] 😊

¿Ha quedado contestada tu pregunta?