Recopila registros de alertas de Netskope v1

Compatible con:

Descripción general

Este analizador extrae registros de alertas de Netskope de mensajes con formato JSON y los transforma en el UDM de Google Security Operations. Normaliza los campos, analiza las marcas de tiempo, controla las alertas y las gravedades, extrae información de red (IP, puertos y protocolos), enriquece los datos de usuarios y archivos, y asigna campos a la estructura de la UDM. El analizador también controla actividades específicas de Netskope, como los accesos y los eventos de DLP, y agrega etiquetas personalizadas para mejorar el contexto.

Antes de comenzar

  • Asegúrate de tener una instancia de Google SecOps.
  • Asegúrate de tener acceso con privilegios a Netskope.

Habilita el acceso a la API de REST de Netskope

  1. Accede al usuario de Netskope con tus credenciales de administrador.
  2. Ve a Configuración > Herramientas > API de REST v1.
  3. Crea una nueva clave de API específicamente para Google SecOps.
  4. Proporciona un nombre descriptivo (por ejemplo, Clave de Google SecOps).
  5. Copia y guarda la clave y el secreto generados.

Configura un feed en Google SecOps para transferir registros de alertas de Netskope

  1. Ve a Configuración de SIEM > Feeds.
  2. Haz clic en Agregar nueva.
  3. En el campo Nombre del feed, ingresa un nombre para el feed (por ejemplo, Registros de alertas de Netskope).
  4. Selecciona API de terceros como el Tipo de origen.
  5. Selecciona Netskope como el Tipo de registro.
  6. Haz clic en Siguiente.
  7. Especifica valores para los siguientes parámetros de entrada:
    • Encabezado HTTP de autenticación: Es el par de claves generado anteriormente en formato <key>:<secret> que se usa para autenticar en la API de Netskope.
    • Nombre de host de la API: Es el FQDN (nombre de dominio completamente calificado) de tu extremo de API de REST de Netskope (por ejemplo, myinstance.goskope.com).
    • Extremo de API: Ingresa alerts.
    • Tipo de contenido: Ingresa todo.
    • Espacio de nombres de recursos: Es el espacio de nombres de recursos.
    • Etiquetas de transferencia: Es la etiqueta que se aplica a los eventos de este feed.
  8. Haz clic en Siguiente.
  9. Revisa la configuración del feed en la pantalla Finalizar y, luego, haz clic en Enviar.

Opcional: Agrega una configuración de feed para transferir los registros de eventos de Netskope

  1. Ve a Configuración de SIEM > Feeds.
  2. Haz clic en Agregar nueva.
  3. En el campo Nombre del feed, ingresa un nombre para el feed (por ejemplo, Registros de eventos de Netskope).
  4. Selecciona API de terceros como el Tipo de origen.
  5. Selecciona Netskope como el Tipo de registro.
  6. Haz clic en Siguiente.
  7. Especifica valores para los siguientes parámetros de entrada:
    • Encabezado HTTP de autenticación: Es el par de claves generado anteriormente en formato <key>:<secret> que se usa para autenticar en la API de Netskope.
    • Nombre de host de la API: Es el FQDN (nombre de dominio completamente calificado) de tu extremo de API de REST de Netskope (por ejemplo, myinstance.goskope.com).
    • Extremo de API: Ingresa events.
    • Tipo de contenido: Ingresa página, aplicación, auditoría, infraestructura o red según los eventos que quieras analizar.
    • Espacio de nombres de recursos: Es el espacio de nombres de recursos.
    • Etiquetas de transferencia: Es la etiqueta que se aplica a los eventos de este feed.
  8. Haz clic en Siguiente.
  9. Revisa la configuración del feed en la pantalla Finalizar y, luego, haz clic en Enviar.

Tabla de asignación de UDM

