Como fazer

Coleta e análise de dados do Zeek com o Elastic Security

Neste blog, mostrarei o processo de configuração do Filebeat e do Zeek (anteriormente conhecido como Bro), o que permitirá que você realize analítica de dados do Zeek usando o Elastic Security. A configuração padrão do Filebeat e de seus módulos funciona para muitos ambientes; no entanto, você pode precisar personalizar configurações específicas para o seu ambiente. As etapas detalhadas neste blog devem facilitar a compreensão dos passos necessários para personalizar sua configuração com o objetivo de conseguir visualizar os dados do Zeek no Elastic Security.

OsBeats são agentes lightweight excelentes para coletar e enviar dados da borda da sua rede, ou próximo a ela, para um cluster do Elasticsearch. Os Beats enviam dados em conformidade com o Elastic Common Schema (ECS). O Filebeat, um membro da família Beat, vem com módulos internos que simplificam a coleta, a análise e a visualização de formatos de log comuns. Os módulos alcançam isso combinando caminhos padrão automáticos com base no seu sistema operacional. Usaremos o Filebeat para analisar dados do Zeek.

Também abordarei detalhes específicos sobre o processo de enriquecimento GeoIP para exibir os eventos no mapear do Elastic Security. Além disso, detalharei como configurar o Zeek para a saída de dados no formato JSON, o que é exigido pelo Filebeat. Este blog cobre apenas a configuração. Presumo que você já tenha um cluster do Elasticsearch configurado com o Filebeat e o Zeek instalados.

Detalhes do ambiente

Meu cluster Elastic foi criado usando o Elasticsearch Service, que é hospedado no Elastic Cloud. Você pode facilmente preparar um cluster com uma avaliação gratuita de 14 dias, sem necessidade de cartão de crédito. Vale a pena experimentar, pois torna o início com o Elastic Stack rápido e fácil.

Estou usando o Zeek 3.0.0. Você pode encontrar o Zeek para download no website do Zeek.

Visão geral do Filebeat

O Filebeat envia dezenas de integrações prontas para uso, o que torna realidade ir dos dados ao dashboard em minutos. Você pode encontrar facilmente o que precisa em nossa lista completa de integrações. Os módulos não apenas entendem como analisar os dados de origem, mas também configurarão um pipeline de ingestão para transformar os dados no formato ECS. 

A Elastic está trabalhando para melhorar a experiência de integração de dados e ingestão de dados com o Elastic Agent e o Ingest Manager. No entanto, essa é atualmente uma versão experimental, por isso vamos nos concentrar no uso dos módulos do Filebeat prontos para produção. Além disso, muitos dos módulos fornecerão um ou mais dashboards do Kibana prontos para uso.

Figura 1: dashboard do Filebeat Zeek

Habilitar o módulo do Zeek no Filebeat

A primeira coisa que precisamos fazer é habilitar o módulo do Zeek no Filebeat. Todos os módulos fornecidos pelo Filebeat são desabilitados por padrão.

Passo 1: Habilitar o módulo Zeek no Filebeat

Habilitar o módulo Zeek no Filebeat é tão simples quanto executar o seguinte comando:

sudo módulos do Filebeat enable Zeek

Este comando habilitará o Zeek por meio do arquivo de configuração zeek.yml no diretório modules.d do Filebeat. O Filebeat deve estar acessível a partir do seu caminho. Se não estiver, o local padrão do Filebeat é /usr/bin/filebeat, caso você tenha instalado o Filebeat usando o repositório do Elastic no GitHub.

Passo 2: Adicionar o caminho do log do Zeek ao zeek.yml

Os caminhos dos logs do Zeek são configurados no módulo do Filebeat para Zeek, não no próprio Filebeat. Você precisa editar o arquivo de configuração do módulo do Filebeat para Zeek, zeek.yml. Na minha instalação do Filebeat, ele está localizado em /etc/filebeat/modules.d/zeek.yml. Você deve adicionar entradas para cada um dos logs do Zeek que lhe interessam. O diretório base onde minha instalação do Zeek grava logs é /usr/local/zeek/logs/current

Aqui está a lista completa de caminhos de log do Zeek. Você precisará editar esses caminhos para que sejam adequados ao seu ambiente.

