Pesquisar dados de contexto da entidade

Compatível com:

O recurso Contexto da entidade na pesquisa melhora as investigações de segurança e a resposta a incidentes, permitindo que os usuários pesquisem e vejam eventos de contexto relacionados a entidades na conta do Google Security Operations. Ao contrário das pesquisas limitadas ao esquema de eventos padrão do modelo de dados unificado (UDM), esse recurso atende à necessidade de pesquisar além dos dados de eventos do UDM, incluindo o contexto da entidade do UDM, e oferece insights mais detalhados sobre incidentes de segurança.

Principais vantagens

  • Os analistas de segurança e caçadores de ameaças podem consultar informações contextuais sobre entidades.
  • Ajuda na análise da causa raiz, no hunting de ameaças e na perícia.
  • Os usuários podem fazer pesquisas estatísticas no contexto da entidade para entender os padrões de telemetria e as entidades afetadas pela análise de telemetria.

É possível usar o contexto de entidade para extrair insights dos resultados da pesquisa das seguintes maneiras:

  • Pesquisar usando nomes de campos de entidade da UDM: crie consultas de pesquisa usando nomes de campos de entidade da UDM. Por exemplo, para encontrar todos os eventos de contexto associados a um nome de host específico, crie uma pesquisa usando graph.entity.hostname.
  • Acessar a guia "Visão geral": a guia Visão geral oferece um resumo de alto nível das entidades encontradas na pesquisa, usando informações da consulta inserida por um usuário para mostrar informações. A página Visão geral mostra informações sobre tipos de entidades, como DOMAIN_NAME, IP_ADDRESS, ASSET, USER, FILE, GROUP e RESOURCE.
  • Use a guia "Entidade": ela lista todos os eventos de contexto de entidade recebidos, incluindo subcomponentes como "Tendência ao longo do tempo", "Filtro de snapshot", "Agregações" e "Eventos". As entidades são categorizadas em entidades com tempo e sem tempo, exibidas em guias separadas.
  • Ver agregações: as agregações são mostradas para campos, de maneira semelhante à pesquisa de eventos da UDM. As agregações são ainda mais categorizadas em tipos de contexto: contexto de entidade, contexto derivado e contexto global.

Caso de uso: investigar uma conta de usuário comprometida

Considere o seguinte cenário: um analista de segurança precisa investigar uma conta de usuário potencialmente comprometida (email@company.com). Siga estas etapas para investigar:

  1. Identifique o usuário comprometido: um alerta sinaliza que o usuário email@company.com foi identificado como uma conta suspeita.

  2. Reúna informações de contexto da entidade: receba dados contextuais sobre o usuário para entender o escopo e o impacto.

  3. Executar consultas: use o Contexto da entidade na Pesquisa para executar as seguintes consultas:

    • graph.entity.user.email_addresses = "email@company.com" para recuperar informações sobre o usuário.
    • graph.entity.user.email_addresses = "email@company.com" AND graph.metadata.product_name = "Google Cloud Compute Context" para verificar o nome do produto e outros metadados.
  4. Analisar a guia "Visão geral": a guia Visão geral mostra o resumo da entidade para o usuário, incluindo:

    • Verifique os carimbos de data/hora de First Seen Hour e Last Seen Hour.
  • Analise nomes de host, endereços IP e endereços MAC (se disponíveis).
  • Inspecione o modelo de hardware, a plataforma do SO e a versão da plataforma.
  1. Examinar a guia "Eventos": veja os eventos associados a esse usuário, incluindo tentativas de login e anomalias.

  2. Agregados de avaliações: identifique padrões e anomalias nos dados de contexto da entidade, distribuídos em contexto da entidade, contexto derivado e contexto global.

Para pesquisar dados de contexto de entidade, use os nomes dos campos de entidade da UDM nas consultas de pesquisa:

  • graph.entity.hostname
  • graph.entity.ip = "8.8.8.8" and graph.metadata.entity_type = "ASSET"