Campo de registro Asignación de UDM Lógica
access_method extensions.auth.auth_details Se asigna directamente desde el campo access_method.
action security_result.action Se asigna directamente desde el campo action o se establece en QUARANTINE si action es "alert" o "bypass". ALLOW si se permite action. BLOCK si action está bloqueado.
action security_result.action_details Se asigna desde el campo action si es "alert" o "bypass".
activity security_result.description Se asigna directamente desde el campo activity.
alert is_alert Se establece en true si alert es “sí”, false de lo contrario.
alert_name - No está asignado al objeto IDM.
alert_type security_result.category_details Se asigna directamente desde el campo alert_type.
app target.application Se asigna directamente desde el campo app.
app_activity additional.fields{key:"app_activity", value:{string_value: }} Se asigna directamente desde el campo app_activity como un par clave-valor en additional.fields.
app_session_id target.resource.attribute.labels{key:"App Session Id", value: } Se extrae del campo message con grok y se agrega como etiqueta.
appcategory security_result.category_details Se asigna directamente desde el campo appcategory si category está vacío.
browser network.http.user_agent Se asigna directamente desde el campo browser si no es “desconocido”.
browser_version network.http.parsed_user_agent.browser_version Se asigna directamente desde el campo browser_version.
browser_version network.http.parsed_user_agent.family Se establece en "USER_DEFINED" si browser_version está presente.
category security_result.category_details Se asigna directamente desde el campo category.
cci security_result.detection_fields{key:"cci", value: } Se asigna directamente desde el campo cci como un par clave-valor en detection_fields.
ccl security_result.confidence Se establece en función del valor de ccl: "pobre" o "bajo" se asigna a LOW_CONFIDENCE, "medio" a MEDIUM_CONFIDENCE, "alto" o "excelente" a HIGH_CONFIDENCE.
ccl security_result.confidence_details Se asigna directamente desde el campo ccl.
client_bytes network.sent_bytes Se asigna directamente desde el campo client_bytes después de convertirlo en número entero sin signo.
count additional.fields{key:"count", value:{string_value: }} Se asigna directamente desde el campo count como un par clave-valor en additional.fields.
device principal.resource.resource_subtype Se asigna directamente desde el campo device.
device principal.resource.type Se establece en "DEVICE" si el campo device está presente.
dlp_file target.file.full_path Se asigna directamente desde el campo dlp_file si está presente, de lo contrario, desde file_path.
dlp_profile security_result.rule_type Se asigna directamente desde el campo dlp_profile.
dlp_rule security_result.rule_name Se asigna directamente desde el campo dlp_rule.
dlp_rule_severity security_result.severity Se asigna directamente desde el campo dlp_rule_severity si alert_type es DLP.
dlp_rule_severity _severity Se asigna desde el campo dlp_rule_severity si severity está vacío.
domain target.asset.hostname Se asigna directamente desde el campo domain.
domain target.hostname Se asigna directamente desde el campo domain.
dsthost target.asset.hostname Se asigna directamente desde el campo dsthost si no es una IP y dstip está vacío; de lo contrario, se asigna a target.hostname.
dsthost target.hostname Se asigna directamente desde el campo dsthost si no es una IP y dstip no está vacío.
dstip target.asset.ip Se asigna directamente desde el campo dstip.
dstip target.ip Se asigna directamente desde el campo dstip.
dstport target.port Se asigna directamente desde el campo dstport después de convertirlo en número entero.
dst_country target.location.country_or_region Se asigna directamente desde el campo dst_country.
dst_location target.location.city Se asigna directamente desde el campo dst_location.
dst_region target.location.name Se asigna directamente desde el campo dst_region.
file_path target.file.full_path Se asigna directamente desde el campo file_path si dlp_file está vacío.
file_size target.file.size Se asigna directamente desde el campo file_size después de convertirlo en número entero sin signo.
file_type target.file.mime_type Se asigna directamente desde el campo file_type si no es “Desconocido”.
from_user network.email.from Se asigna directamente desde el campo from_user si es una dirección de correo electrónico.
from_user_category principal.resource.attribute.labels{key:"From User Category", value: } Se asigna directamente desde el campo from_user_category como un par clave-valor en principal.resource.attribute.labels.
hostname principal.asset.hostname Se asigna directamente desde el campo hostname si no está vacío, de lo contrario, desde instance_id.
hostname principal.hostname Se asigna directamente desde el campo hostname si no está vacío, de lo contrario, desde instance_id.
id.time metadata.event_timestamp Se analiza y se asigna a event_timestamp en los metadatos.
instance_id principal.asset.hostname Se asigna directamente desde el campo instance_id si hostname está vacío.
instance_id principal.hostname Se asigna directamente desde el campo instance_id si hostname está vacío.
intermediary intermediary Se asigna directamente desde el campo intermediary.
ip_protocol network.ip_protocol Se asigna desde el campo ip_protocol después de que el archivo parse_ip_protocol.include lo analiza.
is_alert is_alert Campo generado por el analizador. Se establece como verdadero si el campo alert es "sí".
is_significant is_significant Campo generado por el analizador. Se establece como verdadero si _severity es “CRITICAL” o “HIGH”.
ja3 network.tls.client.ja3 Se asigna directamente desde el campo ja3 si coincide con un patrón hexadecimal.
ja3s network.tls.server.ja3s Se asigna directamente desde el campo ja3s si coincide con un patrón hexadecimal.
malware_id security_result.threat_id Se asigna directamente desde el campo malware_id.
malware_name security_result.threat_name Se asigna directamente desde el campo malware_name.
malware_severity security_result.severity Se asignan directamente desde el campo malware_severity después de convertirlos a mayúsculas.
malware_type security_result.detection_fields{key:"Malware Type", value: } Se asigna directamente desde el campo malware_type como un par clave-valor en detection_fields.
matched_username principal.user.email_addresses Se asigna directamente desde el campo matched_username si es una dirección de correo electrónico.
md5 target.file.md5 Se asigna directamente desde el campo md5 si no está vacío o si aparece el valor "No disponible".
metadata.event_type metadata.event_type Se establece en "GENERIC_EVENT" inicialmente y, luego, se puede anular en función de otros campos. Se establece en NETWORK_HTTP si srcip o hostname y dstip o dsthost o domain están presentes. Se establece en STATUS_UPDATE si srcip o hostname están presentes, pero no dstip, dsthost ni domain. Se establece en USER_UNCATEGORIZED si user está presente. Se establece en EMAIL_UNCATEGORIZED si activity es "Introspection Scan" y shared_with o from_user están presentes. Establece en USER_LOGIN si activity es "Login Failed", "Login Successful" o "Login Attempt".
metadata.log_type metadata.log_type Establece el valor en "NETSKOPE_ALERT".
metadata.product_log_id metadata.product_log_id Se asigna directamente desde el campo _id.
metadata.product_name metadata.product_name Establece la opción en “Alerta de Netskope”.
metadata.vendor_name metadata.vendor_name Establece el valor en “Netskope”.
netskope_pop observer.hostname Se asigna directamente desde el campo netskope_pop.
object additional.fields{key:"Object", value:{string_value: }} Se asigna directamente desde el campo object como un par clave-valor en additional.fields.
object_id additional.fields{key:"Object id", value:{string_value: }} Se asigna directamente desde el campo object_id como un par clave-valor en additional.fields.
object_type additional.fields{key:"Object type", value:{string_value: }} Se asigna directamente desde el campo object_type como un par clave-valor en additional.fields.
organization_unit principal.administrative_domain Se asigna directamente desde el campo organization_unit.
os principal.platform Se asignan desde el campo os: "Windows" se asigna a WINDOWS, "MAC" a MAC y "LINUX" a LINUX.
os_version principal.platform_version Se asigna directamente desde el campo os_version.
other_categories - No está asignado al objeto IDM.
page network.http.referral_url Se asigna directamente desde el campo page si referer está vacío.
policy security_result.summary Se asigna directamente desde el campo policy.
principal.user.email_addresses principal.user.email_addresses Se une desde el campo user si es una dirección de correo electrónico.
protocol network.application_protocol Se asigna directamente desde el campo protocol después de quitar todo lo que sigue a la primera barra (/). Se convierte a mayúsculas.
publisher_cn additional.fields{key:"publisher_cn", value:{string_value: }} Se asigna directamente desde el campo publisher_cn como un par clave-valor en additional.fields.
publisher_name additional.fields{key:"publisher_name", value:{string_value: }} Se asigna directamente desde el campo publisher_name como un par clave-valor en additional.fields.
referer network.http.referral_url Se asigna directamente desde el campo referer.
security_result.alert_state security_result.alert_state Se establece en "ALERTING" si alert es "yes", en "NOT_ALERTING" si alert es "no" y en "UNSPECIFIED" en caso contrario.
security_result.category_details security_result.category_details Se combinan de los campos category, appcategory o alert_type.
security_result.confidence security_result.confidence Se deriva del campo ccl.
security_result.confidence_details security_result.confidence_details Se asigna directamente desde el campo ccl.
security_result.description security_result.description Se asigna directamente desde el campo activity.
security_result.rule_name security_result.rule_name Se asigna directamente desde el campo dlp_rule.
security_result.rule_type security_result.rule_type Se asigna directamente desde el campo dlp_profile.
security_result.severity security_result.severity Se deriva de los campos _severity, malware_severity o dlp_rule_severity.
security_result.summary security_result.summary Se asigna directamente desde el campo policy.
security_result.threat_id security_result.threat_id Se asigna directamente desde el campo malware_id.
security_result.threat_name security_result.threat_name Se asigna directamente desde el campo malware_name.
server_bytes network.received_bytes Se asigna directamente desde el campo server_bytes después de convertirlo en número entero sin signo.
severity _severity Se asigna directamente desde el campo severity.
sha256 target.file.sha256 Se asigna directamente desde el campo sha256.
shared_with network.email.to Se analiza desde el campo shared_with y se agrega al array network.email.to si es una dirección de correo electrónico.
site additional.fields{key:"site", value:{string_value: }} Se asigna directamente desde el campo site como un par clave-valor en additional.fields.
src_country principal.location.country_or_region Se asigna directamente desde el campo src_country.
src_latitude principal.location.region_latitude Se asigna directamente desde el campo src_latitude.
src_location principal.location.city Se asigna directamente desde el campo src_location.
src_longitude principal.location.region_longitude Se asigna directamente desde el campo src_longitude.
src_region principal.location.name Se asigna directamente desde el campo src_region.
srcip principal.asset.ip Se extraen del campo srcip con grok y se combinan en los arrays principal.asset.ip y principal.ip.
srcip principal.ip Se extraen del campo srcip con grok y se combinan en los arrays principal.asset.ip y principal.ip.
srcport principal.port Se asigna directamente desde el campo srcport después de convertirlo en número entero.
target.user.email_addresses target.user.email_addresses Se une desde el campo to_user si es una dirección de correo electrónico.
threat_match_field security_result.detection_fields{key:"Threat Match Field", value: } Se asigna directamente desde el campo threat_match_field como un par clave-valor en detection_fields.
timestamp metadata.event_timestamp Se analiza a partir de los campos timestamp o id.time.
to_user target.user.email_addresses Se analiza desde el campo to_user y se agrega al array target.user.email_addresses si es una dirección de correo electrónico.
to_user_category target.resource.attribute.labels{key:"To User Category", value: } Se asigna directamente desde el campo to_user_category como un par clave-valor en target.resource.attribute.labels.
traffic_type security_result.detection_fields{key:"traffic_type", value: } Se asigna directamente desde el campo traffic_type como un par clave-valor en detection_fields.
tunnel_id additional.fields{key:"tunnel_id", value:{string_value: }} Se asigna directamente desde el campo tunnel_id como un par clave-valor en additional.fields.
tunnel_type additional.fields{key:"tunnel_type", value:{string_value: }} Se asigna directamente desde el campo tunnel_type como un par clave-valor en additional.fields.
type security_result.detection_fields{key:"type", value: } Se asigna directamente desde el campo type como un par clave-valor en detection_fields.
ur_normalized - No está asignado al objeto IDM.
url target.url Se asigna directamente desde el campo url.
user event.idm.read_only_udm.principal.user.userid Se asigna directamente desde el campo user.
user principal.user.email_addresses Se asigna directamente desde el campo user si es una dirección de correo electrónico.
useragent network.http.user_agent Se asigna directamente desde el campo useragent.
useragent network.http.parsed_user_agent Se convirtió en parseduseragent y se asignó a network.http.parsed_user_agent.
user_agent network.http.user_agent Se asigna directamente desde el campo user_agent.
user_agent network.http.parsed_user_agent Se convirtió en parseduseragent y se asignó a network.http.parsed_user_agent.

