Coletar registros do Fortinet FortiWeb
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
- Faça login no console do Google SecOps.
- Acesse Configurações do SIEM > Agentes de coleta.
- 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
- Faça login no console do Google SecOps.
- Acesse Configurações do SIEM > Perfil.
- 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
- Abra o prompt de comando ou o PowerShell como administrador.
Execute este comando:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quietAguarde a conclusão da instalação.
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
- Abra um terminal com privilégios de root ou sudo.
Execute este comando:
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.shAguarde a conclusão da instalação.
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.yamlWindows:
notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
Editar o arquivo de configuração
Substitua todo o conteúdo de
config.yamlpela 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: useudplogpara syslog UDP outcplogpara syslog TCP.0.0.0.0: endereço IP para escutar (0.0.0.0para 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
- Linux:
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.
- EUA:
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,EntereCtrl+X. - Windows: clique em Arquivo > Salvar.
- Linux: pressione
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-collectorVerifique se o serviço está em execução:
sudo systemctl status observiq-otel-collectorVerifique 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-collectorConsole de serviços:
- Pressione
Win+R, digiteservices.msce pressione Enter. - Localize o Coletor do OpenTelemetry da observIQ.
Clique com o botão direito do mouse e selecione Reiniciar.
Verifique se o serviço está em execução:
sc query observiq-otel-collectorVerifique se há erros nos registros:
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
- Pressione
Configurar o encaminhamento de syslog do Fortinet FortiWeb
- Faça login na interface da Web do FortiWeb.
- Acesse Registro e relatório > Configuração de registro > Outras configurações de registro.
- Em Política do Syslog, clique em Criar nova para adicionar uma política do Syslog.
- 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).
- Nome da política: insira um nome descritivo (por exemplo,
- Na seção Tipo de registro, ative o seguinte:
- Registro de ataque
- Registro de eventos
- Registro de tráfego
- Clique em OK para salvar.
- 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.