Coletar registros do Fortinet FortiWeb

Compatível com:

Este documento explica como ingerir registros do Fortinet FortiWeb no Google Security Operations usando o Bindplane.

O analisador extrai campos de registros formatados em KV do FortiWeb da Fortinet. Ele usa grok e/ou kv para analisar a mensagem de registro e mapeia esses valores para o modelo de dados unificado (UDM). Ele também define valores de metadados padrão para a origem e o tipo do evento.

Antes de começar

Verifique se você tem os pré-requisitos a seguir:

  • Uma instância do Google SecOps
  • Windows Server 2016 ou mais recente ou host Linux com systemd
  • Se você estiver executando por trás de um proxy, verifique se as portas do firewall estão abertas de acordo com os requisitos do agente Bindplane.
  • Acesso privilegiado à interface da Web do Fortinet FortiWeb

Receber o arquivo de autenticação de ingestão do Google SecOps

  1. Faça login no console do Google SecOps.
  2. Acesse Configurações do SIEM > Agentes de coleta.
  3. Baixe o arquivo de autenticação de ingestão. Salve o arquivo de forma segura no sistema em que o Bindplane será instalado.

Receber o ID de cliente do Google SecOps

  1. Faça login no console do Google SecOps.
  2. Acesse Configurações do SIEM > Perfil.
  3. Copie e salve o ID do cliente na seção Detalhes da organização.

Instalar o agente do Bindplane

Instale o agente do Bindplane no sistema operacional Windows ou Linux de acordo com as instruções a seguir.

Instalação do Windows

  1. Abra o prompt de comando ou o PowerShell como administrador.
  2. Execute este comando:

    msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
    
  3. Aguarde a conclusão da instalação.

  4. Execute o seguinte comando para confirmar a instalação:

    sc query observiq-otel-collector
    

O serviço vai aparecer como EM EXECUÇÃO.

Instalação do Linux

  1. Abra um terminal com privilégios de root ou sudo.
  2. Execute este comando:

    sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
    
  3. Aguarde a conclusão da instalação.

  4. Execute o seguinte comando para confirmar a instalação:

    sudo systemctl status observiq-otel-collector
    

O serviço vai aparecer como ativo (em execução).

Outros recursos de instalação

Para mais opções de instalação e solução de problemas, consulte o guia de instalação do agente do Bindplane.

Configurar o agente do Bindplane para ingerir syslog e enviar ao Google SecOps

Localizar o arquivo de configuração

  • Linux:

    sudo nano /etc/bindplane-agent/config.yaml
    
  • Windows:

    notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
    

Editar o arquivo de configuração

  • Substitua todo o conteúdo de config.yaml pela seguinte configuração:

    receivers:
        udplog:
            listen_address: "0.0.0.0:514"
    
    exporters:
        chronicle/chronicle_w_labels:
            compression: gzip
            creds_file_path: '/path/to/ingestion-authentication-file.json'
            customer_id: 'YOUR_CUSTOMER_ID'
            endpoint: malachiteingestion-pa.googleapis.com
            log_type: 'FORTINET_FORTIWEB'
            raw_log_field: body
            ingestion_labels:
    
    service:
        pipelines:
            logs/source0__chronicle_w_labels-0:
                receivers:
                    - udplog
                exporters:
                    - chronicle/chronicle_w_labels
    

Parâmetros de configuração

  • Substitua os seguintes marcadores de posição:

    • Configuração do receptor:

      • udplog: use udplog para syslog UDP ou tcplog para syslog TCP.
      • 0.0.0.0: endereço IP para escutar (0.0.0.0 para escutar em todas as interfaces)
      • 514: número da porta a ser detectada (porta syslog padrão).
    • Configuração do exportador:

      • creds_file_path: caminho completo para o arquivo de autenticação de ingestão:
        • Linux: /etc/bindplane-agent/ingestion-auth.json
        • Windows: C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json
      • YOUR_CUSTOMER_ID: ID do cliente da seção "Receber ID do cliente"
      • endpoint: URL do endpoint regional:
        • EUA: malachiteingestion-pa.googleapis.com
        • Europa: europe-malachiteingestion-pa.googleapis.com
        • Ásia: asia-southeast1-malachiteingestion-pa.googleapis.com
        • Consulte a lista completa em Endpoints regionais.
      • log_type: tipo de registro exatamente como aparece no Chronicle (FORTINET_FORTIWEB)

