Recopila registros de recursos de Microsoft Azure
En este documento, se explica cómo recopilar registros de recursos de Microsoft Azure configurando un feed de Google Security Operations con Microsoft Azure Blob Storage V2.
Los registros de recursos de Azure proporcionan información sobre las operaciones que se realizan en los recursos de Azure. En estos registros, se captura información detallada sobre las operaciones, el estado y las métricas de rendimiento de los recursos. El contenido varía según el tipo de recurso y contiene datos como eventos de autenticación, cambios de configuración, intentos de acceso y métricas operativas.
Antes de comenzar
Asegúrate de cumplir con los siguientes requisitos previos:
- Una instancia de Google SecOps
Acceso con privilegios al portal de Microsoft Azure con permisos para realizar las siguientes acciones:
- Crea cuentas de almacenamiento
- Configura los parámetros de diagnóstico para los recursos de Azure
- Administra las claves de acceso
Configura la cuenta de Azure Storage
Crea una cuenta de almacenamiento
- En el portal de Azure, busca Cuentas de almacenamiento.
- Haz clic en + Crear.
Proporciona los siguientes detalles de configuración:
Configuración Valor Suscripción Selecciona tu suscripción a Azure Grupo de recursos Selecciona una condición existente o crea una nueva Nombre de la cuenta de almacenamiento Ingresa un nombre único (por ejemplo, azureresourcelogs).Región Selecciona la región (por ejemplo, East US).Rendimiento Estándar (recomendado) Redundancia GRS (almacenamiento con redundancia geográfica) o LRS (almacenamiento con redundancia local) Haz clic en Revisar + crear.
Revisa el resumen de la cuenta y haz clic en Crear.
Espera a que se complete la implementación.
Obtén credenciales de la cuenta de almacenamiento
- Ve a la cuenta de almacenamiento que acabas de crear.
- En la navegación de la izquierda, selecciona Claves de acceso en Seguridad y redes.
- Haz clic en Mostrar claves.
Copia y guarda lo siguiente para usarlo más adelante:
- Nombre de la cuenta de almacenamiento:
azureresourcelogs - Clave 1 o Clave 2: Es la clave de acceso compartido (una cadena aleatoria de 512 bits en codificación base64).
- Nombre de la cuenta de almacenamiento:
Obtén el extremo del servicio Blob
- En la misma cuenta de almacenamiento, selecciona Extremos en la navegación de la izquierda.
- Copia y guarda la URL del extremo del servicio de Blob.
- Ejemplo:
https://azureresourcelogs.blob.core.windows.net/
- Ejemplo:
Configura los parámetros de diagnóstico de recursos de Azure
Los registros de recursos de Azure no se recopilan de forma predeterminada. Debes crear un parámetro de configuración de diagnóstico para cada recurso de Azure para enrutar los registros a la cuenta de almacenamiento.
- En el portal de Azure, navega hasta el recurso de Azure que quieres supervisar.
- En el panel de navegación de la izquierda, selecciona Configuración de diagnóstico en Supervisión.
- Haz clic en + Agregar parámetro de configuración de diagnóstico.
- Proporciona los siguientes detalles de configuración:
- Nombre del parámetro de configuración de diagnóstico: Ingresa un nombre descriptivo (por ejemplo,
export-to-secops). - En la sección Registros, selecciona las categorías de registros que deseas recopilar. Las categorías disponibles varían según el tipo de recurso. Entre las categorías habituales, se incluyen las siguientes:
- Administrativa (para los registros de actividad)
- Seguridad (para los registros de actividad)
- AuditEvent (para Key Vault)
- ApplicationGatewayAccessLog (para Application Gateway)
- ApplicationGatewayFirewallLog (para Application Gateway)
- NetworkSecurityGroupEvent (para grupos de seguridad de red)
- En la sección Métricas (opcional), selecciona AllMetrics para enviar métricas de la plataforma a la cuenta de almacenamiento.
- En la sección Detalles del destino, selecciona la casilla de verificación Archivar en una cuenta de almacenamiento.
- Suscripción: Selecciona la suscripción que contiene tu cuenta de almacenamiento.
- Cuenta de almacenamiento: Selecciona la cuenta de almacenamiento que creaste (por ejemplo,
azureresourcelogs).
- Nombre del parámetro de configuración de diagnóstico: Ingresa un nombre descriptivo (por ejemplo,
- Haz clic en Guardar.
Después de la configuración, los registros se exportan automáticamente a los contenedores de la cuenta de almacenamiento. Azure crea contenedores con el patrón de nombres insights-logs-<log-category-name>. Por ejemplo:
- Registros de auditoría de Key Vault:
insights-logs-auditevent - Registros de acceso de Application Gateway:
insights-logs-applicationgatewayaccesslog - Registros del firewall de Application Gateway:
insights-logs-applicationgatewayfirewalllog Eventos del grupo de seguridad de red:
insights-logs-networksecuritygroupevent
Configura un feed en Google SecOps para transferir registros de recursos de Azure
- Ve a Configuración de SIEM > Feeds.
- Haz clic en Agregar feed nuevo.
- En la siguiente página, haz clic en Configurar un solo feed.
- En el campo Nombre del feed, ingresa un nombre para el feed (por ejemplo,
Azure Resource Logs - Key Vault). - Selecciona Microsoft Azure Blob Storage V2 como el Tipo de fuente.
- Selecciona Recurso de Microsoft Azure como el Tipo de registro.
- Haz clic en Siguiente.
Especifica valores para los siguientes parámetros de entrada:
- URI de Azure: Ingresa la URL del extremo del servicio Blob con la ruta de acceso del contenedor:
https://azureresourcelogs.blob.core.windows.net/insights-logs-auditevent/- Reemplaza lo siguiente:
azureresourcelogs: Es el nombre de tu cuenta de almacenamiento de Azure.insights-logs-auditevent: Es el nombre del contenedor de blobs en el que se almacenan los registros (varía según el tipo de recurso y la categoría de registro).
Opción de borrado de la fuente: Selecciona la opción de borrado según tu preferencia:
- Nunca: Nunca borra ningún archivo después de las transferencias.
- Borrar archivos transferidos: Borra los archivos después de la transferencia exitosa.
- Borrar los archivos transferidos y los directorios vacíos: Borra los archivos y los directorios vacíos después de la transferencia exitosa.
Antigüedad máxima del archivo: Incluye los archivos modificados en la cantidad de días especificada. El valor predeterminado es de 180 días.
Clave compartida: Ingresa el valor de la clave compartida (clave de acceso) que capturaste de la cuenta de almacenamiento en el paso 3.
Espacio de nombres del recurso: Es el espacio de nombres del recurso.
Etiquetas de transmisión: Es la etiqueta que se aplicará a los eventos de este feed.
Haz clic en Siguiente.
Revisa la nueva configuración del feed en la pantalla Finalizar y, luego, haz clic en Enviar.
Configura el firewall de Azure Storage (si está habilitado)
Si tu cuenta de Azure Storage usa un firewall, debes agregar los rangos de IP de Google SecOps.
- En el portal de Azure, ve a tu cuenta de almacenamiento (por ejemplo,
azureresourcelogs). - Selecciona Herramientas de redes en Seguridad y redes.
- En Firewalls and virtual networks, selecciona Enabled from selected virtual networks and IP addresses.
- En la sección Firewall, en Rango de direcciones, haz clic en + Agregar rango de IP.
Agrega cada rango de IP de Google SecOps en notación CIDR.
- Para obtener los rangos de IP actuales, elige una de las siguientes opciones:
- Consulta la documentación sobre la inclusión en la lista de anunciantes permitidos de IP
- Recupéralos de manera programática con la API de Feed Management
- Para obtener los rangos de IP actuales, elige una de las siguientes opciones:
Haz clic en Guardar.
Tabla de asignación de UDM
| Campo de registro | Asignación de UDM | Lógica |
|---|---|---|
| Varios campos*_labelfield adicionales | additional.fields | Se combinaron varios campos*_labeladicionales. |
| authenticationMethod | extensions.auth.mechanism | Se establece en USERNAME_PASSWORD si authenticationMethod es Password |
| category, event_type | extensions.auth.type | Se establece en MACHINE para SQLSecurityAuditEvents, en SSO para categorías específicas y en AUTHTYPE_UNSPECIFIED para otras. |
| properties.partialipaddress | intermediary.ip | Valor de properties.partialipaddress si no está vacío |
| properties.event_time, stage_time, risk_time, last_update_time, time | metadata.collected_timestamp | Se convierte con ISO8601 a partir de properties.event_time, stage_time, risk_time, last_update_time o time con grok de resguardo. |
| properties.message, properties.activity, properties.log.stage | metadata.description | Valor de properties.message si no está vacío; de lo contrario, de properties.activity; de lo contrario, de properties.log.stage |
| event_type | metadata.event_type | Valor de event_type si no está vacío; de lo contrario, GENERIC_EVENT |
| categoría, record.category | metadata.product_event_type | Valor copiado directamente de category o record.category |
| properties.event_id, properties.log.auditID | metadata.product_log_id | Valor de properties.event_id si no está vacío; de lo contrario, de properties.log.auditID |
| properties.log.apiVersion | metadata.product_version | Valor copiado directamente de properties.log.apiVersion |
| protocolo | network.application_protocol | Valor copiado directamente del protocolo |
| properties.log.verb | network.dhcp.opcode | Valor copiado directamente de properties.log.verb (en mayúsculas) |
| properties.CsMethod, record.properties.CsMethod | network.http.method | Valor copiado directamente de properties.CsMethod o record.properties.CsMethod |
| user_agent | network.http.parsed_user_agent | Se convirtió de user_agent |
| properties.Referer, uri | network.http.referral_url | Valor de properties.Referer si no está vacío; de lo contrario, de uri |
| properties.ScStatus, record.properties.ScStatus, properties.statusCode, record.properties.statusCode, responseStatus.code | network.http.response_code | Se convierte en un número entero a partir de properties.ScStatus, record.properties.ScStatus, properties.statusCode, record.properties.statusCode o responseStatus.code. |
| user_agent | network.http.user_agent | Valor copiado directamente de user_agent |
| properties.ScBytes, record.properties.ScBytes, properties.responseLength | network.received_bytes | Se convirtió a uinteger desde properties.ScBytes, record.properties.ScBytes o properties.responseLength. |
| properties.CsBytes, record.properties.CsBytes, properties.requestLength | network.sent_bytes | Se convirtió a uinteger desde properties.CsBytes, record.properties.CsBytes o properties.requestLength. |
| properties.session_id | network.session_id | Valor copiado directamente de properties.session_id (convertido a cadena) |
| properties.tlsVersion | network.tls.version | Valor copiado directamente de properties.tlsVersion |
| domain_name_value | principal.administrative_domain | Valor copiado directamente de domain_name_value |
| properties.clientAppUsed, target_application | principal.application | Valor de properties.clientAppUsed si no está vacío; de lo contrario, de target_application |
| prop_device_id | principal.asset.asset_id | Se establece en ID de dispositivo: seguido de prop_device_id si no es nulo. |
| hardware | principal.asset.hardware | Se fusionó desde el hardware |
| properties.host_name, properties.CIp, record.properties.CIp, properties.ComputerName, record.properties.ComputerName, properties.CsHost, record.properties.CsHost, properties.server_instance_name, record.properties.server_instance_name, server_name | principal.asset.hostname | Valor de properties.host_name si no está vacío; de lo contrario, de properties.CIp (IP de Grok), record.properties.CIp (IP de Grok), properties.ComputerName, record.properties.ComputerName, properties.CsHost, record.properties.CsHost, properties.server_instance_name, record.properties.server_instance_name o server_name |
| src_ip, src_ip1, properties.client_ip, record.properties.clientIpAddress, properties.clientIpAddress, callerIpAddress, properties.ipAddress, ip | principal.asset.ip | Valor de src_ip, src_ip1, properties.client_ip (IP de Grok), record.properties.clientIpAddress, properties.clientIpAddress (IP de Grok), record.properties.clientIpAddress, callerIpAddress (IP de Grok), properties.ipAddress o ip |
| properties.host_name, properties.CsHost, record.properties.CsHost | principal.hostname | Valor de properties.host_name si no está vacío; de lo contrario, de properties.CsHost o record.properties.CsHost |
| src_ip, src_ip1, properties.client_ip, record.properties.clientIpAddress, properties.clientIpAddress, callerIpAddress, properties.ipAddress, ip | principal.ip | Valor de src_ip, src_ip1, properties.client_ip (IP de Grok), record.properties.clientIpAddress, properties.clientIpAddress (IP de Grok), record.properties.clientIpAddress, callerIpAddress (IP de Grok), properties.ipAddress o ip |
| properties.location.city, provisioning_steps_city | principal.location.city | Valor de properties.location.city si no está vacío; de lo contrario, de provisioning_steps_city |
| properties.location.countryOrRegion, provisioning_steps_country, location, Region | principal.location.country_or_region | Valor de properties.location.countryOrRegion si no está vacío; de lo contrario, de provisioning_steps_country; de lo contrario, de location; de lo contrario, de Region |
| properties.location.geoCoordinates.latitude | principal.location.region_latitude | Valor copiado directamente de properties.location.geoCoordinates.latitude |
| properties.location.geoCoordinates.longitude | principal.location.region_longitude | Valor copiado directamente de properties.location.geoCoordinates.longitude |
| properties.location.state | principal.location.state | Valor copiado directamente de properties.location.state |
| prop_os | principal.platform | Se establece en WINDOWS si prop_os coincide con (?i)Win; en LINUX si coincide con (?i)Lin; en MAC si coincide con (?i)Mac. |
| properties.deviceDetail.operatingSystem | principal.platform_version | Valor copiado directamente de properties.deviceDetail.operatingSystem |
| src_port | principal.port | Se convirtió en un número entero a partir de src_port |
| is_compliant_label, is_managed_label, serice_type_label, serice_credential_label | principal.resource.attribute.labels | Se combinó de is_compliant_label, is_managed_label, serice_type_label, serice_credential_label |
| properties.sourceSystem.Name | principal.resource.name | Valor copiado directamente de properties.sourceSystem.Name |
| properties.sourceSystem.Id | principal.resource.product_object_id | Valor copiado directamente de properties.sourceSystem.Id |
| properties.server_principal_name, source_user_principal_name, user_principal_name, local_account_username_value | principal.user.email_addresses | Se fusionó de properties.server_principal_name (si coincide con el correo electrónico), source_user_principal_name (si coincide con el correo electrónico), user_principal_name (si coincide con el correo electrónico) o local_account_username_value (si coincide con el correo electrónico). |
| properties.sequence_group_id, grpname, properties.log.user.groups | principal.user.group_identifiers | Se combinó a partir de properties.sequence_group_id, grpname o properties.log.user.groups |
| properties.sourceIdentity.details.id, properties.userId, details_id_not_present | principal.user.product_object_id | Valor de properties.sourceIdentity.details.id si no está vacío; de lo contrario, de properties.userId; de lo contrario, de details_id_not_present |
| properties.ServicePrincipalDisplayName, properties.servicePrincipalName, properties.sourceIdentity.details.DisplayName, properties.userDisplayName, record.properties.log.user.username | principal.user.user_display_name | Valor de properties.ServicePrincipalDisplayName si no está vacío; de lo contrario, de properties.servicePrincipalName; de lo contrario, de properties.sourceIdentity.details.DisplayName; de lo contrario, de properties.userDisplayName; de lo contrario, de record.properties.log.user.username |
| properties.servicePrincipalId, user_userPrincipalName, source_user_principal_name, details_user_principal_name, user_principal_name, properties.accountName, record.properties.log.user.uid | principal.user.userid | Valor de properties.servicePrincipalId si no está vacío; de lo contrario, de user_userPrincipalName; de lo contrario, de source_user_principal_name; de lo contrario, de details_user_principal_name; de lo contrario, de user_principal_name; de lo contrario, de properties.accountName; de lo contrario, de record.properties.log.user.uid |
| security_action, succeeded, statusText, resultType | security_result.action | Se establece en ALLOW si security_action es allow; de lo contrario, se establece en ALLOW si succeeded es verdadero o si statusText es Success o resultType es success; de lo contrario, se establece en BLOCK si succeeded es falso o si statusText es failed o resultType es failed. |
| properties.action_name | security_result.action_details | Valor copiado directamente de properties.action_name |
| status_label | security_result.about.resource.attribute.labels | Se combinó desde status_label |
| properties_log_label, corr_key_label, resultType_label, resultSignature_label, networkName_label, networkType_label, method_label, authentication_step_requirement_label, authentication_step_result_detail_label, stepdate_label, initiatedby_name_label, initiatedby_id_label, initiatedby_type_label, targetSystem_id_label, targetSystem_name_label, containerID_label, pod_label, authentication_label, api_name_label, scale_unit_label, namespace_name_label, subscription_id_label, activity_id_label_1, task_name_label, environment_label, cookie, additional_field_event_ip, additional_field_event_primary_stamp, additional_field_event_stamp_type, source, correlationId_field, activityDateTime_field, detectedDateTime_field, lastUpdatedDateTime_field, count_label, total_label, minimum_label, maximum_label, average_label, metricName_label, timeGrain_label, ApiName_label, Authentication_label, GeoType_label, old_label, new_label, add_label, keyId_label, sr_result.rule_name, sr_result.rule_id, resultField, sr_result.detection_fields | security_result.detection_fields | Se combinaron de properties_log_label, corr_key_label, resultType_label, resultSignature_label, networkName_label, networkType_label, method_label, authentication_step_requirement_label, authentication_step_result_detail_label, stepdate_label, initiatedby_name_label, initiatedby_id_label, initiatedby_type_label, targetSystem_id_label, targetSystem_name_label, containerID_label, pod_label, authentication_label, api_name_label, scale_unit_label, namespace_name_label, subscription_id_label, activity_id_label_1, task_name_label, environment_label, cookie, additional_field_event_ip, additional_field_event_primary_stamp, additional_field_event_stamp_type, source, correlationId_field, activityDateTime_field, detectedDateTime_field, lastUpdatedDateTime_field, count_label, total_label, minimum_label, maximum_label, average_label, metricName_label, timeGrain_label, ApiName_label, Authentication_label, GeoType_label, old_label, new_label, add_label, keyId_label, sr_result.rule_name, sr_result.rule_id, resultField, sr_result.detection_fields |
| resultDescription, sec_result.description, properties.queryexecutionstatus | security_result.description | Valor de resultDescription (gsub newlines); de lo contrario, de sec_result.description; de lo contrario, de properties.queryexecutionstatus |
| policy_id_value | security_result.rule_id | El valor se copió directamente de policy_id_value. |
| properties.Result, statusText, properties.queryexecutionstatus | security_result.summary | Valor de properties.Result si no está vacío; de lo contrario, de statusText; de lo contrario, de properties.queryexecutionstatus |
| target_application | target.application | Valor de target_application |
| properties.ComputerName, record.properties.ComputerName, properties.server_instance_name, record.properties.server_instance_name | target.asset.hostname | Valor de properties.ComputerName, record.properties.ComputerName, properties.server_instance_name o record.properties.server_instance_name |
| (codificado) | target.cloud.environment | Se establece en "MICROSOFT_AZURE". |
| properties.SPort, record.properties.SPort | target.port | Se convirtió en un número entero a partir de properties.SPort o record.properties.SPort |
| properties.querytext.query | target.process.command_line | Valor copiado directamente de properties.querytext.query |
| properties.processId | target.process.pid | Se convirtió en cadena a partir de properties.processId |
| subscription_id_label, resource_group_label, request_resource_type_label, request_resource_id_label, additional_objectKey, additional_clientRequestId, additional_RiskEventType, additional_tokenIssuerType, keyId_label, appid_label | target.resource.attribute.labels | Se combinó de subscription_id_label, resource_group_label, request_resource_type_label, request_resource_id_label, additional_objectKey, additional_clientRequestId, additional_RiskEventType, additional_tokenIssuerType, keyId_label, appid_label |
| properties_databasename, properties.resourceDisplayName, record.properties.databasename, record.properties.databaseName | target.resource.name | Valor de properties_databasename si no está vacío; de lo contrario, de properties.resourceDisplayName; de lo contrario, de record.properties.databasename; de lo contrario, de record.properties.databaseName |
| resourceId, properties.resourceId | target.resource.product_object_id | Valor de resourceId si no está vacío; de lo contrario, de properties.resourceId |
| properties_collectionname, properties.resourceDisplayName, record.properties.collectionname, record.properties.collectionName, properties.log.objectRef.resource | target.resource.resource_subtype | Valor de properties_collectionname si no está vacío; de lo contrario, de properties.resourceDisplayName; de lo contrario, de record.properties.collectionname; de lo contrario, de record.properties.collectionName; de lo contrario, de properties.log.objectRef.resource |
| resourceId, message | target.resource.resource_type | Se establece en DATABASE si resourceId coincide con el patrón; de lo contrario, se establece en CLUSTER si el mensaje coincide con MANAGEDCLUSTERS; de lo contrario, se establece en VIRTUAL_MACHINE si coincide con MANAGEDINSTANCES; de lo contrario, se establece en DATABASE si coincide con DATABASEACCOUNTS. |
| resourceType | target.resource.type | Valor copiado directamente de resourceType |
| properties.CsUriStem, properties.log.requestURI, value (de additionalInfo) | target.url | Valor de properties.CsUriStem si no está vacío; de lo contrario, de properties.log.requestURI; de lo contrario, del valor (de additionalInfo) |
| user_principal_name | target.user.email_addresses | Se fusionó de user_principal_name (si coincide con el correo electrónico) |
| properties.userId | target.user.product_object_id | Valor copiado directamente de properties.userId |
| properties.userDisplayName | target.user.user_display_name | Valor copiado directamente de properties.userDisplayName |
| user_principal_name, properties.userPrincipalName | target.user.userid | Valor de user_principal_name si no está vacío; de lo contrario, de properties.userPrincipalName |
| (codificado) | metadata.product_name | Establece el valor en "Registros de recursos de Azure". |
| (codificado) | metadata.vendor_name | Se establece en "Microsoft". |
¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.