# Módulo: zeek
# Documentos: /guide/en/beats/filebeat/7.6/filebeat-module-zeek.html

- module: zeek
    capture_loss:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/capture_loss.log"]
    conexão:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/conn.log"]
    dce_rpc:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/dce_rpc.log"]
    dhcp:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/dhcp.log"]
    dnp3:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/dnp3.log"]
    DNS:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/dns.log"]
    dpd:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/dpd.log"]
    arquivos:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/files.log"]
    ftp:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/ftp.log"]
    http:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/http.log"]
    inteligência:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/intel.log"]
    irc:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/irc.log"]
    kerberos:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/kerberos.log"]
    modbus:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/modbus.log"]
    MySQL:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/mysql.log"]
    aviso:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/notice.log"]
    ntlm:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/ntlm.log"]
    ocsp:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/ocsp.log"]
    pe:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/pe.log"]
    raio:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/radius.log"]
    rdp:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/rdp.log"]
    rfb:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/rfb.log"]
    #  assinaturas:
    #    enabled: true
    #    var.paths: ["/usr/local/zeek/logs/current/signatures.log"]
    sip:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/sip.log"]
    smb_cmd:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/smb_cmd.log"]
    arquivos_smb:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/smb_files.log"]
    smb_mapping:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/smb_mapping.log"]
    smtp:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/smtp.log"]
    snmp:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/snmp.log"]
    socks:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/socks.log"]
    ssh:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/ssh.log"]
    ssl:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/ssl.log"]
    estatísticas:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/stats.log"]
    syslog:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/syslog.log"]
    traceroute:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/traceroute.log"]
    tunelamento:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/tunnel.log"]
    weird:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/weird.log"]
    x509:
        enabled: true
        var.paths: ["/usr/local/zeek/logs/current/x509.log"]

Nota: O log de assinatura está comentado porque o parser do Filebeat não inclui (até a data de publicação) suporte para o log de assinatura no momento deste blog.

Etapa 3: Reiniciar o Filebeat

Depois de terminar de editar e salvar seu arquivo de configuração zeek.yml, você deve reiniciar o Filebeat. Embora sua versão do Linux possa exigir uma pequena variação, isso geralmente é feito via:

sudo systemctl restart filebeat

Neste ponto, você normalmente esperaria ver os dados do Zeek visíveis no Elastic Security e nos índices do Filebeat. Não se surpreenda quando não vir seus dados do Zeek no Discover ou em qualquer dashboard. Há mais algumas etapas que você precisa seguir.

Configure o Zeek para saída JSON

Por padrão, o Zeek não gera logs no formato JSON. É isso que faz com que os dados do Zeek não apareçam nos índices do Filebeat. O módulo do Filebeat para Zeek assume que os logs do Zeek estão em JSON. Você provavelmente verá erros de análise de log se tentar analisar os logs padrão do Zeek.

  1. Você precisa editar o arquivo de configuração local.zeek para configurar a saída de logging JSON. O local deste arquivo de configuração dependerá da sua instalação do Zeek. Minha instalação do Zeek está localizada em /usr/local/zeek. Meu arquivo de configuração está localizado em /usr/local/zeek/share/zeek/site/local.zeek.
  2. Adicione a seguinte linha ao final do arquivo de configuração:
    @load policy/tuning/JSON-log.Zeek
  3. Depois de terminar de editar o arquivo de configuração local.zeek, você precisará reiniciar o Zeek usando:
    sudo zeekctl implantar
    Isso reiniciará o Zeek usando as configurações atualizadas do arquivo de configuração.
  4. Depois de fazer essa edição, você deve reiniciar o Filebeat. Nesse ponto, você deverá ver os dados do Zeek visíveis nos seus índices do Filebeat.

Esta é uma visualização do Discover mostrando os valores dos campos geográficos preenchidos com dados:


Figura 2: Kibana Discover

Enriquecimento de GeoIP

Assim que os dados do Zeek estavam nos índices do Filebeat, fiquei surpreso por não ver nenhuma das linhas “pew pew” na aba Network no Elastic Security. Criei o pipeline de ingestão geoip-info conforme documentado na documentação da UI de configuração de mapear do SIEM. Também verifiquei se eu estava referenciando esse pipeline na seção de saída da configuração do Filebeat, conforme documentado.