Os resultados da pesquisa mostram informações importantes sobre as entidades, incluindo:

  • Metadados da entidade
  • Métricas (First Seen Hour, Last Seen Hour)
  • Relações (Entity, Direction, Entity_label, Entity_type, Relationship)
  • Dependendo do tipo de entidade, campos específicos, como Principal_ip para recursos, Mail_id para usuários, File_name para hashes/arquivos e Domain_name e IP_address para domínios.

Exemplos de contexto da entidade na pesquisa

Esta seção oferece exemplos práticos de como usar o recurso "Contexto da entidade da UDM" para analisar estatísticas de entidades.

Para conferir as origens e os tipos de contexto disponíveis, execute a seguinte pesquisa de estatísticas de entidades da UDM na Pesquisa da UDM:

graph.metadata.source_type = $sourceType
graph.metadata.entity_type = $entityType
match:
  $sourceType, $entityType
outcome:
  $total = count(graph.metadata.product_entity_id)
order:
  $sourceType, $total desc
limit:
  100

O Seletor de período mostra dados ativos no gráfico de entidades, não quando os dados de contexto foram ingeridos.

Como a pesquisa de entidades da UDM usa a interface padrão da pesquisa da UDM, é possível usar recursos como o painel Agregações (para ver os valores mais altos ou mais baixos), a tabela de resultados e os resultados expandidos das estatísticas da UDM.

Exemplo: ver ENTITY_TYPE distintos

Para ampliar a pesquisa de entidades da UDM, inclua a origem do registro, o namespace e uma matriz de resultados para mostrar os ENTITY_TYPEs distintos observados, da seguinte maneira:

graph.metadata.source_type = "ENTITY_CONTEXT"
$logType = strings.to_upper(graph.metadata.event_metadata.base_labels.log_types)
$namespace = strings.to_upper(graph.metadata.event_metadata.base_labels.namespaces)
match:
  $logType, $namespace
outcome:
  $total = count(graph.metadata.product_entity_id)
  $entityTypes = array_distinct(graph.metadata.entity_type)
order:
  $logType, $total desc
limit:
  100

Exemplo: refinar seu conjunto de entidades

Você pode refinar um conjunto específico de entidades usando o recurso de pivô da pesquisa da UDM. Esse refinamento gera uma consulta YARA-L como esta:

graph.metadata.source_type = "ENTITY_CONTEXT"
$logType = strings.to_upper( graph.metadata.event_metadata.base_labels.log_types )
$namespace = strings.to_upper( graph.metadata.event_metadata.base_labels.namespaces )
AND strings.to_upper( graph.metadata.event_metadata.base_labels.log_types ) = "WINDOWS_AD"
AND strings.to_upper( graph.metadata.event_metadata.base_labels.namespaces ) = "ACME"

Contexto derivado

O Google SecOps oferece os seguintes tipos de contexto derivado:

  • Carimbos de data/hora first_seen e last_seen para cada ENTITY_TYPE
  • Prevalence: o número de recursos que acessaram um determinado ENTITY_TYPE.

Carimbos de data/hora First Seen Hour e Last Seen Hour

O Google SecOps realiza análises estatísticas dos dados recebidos e enriquece os registros de contexto da entidade com carimbos de data/hora first_seen e last_seen:

  • O campo first_seen_hour captura a hora em que uma entidade foi vista pela primeira vez no ambiente do cliente.
  • O campo last_seen_hour registra a hora da observação mais recente dessa entidade.

Usuários com uma hora de primeira visualização nos últimos sete dias:

graph.metadata.entity_type = "USER"
graph.entity.user.userid != ""
graph.entity.user.first_seen_time.hours >= timestamp.current_hours()-(86400 * 7)

Domínios vistos pela primeira vez nos últimos 7 dias:

