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.
Generar una API Key
En la Plataforma Axur, vaya a configuración de API Keys.
Cree una nueva API key y copie el valor de la API Key de forma segura.
Nota: El feed solo devuelve datos a los que el usuario de la API key tiene permiso de acceso.
Capturas de pantalla:
Crear el Feed y copiar su ID
En la Plataforma Axur, vaya a
API & Integrations→Feeds.Cree un nuevo feed de acuerdo con su caso de uso (por ejemplo, phishing, brand abuse, credential leaks), configurando los filtros deseados.
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:
(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 & Integrations→Feeds, 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):
En Azure Portal, busque
Deploy a custom template.Haga clic en
Build your own template in the editor.Pegue el JSON a continuación →
Save.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:
Busque
Resource groups→Create.Seleccione la
Subscriptionde destino y elija un nombre deResource group(por ejemplo,rg-sentinel-axur-prod).Elija una
Regionalineada con donde planea crear Logic App, DCE, DCR y Log Analytics →Review + create→Create.
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:
Busque y seleccione
Logic apps→Add.
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) oStandard(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
Subscriptioncorrecta (para facturación/gobernanza), seleccione suResource group(o cree uno como se indicó anteriormente), establezca unLogic app namey elija unaRegion(mantenga la misma región que utilizará para Log Analytics). EstablezcaPlanenConsumption→Review + create→Create.Después de la implementación, vaya al recurso de Logic App.
Habilitar Managed Identity:
Identity→System assigned→Status: On→Save.
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 Tools→Logic App Code viewy 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:
Busque
Data collection endpoints→Create.Aspectos básicos: seleccione la
Subscriptioncorrecta, elija suResource group(preferiblemente el mismo que el de la Logic App), establezca unNamey elija laRegion(que coincida con la región de su Log Analytics) →Review + create→Create.Después de la implementación, abra el DCE. En
Overview, copie la URL base delIngestion (Data Collection) endpoint; la pegará comodce_ingestion_base_urlen 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:
Busque
Log Analytics workspaces→Create(o seleccione uno existente).Aspectos básicos: seleccione la
Subscriptioncorrecta, elija suResource group(idealmente el mismo utilizado para Logic App/DCE), establezca unNamey elija laRegion(mantenga la coherencia con el DCE y la Logic App) →Review + create→Create.Habilitar Sentinel: vaya a
Microsoft Sentinel→Create→ 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:
Abra su
Log Analytics workspace→ haga clic en el workspace creado →Settings→Tables→Create→ seleccioneCustom log (DCR-based).Asigne un nombre a la tabla (por ejemplo,
AxurTickets). En Logs, la tabla aparecerá con el sufijo_CL(por ejemplo,AxurTickets_CL).Cuando se le solicite, seleccione el DCE que creó para el enrutamiento de ingesta.
En
Schema and transformations: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:
Vaya al DCR →
Access control (IAM)→Add role assignment.Seleccionar rol: prefiera
Monitoring Data Sender. Si no está disponible en su tenant, utiliceMonitoring Metrics Publishercomo alternativa.Siguiente → Members → Seleccione la managed identity de la Logic App (system-assigned).
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
Workflow→Parameters(oDevelopment Tools→Logic App Code viewy edite el bloqueparameters), luego introduzca los valores a continuación y guarde.
Valores a proporcionar:
URL base de ingesta del DCE (desde
Overviewdel DCE →Ingestion (Data Collection) endpoint).DCR immutable ID (desde
Propertiesdel 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 Historyen 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_namecoincide con la tabla personalizada creada (prefijoCustom-).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 Senderen el DCR (oMonitoring Metrics Publishercomo 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] 😊

