Cambios

2024-06-04

  • Se asignó "matched_username" a "principal.user.email_addresses".
  • Cuando "action" sea "bypass" o "alert", asigna "action" a "security_result.action_details" y establece "security_result.action" en "QUARANTINE".
  • Cuando "alert_type" es "DLP", se asigna "dlp_rule_severity" a "security_result.severity".

2024-02-19

  • Se cambió la asignación de "client_bytes" de "network.received_bytes" a "network.sent_bytes".
  • Se cambió la asignación de "server_bytes" de "network.sent_bytes" a "network.received_bytes".

2024-02-08

  • Se asignaron "useragent" y "user_agent" a "network.http.user_agent" y "network.http.parsed_user_agent".

2023-11-10

  • Se agregó el patrón Grok para verificar si "srcip" es un patrón de IP válido.
  • Se asignó "instance_id" a "principal.hostname".
  • Se asignó "traffic_type" a "security_result.detection_fields".
  • Se asignó "app_activity" a "additional.fields".
  • Se asignó "count" a "additional.fields".
  • Se asignó "site" a "additional.fields".
  • Se asignó "device" a "principal.resource.resource_sub_type".
  • Se asignó "type" a "security_result.detection_fields".
  • Se cambió la asignación de "hostname" con "replace" en lugar de "rename".
  • Se cambió la asignación de "cci" de "additional.fields" a "security_result.detection_fields".
  • Se cambió la asignación de "ccl" de "additional.fields" a "security_result.confidence_details".
  • Se propagó "security_result.confidence" según el valor de "ccl".