graph.metadata.source_type = "DERIVED_CONTEXT"
graph.metadata.entity_type = "DOMAIN_NAME"
//optional, filter to only return FQDN
graph.entity.domain.name = /^([a-zA-Z0–9]([a-zA-Z0–9-]{0,61}[a-zA-Z0–9])?\.)+[a-zA-Z]{2,}$/
graph.entity.domain.first_seen_time.hours >= timestamp.current_hours()-(86400 * 7)

Arquivo (hashes) observado nos últimos 7 dias:

graph.metadata.source_type = "DERIVED_CONTEXT"
graph.metadata.entity_type = "FILE"
//graph.entity.file.md5 != ""
//graph.entity.file.sha1 != ""
graph.entity.file.sha256 != ""
graph.entity.file.first_seen_time.hours >= timestamp.current_hours() - (86400 * 7)

O ENTITY_TYPE representa um hash FILE, por exemplo, entity.file.hash. No objeto hash, o tipo pode ser um dos seguintes:

  • md5
  • sha1
  • sha256

Para pesquisar um hash específico, execute uma pesquisa de entidade da UDM para o tipo de hash em questão:

// This will search ENTITY, DERIVED, and GLOBAL Source Types
graph.metadata.entity_type = "FILE"
graph.entity.file.sha256 = "eb5db1feadda5351c3b8fc0770e9f4c173484df5dc4a785bd1bdce7806a9e498"

Endereços IP

O ENTITY_TYPES derivado de IP_ADDRESS pode representar entidades internas ou externas.

A pesquisa de estatísticas de entidade da UDM a seguir identifica IP_ADDRESSES observados recentemente e usa funções de agregação (na seção de resultados) para contá-los por bloco CIDR:

graph.metadata.source_type = "DERIVED_CONTEXT"
graph.metadata.entity_type = "IP_ADDRESS"
//note, for IP addresses the first seen is under artifact, not ip
graph.entity.artifact.first_seen_time.hours >= timestamp.current_hours()-(86400 * 7)
outcome:
  $total = count(graph.metadata.product_entity_id)
  $classA = sum(if(net.ip_in_range_cidr(graph.entity.ip, "10.0.0.0/8"),1,0))
  $classB = sum(if(net.ip_in_range_cidr(graph.entity.ip, "172.16.0.0/12"),1,0))
  $classC = sum(if(net.ip_in_range_cidr(graph.entity.ip, "192.168.0.0/16"),1,0))
  $classD = sum(if(net.ip_in_range_cidr(graph.entity.ip, "224.0.0.0/4"),1,0))
  // we shouldn't see results here…
  $classE = sum(if(net.ip_in_range_cidr(graph.entity.ip, "240.0.0.0/4"),1,0))
  $thisNetwork = sum(if(net.ip_in_range_cidr(graph.entity.ip, "0.0.0.0/8"),1,0))
  $loopback = sum(if(net.ip_in_range_cidr(graph.entity.ip, "127.0.0.0/8"),1,0))
  $linklocal = sum(if(net.ip_in_range_cidr(graph.entity.ip, "169.254.0.0/16"),1,0))
  $benchmark = sum(if(net.ip_in_range_cidr(graph.entity.ip, "198.18.0.0/15"),1,0))
  $cgnat = sum(if(net.ip_in_range_cidr(graph.entity.ip, "10.64.0.0/10"),1,0))

Para investigar mais um intervalo incomum ou inesperado, faça uma pesquisa de entidade da UDM:

graph.metadata.source_type = "DERIVED_CONTEXT"
graph.metadata.entity_type = "IP_ADDRESS"
net.ip_in_range_cidr(graph.entity.ip, "198.18.0.0/15")

Prevalência

A prevalência é sempre do tipo DERIVED_CONTEXT.

A pesquisa de entidade da UDM a seguir identifica nomes de domínio que são raramente observados. Esses domínios estão associados a no máximo um recurso distinto por dia, durante o período da consulta (day_max = 1), e no máximo um recurso distinto nos últimos 10 dias (rolling_max = 1).

