Recopila registros de alertas de Netskope v1
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
- Accede al usuario de Netskope con tus credenciales de administrador.
- Ve a Configuración > Herramientas > API de REST v1.
- Crea una nueva clave de API específicamente para Google SecOps.
- Proporciona un nombre descriptivo (por ejemplo, Clave de Google SecOps).
- Copia y guarda la clave y el secreto generados.
Configura un feed en Google SecOps para transferir registros de alertas de Netskope
- Ve a Configuración de SIEM > Feeds.
- Haz clic en Agregar nueva.
- En el campo Nombre del feed, ingresa un nombre para el feed (por ejemplo, Registros de alertas de Netskope).
- Selecciona API de terceros como el Tipo de origen.
- Selecciona Netskope como el Tipo de registro.
- Haz clic en Siguiente.
- 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.
- Encabezado HTTP de autenticación: Es el par de claves generado anteriormente en formato
- Haz clic en Siguiente.
- 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
- Ve a Configuración de SIEM > Feeds.
- Haz clic en Agregar nueva.
- En el campo Nombre del feed, ingresa un nombre para el feed (por ejemplo, Registros de eventos de Netskope).
- Selecciona API de terceros como el Tipo de origen.
- Selecciona Netskope como el Tipo de registro.
- Haz clic en Siguiente.
- 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.
- Encabezado HTTP de autenticación: Es el par de claves generado anteriormente en formato
- Haz clic en Siguiente.
- 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".