2023-07-14

  • Bug-Fix:
  • Valor extraído para "browser_session_id","app_session_id" con el patrón Grok antes de la asignación.
  • Se agregó una verificación de condiciones para validar el correo electrónico antes de asignar el campo "to_user".

2023-07-06

  • Mejora:
  • Se modificó el patrón Grok para identificar si "dsthost" es una dirección IP o no.
  • Si "dsthost" es una dirección IP, se asigna a "target.ip"; de lo contrario, se asigna a "target.hostname".

2023-06-06

  • Mejora:
  • Se asignó "domain" a "target.hostname".
  • Se asignó "app_session_id" a "target.resource.attribute.labels".
  • Se asignó "malware_severity" a "security_result.severity".
  • Se asignó "malware_type" a "security_result.detection_fields".
  • Se asignó "threat_match_field" a "security_result.detection_fields".
  • Se asignó "ja3" a "network.tls.client.ja3".
  • Se asignó "ja3s" a "network.tls.server.ja3s".
  • Se asignaron "cci" y "ccl" a "additional.fields".
  • Se asignó "access_method" a "extensions.auth.auth_details".
  • Se asignó "browser_version" a "network.http.parsed_user_agent.browser_version".
  • Se asignó "dlp_profile" a "security_result.rule_type".
  • Se asignó "dlp_rule" a "security_result.rule_name".
  • Se asignó "netskope_pop" a "observer.hostname".
  • Se asignó "page" a "network.http.referral_url".
  • Se asignó "to_user" a "target.user.email_addresses".
  • Se asignó "to_user_category" a "target.resource.attribute.labels".

