Recopila registros de recursos de Microsoft Azure

Se admite en los siguientes sistemas operativos:

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

  1. En el portal de Azure, busca Cuentas de almacenamiento.
  2. Haz clic en + Crear.
  3. 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)
  4. Haz clic en Revisar + crear.

  5. Revisa el resumen de la cuenta y haz clic en Crear.

  6. Espera a que se complete la implementación.

Obtén credenciales de la cuenta de almacenamiento

  1. Ve a la cuenta de almacenamiento que acabas de crear.
  2. En la navegación de la izquierda, selecciona Claves de acceso en Seguridad y redes.
  3. Haz clic en Mostrar claves.
  4. 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).

Obtén el extremo del servicio Blob

  1. En la misma cuenta de almacenamiento, selecciona Extremos en la navegación de la izquierda.
  2. Copia y guarda la URL del extremo del servicio de Blob.
    • Ejemplo: https://azureresourcelogs.blob.core.windows.net/

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.

  1. En el portal de Azure, navega hasta el recurso de Azure que quieres supervisar.
  2. En el panel de navegación de la izquierda, selecciona Configuración de diagnóstico en Supervisión.
  3. Haz clic en + Agregar parámetro de configuración de diagnóstico.
  4. 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).
  5. 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

  1. Ve a Configuración de SIEM > Feeds.
  2. Haz clic en Agregar feed nuevo.
  3. En la siguiente página, haz clic en Configurar un solo feed.
  4. En el campo Nombre del feed, ingresa un nombre para el feed (por ejemplo, Azure Resource Logs - Key Vault).
  5. Selecciona Microsoft Azure Blob Storage V2 como el Tipo de fuente.
  6. Selecciona Recurso de Microsoft Azure como el Tipo de registro.
  7. Haz clic en Siguiente.
  8. 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.

  9. Haz clic en Siguiente.

  10. 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.

  1. En el portal de Azure, ve a tu cuenta de almacenamiento (por ejemplo, azureresourcelogs).
  2. Selecciona Herramientas de redes en Seguridad y redes.
  3. En Firewalls and virtual networks, selecciona Enabled from selected virtual networks and IP addresses.
  4. En la sección Firewall, en Rango de direcciones, haz clic en + Agregar rango de IP.
  5. Agrega cada rango de IP de Google SecOps en notación CIDR.

  6. 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.