Salve o arquivo de configuração.

  • Depois de editar, salve o arquivo:
    • Linux: pressione Ctrl+O, Enter e Ctrl+X.
    • Windows: clique em Arquivo > Salvar.

Reinicie o agente do Bindplane para aplicar as mudanças

  • Para reiniciar o agente do Bindplane no Linux, execute o seguinte comando:

    sudo systemctl restart observiq-otel-collector
    
    1. Verifique se o serviço está em execução:

        sudo systemctl status observiq-otel-collector
      
    2. Verifique se há erros nos registros:

        sudo journalctl -u observiq-otel-collector -f
      
  • Para reiniciar o agente do Bindplane em Windows, escolha uma das seguintes opções:

    • Prompt de comando ou PowerShell como administrador:

      net stop observiq-otel-collector && net start observiq-otel-collector
      
    • Console de serviços:

      1. Pressione Win+R, digite services.msc e pressione Enter.
      2. Localize o Coletor do OpenTelemetry da observIQ.
      3. Clique com o botão direito do mouse e selecione Reiniciar.

      4. Verifique se o serviço está em execução:

        sc query observiq-otel-collector
        
      5. Verifique se há erros nos registros:

        type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
        

Configurar o encaminhamento de syslog do Fortinet FortiWeb

  1. Faça login na interface da Web do FortiWeb.
  2. Acesse Registro e relatório > Configuração de registro > Outras configurações de registro.
  3. Em Política do Syslog, clique em Criar nova para adicionar uma política do Syslog.
  4. Informe os seguintes detalhes de configuração:
    • Nome da política: insira um nome descritivo (por exemplo, Google-SecOps-Bindplane).
    • Endereço IP: insira o endereço IP do host do agente do Bindplane.
    • Porta: insira 514.
    • Ativar: selecione Ativar.
    • Instalação: selecione local0 (ou sua instalação preferida).
    • Nível de registro: selecione informações (ou o nível de sua preferência).
  5. Na seção Tipo de registro, ative o seguinte:
    • Registro de ataque
    • Registro de eventos
    • Registro de tráfego
  6. Clique em OK para salvar.
  7. Verifique se as mensagens syslog estão sendo enviadas conferindo os registros do agente Bindplane.

Tabela de mapeamento do UDM