2023-03-23

  • Mejora:
  • Se asignó "security_result.alert_state" a "ALERTING" si "alert" es igual a "yes".
  • Se asignó "security_result.alert_state" a "NOT_ALERTING" si "alert" es igual a "no".
  • Se asignó "security_result.alert_state" a "UNSPECIFIED" si "alert" es nulo.

2022-07-23

  • Se quitó la asignación innecesaria para "metadata.description".

2022-07-01

  • El campo "os" se asignó a "principal.platform".
  • El campo "dsthost" se asigna a "target.ip" si "dsthost" es una IP; de lo contrario, se asigna a "target.hostname".
  • El campo "dstport" se asignó a "target.port".
  • El campo "srcport" se asignó a "principal.port".
  • El campo "user" asignado a "principal.user.email_addresses", si "user" es una dirección de correo electrónico válida
  • El campo "src_latitude" se asignó a "principal.location.region_latitude".
  • El campo "src_longitude" se asignó a "principal.location.region_longitude".
  • El campo "ip_protocol" se asignó a "network.ip_protocol".
  • El campo "client_bytes" se asignó a "network.received_bytes".
  • El campo "server_bytes" se asignó a "network.sent_bytes".
  • El campo "browser_session_id" se asignó a "network.session_id".
  • El campo "network_session_id" se asignó a "network.session_id".
  • El campo "appcategory" se asignó a "security_result.category_details".
  • El campo "publisher_cn" se asignó a "additional.fields[n]".
  • El campo "publisher_name" se asignó a "additional.fields[n]".
  • El campo "tunnel_id" se asignó a "additional.fields[n]".
  • El campo "tunnel_type" se asignó a "additional.fields[n]".
  • Se cambió la asignación del campo "shared_with" de "intermediary.user.email_addresses" a "network.email.to".
  • Se cambió la asignación del campo "network.email.to" de "principal.user.email_addresses" a "network.email.from".
  • Se agregaron verificaciones condicionales para los campos "_severity", "shared_with", "from_user" y "protocol".
  • Se modificó "metadata.event_type" para los siguientes casos:
  • "GENERIC_EVENT" a "NETWORK_HTTP", donde "principal.ip o principal.hostname" y "target.ip o target.hostname" no son nulos.
  • "GENERIC_EVENT" a "STATUS_UPDATE", donde "principal.ip o principal.hostname" no es nulo.
  • "GENERIC_EVENT" a "USER_UNCATEGORIZED", donde "principal.user.userid" no es nulo.

2022-06-17

  • Corrección de errores:
  • Se agregó la verificación condicional para "md5" == "not available".