Esse padrão é útil para detectar domínios com interação limitada no seu ambiente:

graph.metadata.source_type = "DERIVED_CONTEXT"
graph.metadata.entity_type = "DOMAIN_NAME"
//optional, filter to only return specific TLDs where the FQDN is more than X characters
//graph.entity.domain.name = /^.{40,}\.(?:sx|cc|st|ac|lc|wd|vg|tv|cm|gd)$/
graph.entity.domain.prevalence.rolling_max = 1
graph.entity.domain.prevalence.day_max = 1

Ou transforme isso em uma pesquisa agregada de estatísticas de entidades da UDM e agregue os resultados:

graph.metadata.source_type = "DERIVED_CONTEXT"
graph.metadata.entity_type = "DOMAIN_NAME"
//optional, filter to only return FQDN
graph.entity.domain.name = /^.{40,}\.(?:sx|cc|st|ac|lc|wd|vg|tv|cm|gd)$/
$domain = graph.entity.domain.name
$length = strings.length(graph.entity.domain.name)
$tld = strings.extract_domain(graph.entity.domain.name)
graph.entity.domain.prevalence.day_max = 1
graph.entity.domain.prevalence.rolling_max = 1
match:
  $domain, $tld, $length
limit:
  10

Pesquisas básicas de campos de entidades do UDM

Confira mais exemplos de como usar o recurso Contexto da entidade na Pesquisa no Google SecOps, com base nas fontes disponíveis:

  • graph.entity.hostname
  • graph.entity.ip = "8.8.8.8" and graph.metadata.entity_type = "ASSET"
  • principal.ip
  • principal.hostname="baz"
  • principal.ip="1.2.3.4"
  • network.dns.questions.name="youtube.com"

Como criar uma tabela dinâmica com base em campos de entidade

Use campos de entidade para fazer rotações e analisar dados relacionados. Exemplos de campos de rotação:

  • network.email.to
  • network.email.cc
  • principal.process.file.fileMetadata.pe.importHash
  • principal.process.file.sha256
  • network.dns.questions.name

Entender os campos dinâmicos

As fontes referenciam campos estruturados dinâmicos com prefixos, como additional. É possível pesquisar esses campos nos eventos UDM.

Considerações sobre o controle de acesso

Um limite de 50 eventos é imposto aos dados de contexto global e remove referências a controles de acesso. O contexto global, como o VirusTotal, exige as permissões corretas de RBAC de dados. Se você não encontrar dados de contexto global nos resultados da pesquisa, verifique se tem as permissões necessárias de RBAC de dados para acessar esses dados.

As seguintes fontes oferecem suporte ao contexto global:

  • Navegação segura
  • Relacionamentos do VirusTotal
  • WHOIS
  • Uppercase
  • IOC de inteligência de código aberto (OPEN_SOURCE_INTEL_IOC)
  • IoC de violação ativa da Mandiant (MANDIANT_ACTIVE_BREACH_IOC)
  • IoC do Mandiant Fusion (MANDIANT_FUSION_IOC)

Limitações

  • Limites de volume: limite de 1 milhão em resultados cumulativos para dados temporais e atemporais.
  • Dados de contexto global: há um limite de 50 linhas para dados sensíveis de contexto global, como UPPERCASE_VT_PROTECTED, MANDIANT_ACTIVE_BREACH_IOC, MANDIANT_FUSION_IOC e VIRUS_TOTAL_CONNECTIONS, exibidos para usuários com escopo de acesso a dados globais.
  • Consistência de dados: os dados de "Última vez visto" podem ter um atraso de até duas horas. As entidades relacionadas podem mostrar apenas um subconjunto das entidades listadas em um evento.
  • Recursos não compatíveis:

    • Pesquisas inversas em campos de entidade, pesquisas de campos agrupados, baixa prevalência e mapa de calor.
    • Não é possível fazer junção entre o contexto de entidade e as consultas de evento.

Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.