Campo de registro Mapeamento do UDM Lógica
ação additional.fields[].value.string_value O valor é mapeado diretamente.
ação security_result.action_details Se a ação for "Permitir" ou "Aceitar", security_result.action_details será definido como "ALLOW". Se a ação for "Denied", "deny", "block" ou "Block", security_result.action_details será definido como "BLOCK".
app network.application_protocol O valor é mapeado diretamente depois de ser convertido para maiúsculas. Somente se o valor for HTTPS, HTTP, DNS, DHCP ou SMB.
app_name additional.fields[].key A chave é definida como "appName".
app_name additional.fields[].value.string_value O valor é mapeado diretamente.
backend_service additional.fields[].key A chave é definida como "backend_service".
backend_service additional.fields[].value.string_value O valor é mapeado diretamente.
gato security_result.category_details O valor é mapeado diretamente.
client_level security_result.category Se client_level for "Malicious", security_result.category será definido como "NETWORK_MALICIOUS".
cn1 additional.fields[].value.string_value Associado ao campo "threatWeight".
cn1Label additional.fields[].key A chave é definida como o valor cn1Label.
cn2 additional.fields[].value.string_value Mapeado para o campo de comprimento.
cn2Label additional.fields[].key A chave é definida como o valor cn2Label.
cn3 additional.fields[].value.string_value Mapeado para o campo "signatureID".
cn3Label additional.fields[].key A chave é definida como o valor cn3Label.
cs1 additional.fields[].value.string_value O valor é mapeado diretamente.
cs1Label additional.fields[].key A chave é definida como o valor cs1Label.
cs1 principal.user.product_object_id O valor é mapeado diretamente quando cs1Label corresponde a "userID" (sem distinção entre maiúsculas e minúsculas).
cs2 additional.fields[].value.string_value O valor é mapeado diretamente.
cs2Label additional.fields[].key A chave é definida como o valor cs2Label.
cs2 principal.user.userid O valor é mapeado diretamente quando cs2Label corresponde a "userName" (sem distinção entre maiúsculas e minúsculas) e suid está vazio.
cs3 additional.fields[].value.string_value O valor é mapeado diretamente.
cs3Label additional.fields[].key A chave é definida como o valor de cs3Label.
cs3 metadata.severity O valor é mapeado diretamente quando cs3Label é "level" e cs3 não está vazio.
cs4 additional.fields[].value.string_value Associado ao campo "subType".
cs4Label additional.fields[].key A chave é definida como o valor cs4Label.
cs5 additional.fields[].value.string_value Mapeado para o campo "threatLevel".
cs5Label additional.fields[].key A chave é definida como o valor "cs5Label".
cs6 additional.fields[].value.string_value Mapeado para o campo "owaspTop10".
cs6Label additional.fields[].key A chave é definida como o valor cs6Label.
data metadata.event_timestamp.seconds Combinado com a hora e analisado para gerar segundos de época.
dev_id principal.resource.id O valor é mapeado diretamente.
devname principal.resource.name O valor é mapeado diretamente.
device_event_class_id metadata.product_event_type Usado na análise do CEF.
device_product metadata.product_name Usado na análise do CEF.
device_vendor metadata.vendor_name Usado na análise do CEF.
device_version metadata.product_version Usado na análise do CEF.
dhost target.hostname O valor é mapeado diretamente.
dpt target.port O valor é mapeado diretamente e convertido em número inteiro.
dst target.ip O valor é mapeado diretamente.
dst_port target.port O valor é mapeado diretamente e convertido em número inteiro.
dstepid target.process.pid O valor é mapeado diretamente.
dsteuid target.user.userid O valor é mapeado diretamente.
event_name metadata.product_event_type Usado na análise do CEF.
http_agent network.http.parsed_user_agent O valor é analisado como uma string de user agent.
http_method network.http.method O valor é mapeado diretamente.
http_refer network.http.referral_url O valor é mapeado diretamente.
http_session_id network.session_id O valor é mapeado diretamente.
http_url target.url O valor é mapeado diretamente.
http_version metadata.product_version O valor é mapeado diretamente.
comprimento additional.fields[].key A chave está definida como "length".
comprimento additional.fields[].value.string_value O valor é mapeado diretamente.
log_type metadata.log_type Fixado no código como "FORTINET_FORTIWEB".
main_type additional.fields[].key A chave é definida como "mainType".
main_type additional.fields[].value.string_value O valor é mapeado diretamente.
mensagem Vários campos Analisado usando filtros grok e kv para extrair campos diferentes.
ml_allow_method additional.fields[].key A chave é definida como "ml_allow_method".
ml_allow_method additional.fields[].value.string_value O valor é mapeado diretamente.
ml_arg_dbid additional.fields[].key A chave é definida como "ml_arg_dbid".
ml_arg_dbid additional.fields[].value.string_value O valor é mapeado diretamente.
ml_domain_index additional.fields[].key A chave é definida como "ml_domain_index".
ml_domain_index additional.fields[].value.string_value O valor é mapeado diretamente.
ml_log_arglen additional.fields[].key A chave é definida como "ml_log_arglen".
ml_log_arglen additional.fields[].value.string_value O valor é mapeado diretamente.
ml_log_hmm_probability additional.fields[].key A chave é definida como "ml_log_hmm_probability".
ml_log_hmm_probability additional.fields[].value.string_value O valor é mapeado diretamente.
ml_log_sample_arglen_mean additional.fields[].key A chave é definida como "ml_log_sample_arglen_mean".
ml_log_sample_arglen_mean additional.fields[].value.string_value O valor é mapeado diretamente.
ml_log_sample_prob_mean additional.fields[].key A chave é definida como "ml_log_sample_prob_mean".
ml_log_sample_prob_mean additional.fields[].value.string_value O valor é mapeado diretamente.
ml_svm_accuracy additional.fields[].key A chave é definida como "ml_svm_accuracy".
ml_svm_accuracy additional.fields[].value.string_value O valor é mapeado diretamente.
ml_svm_log_main_types additional.fields[].key A chave é definida como "ml_svm_log_main_types".
ml_svm_log_main_types additional.fields[].value.string_value O valor é mapeado diretamente.
ml_svm_log_match_types additional.fields[].key A chave é definida como "ml_svm_log_match_types".
ml_svm_log_match_types additional.fields[].value.string_value O valor é mapeado diretamente.
ml_url_dbid additional.fields[].key A chave é definida como "ml_url_dbid".
ml_url_dbid additional.fields[].value.string_value O valor é mapeado diretamente.
monitor_status additional.fields[].key A chave é definida como "monitor_status".
monitor_status additional.fields[].value.string_value O valor é mapeado diretamente.
msg metadata.description O valor é mapeado diretamente.
owasp_top10 additional.fields[].key A chave é definida como "owaspTop10".
owasp_top10 additional.fields[].value.string_value O valor é mapeado diretamente.
principal_app principal.application O valor é mapeado diretamente.
principal_host principal.hostname O valor é mapeado diretamente.
proto network.ip_protocol O valor é mapeado diretamente depois de ser convertido para maiúsculas.
solicitação target.url O valor é mapeado diretamente.
requestMethod network.http.method O valor é mapeado diretamente.
rt metadata.event_timestamp.seconds Analisado como milissegundos desde a época e convertido em segundos.
security_result.severity security_result.severity Derivado de "severity_level". Mapeado para diferentes valores de gravidade da UDM com base no valor do registro bruto. O padrão é UNKNOWN_SEVERITY se nenhuma correspondência for encontrada.
server_pool_name additional.fields[].key A chave é definida como "server_pool_name".
server_pool_name additional.fields[].value.string_value O valor é mapeado diretamente.
serviço network.application_protocol O valor é mapeado diretamente depois de ser convertido para maiúsculas.
serviço target.application O valor é mapeado diretamente após ser convertido para maiúsculas, se não for HTTPS, HTTP, DNS, DHCP ou SMB.
gravidade, security_result.severity Se a gravidade estiver vazia e cs3Label for "level", o valor de cs3 será usado. Em seguida, mapeado para um valor de gravidade da UDM (LOW, HIGH etc.).
signature_id security_result.rule_id O valor é mapeado diretamente.
signature_subclass security_result.detection_fields[].key A chave é definida como "signature_subclass".
signature_subclass security_result.detection_fields[].value O valor é mapeado diretamente.
src principal.ip O valor é mapeado diretamente.
src_country principal.location.country_or_region O valor é mapeado diretamente.
src_ip principal.ip O valor é mapeado diretamente.
src_port principal.port O valor é mapeado diretamente e convertido em número inteiro.
srccountry principal.location.country_or_region O valor é mapeado diretamente.
sub_type additional.fields[].key A chave é definida como "subType".
sub_type additional.fields[].value.string_value O valor é mapeado diretamente.
subtype target.resource.resource_subtype O valor é mapeado diretamente.
suid principal.user.userid O valor é mapeado diretamente.
threat_level additional.fields[].key A chave é definida como "threatLevel".
threat_level additional.fields[].value.string_value O valor é mapeado diretamente.
threat_weight security_result.detection_fields[].key A chave é definida como "threat_weight".
threat_weight security_result.detection_fields[].value O valor é mapeado diretamente.
tempo metadata.event_timestamp.seconds Combinado com a data e analisado para gerar segundos de época.
user_id principal.user.product_object_id O valor é mapeado diretamente.
user_name additional.fields[].key A chave é definida como "userName".
user_name additional.fields[].value.string_value O valor é mapeado diretamente.
user_name principal.user.userid O valor é mapeado diretamente.
N/A metadata.event_type Definido como "NETWORK_CONNECTION" se principal.ip e target.ip estiverem presentes. Definido como "USER_UNCATEGORIZED" se "principal.ip" e "principal.user" estiverem presentes. Definido como "STATUS_UPDATE" se apenas principal.ip estiver presente. Caso contrário, defina como "GENERIC_EVENT".
N/A metadata.log_type Fixado no código como "FORTINET_FORTIWEB".
N/A metadata.product_name Codificado como "FORTINET FORTIWEB" ou "FortiWEB Cloud" com base no formato do registro.
N/A metadata.vendor_name Codificado como "FORTINET" ou "Fortinet" com base no formato do registro.
N/A principal.resource.resource_type Codificado como "DEVICE" se dev_id estiver presente.

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