Aqui está um exemplo de definição do pipeline no arquivo de configuração filebeat.yml:

saída.elasticsearch:
  # Matriz de hosts para conexão.
  hosts: ["localhost:9200"]
  pipeline: geoip-info

Os Node nos quais estou executando o Zeek estão usando endereços IP não roteáveis, então precisei usar o processador add_field do Filebeat para mapear as informações geográficas com base no endereço IP. Embora essas informações estejam documentadas no link acima, houve um problema com os nomes dos campos.

O pipeline GeoIP pressupõe que as informações de IP estarão em source.ip e destination.ip. Isso é verdade para a maioria das fontes. No entanto, com o Zeek, essas informações estão contidas em source.address e destination.address. Por que isso acontece? Na verdade, tudo se resume ao fluxo de dados e ao momento em que o pipeline de ingestão é iniciado.

O módulo Zeek para Filebeat cria um pipeline de ingestão para converter dados para o ECS. Esse pipeline copia os valores de source.address para source.ip e de destination.address para destination.ip. No entanto, o processador add_fields que adiciona campos no Filebeat ocorre antes que o pipeline de ingestão processe os dados. Portanto, os valores de source.ip e destination.ip ainda não estão preenchidos quando o processador add_field está ativo.

Modifiquei minha configuração do Filebeat para usar o processador add_field e usar address em vez de ip. É assim que fica:

processors:
    - add_host_metadata:
    - add_cloud_metadata:
    - add_fields:
        when.network.source.address: 10.128.0.0/24
        campo:
            source.geo.location:
            lat: 41,619549
            lon: -93,598022
            source.geo.continent_name: América do Norte
            source.geo.country_iso_code: EUA
            source.geo.region_iso_code: US-IA
            source.geo.region_name: Iowa
        destino: ''
    - add_fields:
        when.network.destination.address: 10.128.0.0/24
        campo:
            destination.geo.location:
            lat: 41,619549
            lon: -93,598022
            destination.geo.continent_name: North America
            destination.geo.country_iso_code: EUA

Você deve observar que estou usando o campo address na linha when.network.source.address em vez de when.network.source.ip, conforme indicado na documentação. Isso também se aplica à linha destination. Isso aborda o tempo do fluxo de dados que mencionei anteriormente. Nesta etapa do fluxo de dados, as informações de que preciso estão no campo source.address.

Verifique os dados do Zeek no Elastic Security

Depois de concluir todas as alterações no seu arquivo de configuração filebeat.yml, você precisará reiniciar o Filebeat usando:

sudo systemctl restart filebeat

Agora, abra o Elastic Security e navegue até a aba Network (Rede). O mapa deve exibir corretamente as linhas “pew pew” que esperávamos ver.

Figura 3: Exemplo de mapa de rede no Elastic Security

Além do mapa de rede, você também deve ver os dados do Zeek na aba de visão geral do Elastic Security. Neste exemplo, você pode ver que o Filebeat coletou mais de 500.000 eventos do Zeek nas últimas 24 horas.

Figura 4: página de visão geral com detalhes do resumo do Zeek

Você também pode ver os eventos do Zeek aparecerem como alertas externos dentro do Elastic Security.

Figura 5: Alertas externos do Zeek

O número de etapas necessárias para concluir esta configuração foi relativamente pequeno. Geralmente, deve levar apenas alguns minutos para concluir esta configuração, reafirmando como é fácil ir dos dados ao dashboard em minutos!

Qual é o próximo passo?

Então, quais são os próximos passos? Pense em outros feeds de dados que você talvez queira incorporar, como o Suricata e fluxos de dados de host. Eu encorajo você a conferir nosso post do blog Getting started with adding a new segurança dados source in Elastic SIEM, que orienta você sobre como adicionar novas fontes de dados de segurança para uso no Elastic Security.

Pronto para uma proteção de dados holística com o Elastic Security? Experimente gratuitamente hoje no Serviço Elasticsearch no Elastic Cloud.

.