Coletar registros de alerta do Netskope v1
Visão geral
Esse analisador extrai registros de alerta do Netskope de mensagens formatadas em JSON e os transforma na UDM do Google Security Operations. Ele normaliza campos, analisa carimbos de data/hora, lida com alertas e severidades, extrai informações de rede (IPs, portas, protocolos), enriquece dados de usuários e arquivos e mapeia campos para a estrutura do UDM. O analisador também processa atividades específicas do Netskope, como logins e eventos de DLP, e adiciona rótulos personalizados para melhorar o contexto.
Antes de começar
- Verifique se você tem uma instância do Google SecOps.
- Verifique se você tem acesso privilegiado ao Netskope.
Ativar o acesso à API REST da Netskope
- Faça login no locatário do Netskope usando suas credenciais de administrador.
- Acesse Configurações > Ferramentas > API REST v1.
- Crie uma nova chave de API especificamente para o Google SecOps.
- Forneça um nome descritivo (por exemplo, Chave do Google SecOps).
- Copie e salve a chave e o secret gerados.
Configurar um feed no Google SecOps para processar registros de alerta do Netskope
- Acesse Configurações do SIEM > Feeds.
- Clique em Adicionar novo.
- No campo Nome do feed, digite um nome para o feed (por exemplo, Registros de alerta do Netskope).
- Selecione API de terceiros como o Tipo de origem.
- Selecione Netskope como o Tipo de registro.
- Clique em Próxima.
- Especifique valores para os seguintes parâmetros de entrada:
- Cabeçalho HTTP de autenticação:par de chaves gerado anteriormente no formato
<key>:<secret>
, usado para autenticação na API da Netskope. - Nome do host da API:o FQDN (nome de domínio totalmente qualificado) do endpoint de API REST da Netskope (por exemplo,
myinstance.goskope.com
). - Endpoint da API:digite alerts.
- Content Type:insira all.
- Namespace de recursos: o namespace de recursos.
- Rótulos de ingestão: o rótulo aplicado aos eventos desse feed.
- Cabeçalho HTTP de autenticação:par de chaves gerado anteriormente no formato
- Clique em Próxima.
- Revise a configuração do feed na tela Finalizar e clique em Enviar.
Opcional: adicione uma configuração de feed para importar registros de eventos do Netskope
- Acesse Configurações do SIEM > Feeds.
- Clique em Adicionar novo.
- No campo Nome do feed, insira um nome para o feed (por exemplo, Registros de eventos do Netskope).
- Selecione API de terceiros como o Tipo de origem.
- Selecione Netskope como o Tipo de registro.
- Clique em Próxima.
- Especifique valores para os seguintes parâmetros de entrada:
- Cabeçalho HTTP de autenticação:par de chaves gerado anteriormente no formato
<key>:<secret>
, usado para autenticação na API da Netskope. - Nome do host da API:o FQDN (nome de domínio totalmente qualificado) do endpoint de API REST da Netskope (por exemplo,
myinstance.goskope.com
). - Endpoint da API:digite events.
- Tipo de conteúdo:digite página, aplicação, auditoria, infraestrutura ou rede, dependendo dos eventos que você quer analisar.
- Namespace de recursos: o namespace de recursos.
- Rótulos de ingestão: o rótulo aplicado aos eventos desse feed.
- Cabeçalho HTTP de autenticação:par de chaves gerado anteriormente no formato
- Clique em Próxima.
- Revise a configuração do feed na tela Finalizar e clique em Enviar.
Tabela de mapeamento do UDM
Campo de registro | Mapeamento do UDM | Lógica |
---|---|---|
access_method |
extensions.auth.auth_details |
Mapeado diretamente do campo access_method . |
action |
security_result.action |
Mapeado diretamente do campo action ou definido como QUARANTINE se action for "alert" ou "bypass". ALLOW se action for permitido. BLOCK se action estiver bloqueado. |
action |
security_result.action_details |
Mapeado do campo action se ele for "alert" ou "bypass". |
activity |
security_result.description |
Mapeado diretamente do campo activity . |
alert |
is_alert |
Defina como true se alert for "sim", false caso contrário. |
alert_name |
- | Não mapeado para o objeto IDM. |
alert_type |
security_result.category_details |
Mapeado diretamente do campo alert_type . |
app |
target.application |
Mapeado diretamente do campo app . |
app_activity |
additional.fields {key:"app_activity", value:{string_value: |
Mapeado diretamente do campo app_activity como um par de chave-valor em additional.fields . |
app_session_id |
target.resource.attribute.labels {key:"App Session Id", value: |
Extraídos do campo message usando grok e adicionados como um rótulo. |
appcategory |
security_result.category_details |
Mapeado diretamente do campo appcategory se category estiver vazio. |
browser |
network.http.user_agent |
Mapeado diretamente do campo browser , se não for "unknown". |
browser_version |
network.http.parsed_user_agent.browser_version |
Mapeado diretamente do campo browser_version . |
browser_version |
network.http.parsed_user_agent.family |
Defina como "USER_DEFINED" se browser_version estiver presente. |
category |
security_result.category_details |
Mapeado diretamente do campo category . |
cci |
security_result.detection_fields {key:"cci", value: |
Mapeado diretamente do campo cci como um par de chave-valor em detection_fields . |
ccl |
security_result.confidence |
Defina com base no valor de ccl : "insatisfatório" ou "baixo" é mapeado para LOW_CONFIDENCE , "médio" para MEDIUM_CONFIDENCE , "alto" ou "excelente" para HIGH_CONFIDENCE . |
ccl |
security_result.confidence_details |
Mapeado diretamente do campo ccl . |
client_bytes |
network.sent_bytes |
Mapeado diretamente do campo client_bytes após a conversão para número inteiro não assinado. |
count |
additional.fields {key:"count", value:{string_value: |
Mapeado diretamente do campo count como um par de chave-valor em additional.fields . |
device |
principal.resource.resource_subtype |
Mapeado diretamente do campo device . |
device |
principal.resource.type |
Defina como "DEVICE" se o campo device estiver presente. |
dlp_file |
target.file.full_path |
Mapeado diretamente do campo dlp_file , se presente, ou de file_path . |
dlp_profile |
security_result.rule_type |
Mapeado diretamente do campo dlp_profile . |
dlp_rule |
security_result.rule_name |
Mapeado diretamente do campo dlp_rule . |
dlp_rule_severity |
security_result.severity |
Mapeado diretamente do campo dlp_rule_severity se alert_type for DLP. |
dlp_rule_severity |
_severity |
Mapeado do campo dlp_rule_severity se severity estiver vazio. |
domain |
target.asset.hostname |
Mapeado diretamente do campo domain . |
domain |
target.hostname |
Mapeado diretamente do campo domain . |
dsthost |
target.asset.hostname |
Mapeado diretamente do campo dsthost se não for um IP e dstip estiver vazio. Caso contrário, será mapeado para target.hostname . |
dsthost |
target.hostname |
Mapeado diretamente do campo dsthost se não for um IP e dstip não estiver vazio. |
dstip |
target.asset.ip |
Mapeado diretamente do campo dstip . |
dstip |
target.ip |
Mapeado diretamente do campo dstip . |
dstport |
target.port |
Mapeado diretamente do campo dstport após a conversão para número inteiro. |
dst_country |
target.location.country_or_region |
Mapeado diretamente do campo dst_country . |
dst_location |
target.location.city |
Mapeado diretamente do campo dst_location . |
dst_region |
target.location.name |
Mapeado diretamente do campo dst_region . |
file_path |
target.file.full_path |
Mapeado diretamente do campo file_path se dlp_file estiver vazio. |
file_size |
target.file.size |
Mapeado diretamente do campo file_size após a conversão para número inteiro não assinado. |
file_type |
target.file.mime_type |
Mapeado diretamente do campo file_type , se não for "Desconhecido". |
from_user |
network.email.from |
Mapeado diretamente do campo from_user se for um endereço de e-mail. |
from_user_category |
principal.resource.attribute.labels {key:"From User Category", value: |
Mapeado diretamente do campo from_user_category como um par de chave-valor em principal.resource.attribute.labels . |
hostname |
principal.asset.hostname |
Mapeado diretamente do campo hostname se não estiver vazio, caso contrário, de instance_id . |
hostname |
principal.hostname |
Mapeado diretamente do campo hostname se não estiver vazio, caso contrário, de instance_id . |
id.time |
metadata.event_timestamp |
Analisado e mapeado para event_timestamp nos metadados. |
instance_id |
principal.asset.hostname |
Mapeado diretamente do campo instance_id se hostname estiver vazio. |
instance_id |
principal.hostname |
Mapeado diretamente do campo instance_id se hostname estiver vazio. |
intermediary |
intermediary |
Mapeado diretamente do campo intermediary . |
ip_protocol |
network.ip_protocol |
Mapeado do campo ip_protocol depois de ser analisado pelo arquivo parse_ip_protocol.include . |
is_alert |
is_alert |
Campo gerado pelo analisador. Defina como verdadeiro se o campo alert for "sim". |
is_significant |
is_significant |
Campo gerado pelo analisador. Defina como "true" se _severity for "CRITICAL" ou "HIGH". |
ja3 |
network.tls.client.ja3 |
Mapeado diretamente do campo ja3 se corresponder a um padrão hexadecimal. |
ja3s |
network.tls.server.ja3s |
Mapeado diretamente do campo ja3s se corresponder a um padrão hexadecimal. |
malware_id |
security_result.threat_id |
Mapeado diretamente do campo malware_id . |
malware_name |
security_result.threat_name |
Mapeado diretamente do campo malware_name . |
malware_severity |
security_result.severity |
Mapeado diretamente do campo malware_severity após a conversão para maiúsculas. |
malware_type |
security_result.detection_fields {key:"Malware Type", value: |
Mapeado diretamente do campo malware_type como um par de chave-valor em detection_fields . |
matched_username |
principal.user.email_addresses |
Mapeado diretamente do campo matched_username se for um endereço de e-mail. |
md5 |
target.file.md5 |
Mapeado diretamente do campo md5 se ele não estiver vazio ou "Não disponível". |
metadata.event_type |
metadata.event_type |
Inicialmente, "GENERIC_EVENT", e depois pode ser substituído com base em outros campos. Defina como NETWORK_HTTP se srcip ou hostname e dstip ou dsthost ou domain estiverem presentes. Defina como STATUS_UPDATE se srcip ou hostname estiverem presentes, mas não dstip , dsthost ou domain . Defina como USER_UNCATEGORIZED se user estiver presente. Defina como EMAIL_UNCATEGORIZED se activity for "Introspection scan" e shared_with ou from_user estiverem presentes. Defina como USER_LOGIN se activity for "Login Failed", "Login Successful" ou "Login Attempt". |
metadata.log_type |
metadata.log_type |
Defina como "NETSKOPE_ALERT". |
metadata.product_log_id |
metadata.product_log_id |
Mapeado diretamente do campo _id . |
metadata.product_name |
metadata.product_name |
Defina como "Alerta do Netskope". |
metadata.vendor_name |
metadata.vendor_name |
Defina como "Netskope". |
netskope_pop |
observer.hostname |
Mapeado diretamente do campo netskope_pop . |
object |
additional.fields {key:"Object", value:{string_value: |
Mapeado diretamente do campo object como um par de chave-valor em additional.fields . |
object_id |
additional.fields {key:"Object id", value:{string_value: |
Mapeado diretamente do campo object_id como um par de chave-valor em additional.fields . |
object_type |
additional.fields {key:"Object type", value:{string_value: |
Mapeado diretamente do campo object_type como um par de chave-valor em additional.fields . |
organization_unit |
principal.administrative_domain |
Mapeado diretamente do campo organization_unit . |
os |
principal.platform |
Mapeado do campo os : "Windows" é mapeado para WINDOWS , "MAC" para MAC e "LINUX" para LINUX . |
os_version |
principal.platform_version |
Mapeado diretamente do campo os_version . |
other_categories |
- | Não mapeado para o objeto IDM. |
page |
network.http.referral_url |
Mapeado diretamente do campo page se referer estiver vazio. |
policy |
security_result.summary |
Mapeado diretamente do campo policy . |
principal.user.email_addresses |
principal.user.email_addresses |
Mesclado do campo user se for um endereço de e-mail. |
protocol |
network.application_protocol |
Mapeado diretamente do campo protocol após a remoção de tudo depois do primeiro "/". Conversão para letras maiúsculas. |
publisher_cn |
additional.fields {key:"publisher_cn", value:{string_value: |
Mapeado diretamente do campo publisher_cn como um par de chave-valor em additional.fields . |
publisher_name |
additional.fields {key:"publisher_name", value:{string_value: |
Mapeado diretamente do campo publisher_name como um par de chave-valor em additional.fields . |
referer |
network.http.referral_url |
Mapeado diretamente do campo referer . |
security_result.alert_state |
security_result.alert_state |
Defina como "ALERTING" se alert for "yes", "NOT_ALERTING" se alert for "no", "UNSPECIFIED" caso contrário. |
security_result.category_details |
security_result.category_details |
Mesclados dos campos category , appcategory ou alert_type . |
security_result.confidence |
security_result.confidence |
Derivado do campo ccl . |
security_result.confidence_details |
security_result.confidence_details |
Mapeado diretamente do campo ccl . |
security_result.description |
security_result.description |
Mapeado diretamente do campo activity . |
security_result.rule_name |
security_result.rule_name |
Mapeado diretamente do campo dlp_rule . |
security_result.rule_type |
security_result.rule_type |
Mapeado diretamente do campo dlp_profile . |
security_result.severity |
security_result.severity |
Derivada dos campos _severity , malware_severity ou dlp_rule_severity . |
security_result.summary |
security_result.summary |
Mapeado diretamente do campo policy . |
security_result.threat_id |
security_result.threat_id |
Mapeado diretamente do campo malware_id . |
security_result.threat_name |
security_result.threat_name |
Mapeado diretamente do campo malware_name . |
server_bytes |
network.received_bytes |
Mapeado diretamente do campo server_bytes após a conversão para número inteiro não assinado. |
severity |
_severity |
Mapeado diretamente do campo severity . |
sha256 |
target.file.sha256 |
Mapeado diretamente do campo sha256 . |
shared_with |
network.email.to |
Analisado do campo shared_with e adicionado à matriz network.email.to se for um endereço de e-mail. |
site |
additional.fields {key:"site", value:{string_value: |
Mapeado diretamente do campo site como um par de chave-valor em additional.fields . |
src_country |
principal.location.country_or_region |
Mapeado diretamente do campo src_country . |
src_latitude |
principal.location.region_latitude |
Mapeado diretamente do campo src_latitude . |
src_location |
principal.location.city |
Mapeado diretamente do campo src_location . |
src_longitude |
principal.location.region_longitude |
Mapeado diretamente do campo src_longitude . |
src_region |
principal.location.name |
Mapeado diretamente do campo src_region . |
srcip |
principal.asset.ip |
Extraídos do campo srcip usando grok e mesclados nos arrays principal.asset.ip e principal.ip . |
srcip |
principal.ip |
Extraídos do campo srcip usando grok e mesclados nos arrays principal.asset.ip e principal.ip . |
srcport |
principal.port |
Mapeado diretamente do campo srcport após a conversão para número inteiro. |
target.user.email_addresses |
target.user.email_addresses |
Mesclado do campo to_user se for um endereço de e-mail. |
threat_match_field |
security_result.detection_fields {key:"Threat Match Field", value: |
Mapeado diretamente do campo threat_match_field como um par de chave-valor em detection_fields . |
timestamp |
metadata.event_timestamp |
Analisado dos campos timestamp ou id.time . |
to_user |
target.user.email_addresses |
Analisado do campo to_user e adicionado à matriz target.user.email_addresses se for um endereço de e-mail. |
to_user_category |
target.resource.attribute.labels {key:"To User Category", value: |
Mapeado diretamente do campo to_user_category como um par de chave-valor em target.resource.attribute.labels . |
traffic_type |
security_result.detection_fields {key:"traffic_type", value: |
Mapeado diretamente do campo traffic_type como um par de chave-valor em detection_fields . |
tunnel_id |
additional.fields {key:"tunnel_id", value:{string_value: |
Mapeado diretamente do campo tunnel_id como um par de chave-valor em additional.fields . |
tunnel_type |
additional.fields {key:"tunnel_type", value:{string_value: |
Mapeado diretamente do campo tunnel_type como um par de chave-valor em additional.fields . |
type |
security_result.detection_fields {key:"type", value: |
Mapeado diretamente do campo type como um par de chave-valor em detection_fields . |
ur_normalized |
- | Não mapeado para o objeto IDM. |
url |
target.url |
Mapeado diretamente do campo url . |
user |
event.idm.read_only_udm.principal.user.userid |
Mapeado diretamente do campo user . |
user |
principal.user.email_addresses |
Mapeado diretamente do campo user se for um endereço de e-mail. |
useragent |
network.http.user_agent |
Mapeado diretamente do campo useragent . |
useragent |
network.http.parsed_user_agent |
Convertido em parseduseragent e mapeado para network.http.parsed_user_agent . |
user_agent |
network.http.user_agent |
Mapeado diretamente do campo user_agent . |
user_agent |
network.http.parsed_user_agent |
Convertido em parseduseragent e mapeado para network.http.parsed_user_agent . |
Alterações
2024-06-04
- "matched_username" foi associado a "principal.user.email_addresses".
- Quando "action" é "bypass" ou "alert", mapeie "action" para "security_result.action_details" e defina "security_result.action" como "QUARANTINE".
- Quando "alert_type" é "DLP", "dlp_rule_severity" é mapeado para "security_result.severity".
2024-02-19
- O mapeamento de "client_bytes" mudou de "network.received_bytes" para "network.sent_bytes".
- O mapeamento de "server_bytes" mudou de "network.sent_bytes" para "network.received_bytes".
2024-02-08
- Mapeamos "useragent" e "user_agent" para "network.http.user_agent" e "network.http.parsed_user_agent".
2023-11-10
- Adição do padrão Grok para verificar se "srcip" é um padrão de IP válido.
- "instance_id" foi mapeado para "principal.hostname".
- "traffic_type" foi associado a "security_result.detection_fields".
- "app_activity" foi associado a "additional.fields".
- "count" foi mapeado para "additional.fields".
- Mapeamos "site" para "additional.fields".
- Mapeou "device" para "principal.resource.resource_sub_type".
- "type" foi associado a "security_result.detection_fields".
- O mapeamento de "hostname" foi alterado para usar "replace" em vez de "rename".
- O mapeamento "cci" mudou de "additional.fields" para "security_result.detection_fields".
- O mapeamento "ccl" mudou de "additional.fields" para "security_result.confidence_details".
- "security_result.confidence" preenchido de acordo com o valor em "ccl".
2023-07-14
- Correção de bugs:
- Valor extraído para "browser_session_id","app_session_id" usando o padrão Grok antes do mapeamento.
- Adição de uma verificação de condição para validar o e-mail antes de mapear o campo "to_user".
2023-07-06
- Melhoria:
- O padrão Grok foi modificado para identificar se "dsthost" é um endereço IP ou não.
- Se "dsthost" for um endereço IP, ele será mapeado para "target.ip". Caso contrário, ele será mapeado para "target.hostname".
2023-06-06
- Melhoria:
- "domain" foi mapeado para "target.hostname".
- "app_session_id" foi mapeado para "target.resource.attribute.labels".
- Mapeamos "malware_severity" para "security_result.severity".
- Mapeamos "malware_type" para "security_result.detection_fields".
- O "threat_match_field" foi mapeado para "security_result.detection_fields".
- "Ja3" foi mapeado para "network.tls.client.ja3".
- "Ja3s" foi mapeado para "network.tls.server.ja3s".
- Mapeamos "cci" e "ccl" para "additional.fields".
- "access_method" foi associado a "extensions.auth.auth_details".
- "browser_version" foi associado a "network.http.parsed_user_agent.browser_version".
- Mapeou "dlp_profile" para "security_result.rule_type".
- "dlp_rule" foi associado a "security_result.rule_name".
- "netskope_pop" foi mapeado para "observer.hostname".
- "Page" foi mapeado para "network.http.referral_url".
- "to_user" foi associado a "target.user.email_addresses".
- "to_user_category" foi associado a "target.resource.attribute.labels".
2023-03-23
- Melhoria:
- "security_result.alert_state" foi mapeado para "ALERTING" se "alert" for igual a "yes".
- O "security_result.alert_state" foi mapeado para "NOT_ALERTING" se "alert" for igual a "no".
- O "security_result.alert_state" foi mapeado para "UNSPECIFIED" se "alert" for nulo.
2022-07-23
- O mapeamento desnecessário para "metadata.description" foi removido.
2022-07-01
- O campo "os" foi mapeado para "principal.platform".
- O campo "dsthost" é mapeado para "target.ip" se "dsthost" for um IP. Caso contrário, ele é mapeado para "target.hostname".
- O campo "dstport" foi mapeado para "target.port".
- O campo "srcport" foi mapeado para "principal.port".
- O campo "user" é associado a "principal.user.email_addresses" se "user" for um endereço de e-mail válido.
- O campo "src_latitude" foi mapeado para "principal.location.region_latitude".
- O campo "src_longitude" foi mapeado para "principal.location.region_longitude".
- O campo "ip_protocol" mapeado para "network.ip_protocol".
- O campo "client_bytes" foi mapeado para "network.received_bytes".
- O campo "server_bytes" foi mapeado para "network.sent_bytes".
- O campo "browser_session_id" foi mapeado para "network.session_id".
- O campo "network_session_id" foi mapeado para "network.session_id".
- O campo "appcategory" mapeado para "security_result.category_details".
- O campo "publisher_cn" foi mapeado para "additional.fields[n]".
- O campo "publisher_name" foi mapeado para "additional.fields[n]".
- O campo "tunnel_id" foi mapeado para "additional.fields[n]".
- O campo "tunnel_type" foi mapeado para "additional.fields[n]".
- O mapeamento do campo "shared_with" foi alterado de "intermediary.user.email_addresses" para "network.email.to".
- O mapeamento do campo "network.email.to" foi alterado de "principal.user.email_addresses" para "network.email.from".
- Foram adicionadas verificações condicionais para os campos "_severity", "shared_with", "from_user" e "protocol".
- Modificação de "metadata.event_type" para os seguintes casos:
- "GENERIC_EVENT" para "NETWORK_HTTP", em que "principal.ip ou principal.hostname" e "target.ip ou target.hostname" não são nulos.
- "GENERIC_EVENT" para "STATUS_UPDATE", em que "principal.ip ou principal.hostname" não é nulo.
- "GENERIC_EVENT" para "USER_UNCATEGORIZED", em que "principal.user.userid" não é nulo.
2022-06-17
- Correção de bugs:
- Foi adicionada uma verificação condicional para "md5" == "not available".