Coletar registros do proxy do Forcepoint
Neste documento, explicamos como ingerir registros do proxy do Forcepoint no Google Security Operations usando o Bindplane. Primeiro, o analisador limpa a mensagem de registro de entrada e extrai pares de chave-valor usando padrões grok e expressões regulares. Em seguida, ele mapeia os campos extraídos para o Modelo de dados unificado (UDM, na sigla em inglês) com base em condições e valores de campo específicos, processando vários formatos de registro e casos extremos para garantir uma representação de dados consistente.
Antes de começar
- Verifique se você tem uma instância do Google Security Operations.
- Use o Windows 2016 ou uma versão mais recente ou um host Linux com
systemd. - Se você estiver executando por trás de um proxy, verifique se as portas do firewall estão abertas.
- Verifique se você tem acesso privilegiado ao Forcepoint Proxy.
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 do 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
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" /quiet
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.sh
Outros recursos de instalação
- Para mais opções de instalação, consulte este guia de instalação.
Configurar o agente do Bindplane para ingerir o Syslog e enviar ao Google SecOps
Acesse o arquivo de configuração:
- Localize o arquivo
config.yaml. Normalmente, ele fica no diretório/etc/bindplane-agent/no Linux ou no diretório de instalação no Windows. - Abra o arquivo usando um editor de texto (por exemplo,
nano,viou Bloco de Notas).
- Localize o arquivo
Edite o arquivo
config.yamlda seguinte forma:receivers: udplog: # Replace the port and IP address as required listen_address: "0.0.0.0:514" exporters: chronicle/chronicle_w_labels: compression: gzip # Adjust the path to the credentials file you downloaded in Step 1 creds: '/path/to/ingestion-authentication-file.json' # Replace with your actual customer ID from Step 2 customer_id: <customer_id> endpoint: malachiteingestion-pa.googleapis.com # Add optional ingestion labels for better organization ingestion_labels: log_type: FORCEPOINT_WEBPROXY raw_log_field: body service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - udplog exporters: - chronicle/chronicle_w_labelsSubstitua a porta e o endereço IP conforme necessário na sua infraestrutura.
Substitua
<customer_id>pelo ID do cliente real.Atualize
/path/to/ingestion-authentication-file.jsonpara o caminho em que o arquivo de autenticação foi salvo na seção Receber arquivo de autenticação de ingestão do Google SecOps.
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 bindplane-agentPara reiniciar o agente do Bindplane no Windows, use o console Serviços ou insira o seguinte comando:
net stop BindPlaneAgent && net start BindPlaneAgent
Configurar o Forcepoint Web Security Suite
- Faça login no console do Forcepoint.
- Acesse Web > Configurações > Geral.
- Clique em Integração com SIEM.
- Marque a caixa de seleção Ativar a integração do SIEM para este servidor de políticas.
- Informe os seguintes detalhes de configuração:
- Endereço IP ou nome do host: insira o endereço IP do agente do Bindplane.
- Número da porta: insira o número da porta configurado no agente do Bindplane, por exemplo,
514. - Protocolo de transporte: selecione o protocolo UDP.
- Formato do SIEM: selecione Syslog/CEF (Arcsight).
- Clique em OK.
- Clique em Salvar e implantar.
Tabela de mapeamento do UDM
| Campo de registro | Mapeamento do UDM | Lógica |
|---|---|---|
| ação | security_result.summary | Se action_msg não estiver vazio, ele será mapeado para security_result.summary. Caso contrário, se a ação não estiver vazia, ela será mapeada para security_result.summary. Caso contrário, se "act" não estiver vazio, ele será mapeado para "security_result.summary". |
| action_msg | security_result.summary | Se action_msg não estiver vazio, ele será mapeado para security_result.summary. Caso contrário, se a ação não estiver vazia, ela será mapeada para security_result.summary. Caso contrário, se "act" não estiver vazio, ele será mapeado para "security_result.summary". |
| app | target.application | Se destinationServiceName não estiver vazio, ele será mapeado para app_name. Caso contrário, se o app não estiver vazio e não contiver http ou HTTP, ele será mapeado para app_name. Por fim, app_name é mapeado para target.application. |
| bytes_in | network.received_bytes | Se "in" não estiver vazio, ele será mapeado para "bytes_in". Por fim, bytes_in é mapeado para network.received_bytes. |
| bytes_out | network.sent_bytes | Se "out" não estiver vazio, ele será mapeado para "bytes_out". Por fim, bytes_out é mapeado para network.sent_bytes. |
| gato | security_result.category_details | Se "cat" não estiver vazio, ele será mapeado para "category". Por fim, a categoria é mapeada para security_result.category_details. |
| cn1 | security_result.detection_fields.value | Se cn1 não estiver vazio, ele será mapeado para security_result.detection_fields.value com a chave Disposition Number. |
| ContentType | target.file.mime_type | Se contentType não estiver vazio, ele será mapeado para ContentType. Por fim, "ContentType" é mapeado para "target.file.mime_type". |
| cs1 | target_role.description | cs1 é mapeado para target_role.description. |
| cs2 | security_result.category_details | Se cs2 não estiver vazio e não for 0, ele será mapeado para security_result.category_details com o prefixo Dynamic Category:. |
| cs3 | target.file.mime_type | cs3 é mapeado para target.file.mime_type. |
| description | metadata.description | Se a descrição não estiver vazia, ela será mapeada para "metadata.description". |
| destinationServiceName | target.application | Se destinationServiceName não estiver vazio, ele será mapeado para app_name. Por fim, app_name é mapeado para target.application. |
| deviceFacility | metadata.product_event_type | Se "product_event" e "deviceFacility" não estiverem vazios, eles serão concatenados com - e mapeados para "metadata.product_event_type". Caso contrário, "product_event" será mapeado para "metadata.product_event_type". |
| disposition | security_result.detection_fields.value | Se a disposição não estiver vazia, ela será mapeada para security_result.detection_fields.value com a chave Disposition Number. |
| dst | target.ip | Se dst não estiver vazio e dvchost estiver vazio, ele será mapeado para dst_ip. Por fim, dst_ip é mapeado para target.ip. |
| dst_host | target.hostname | Se dst não estiver vazio e dvchost estiver vazio, ele será mapeado para dst_host. Por fim, dst_host é mapeado para target.hostname. |
| dst_ip | target.ip | Se dst não estiver vazio e dvchost estiver vazio, ele será mapeado para dst_ip. Por fim, dst_ip é mapeado para target.ip. |
| dst_port | target.port | Se dst não estiver vazio e dvchost estiver vazio, ele será mapeado para dst_port. Por fim, dst_port é mapeado para target.port. |
| duration | network.session_duration.seconds | Se a duração não estiver vazia e não for 0, ela será mapeada para network.session_duration.seconds. |
| dvchost | intermediary.ip | Se dvchost não estiver vazio, ele será mapeado para int_ip. Por fim, int_ip é mapeado para intermediary.ip se for um endereço IP válido. Caso contrário, ele é mapeado para intermediary.hostname. |
| file_path | target.file.full_path | Se file_path não estiver vazio, ele será mapeado para target.file.full_path. |
| host | principal.ip | Se o host não estiver vazio, ele será mapeado para src. Por fim, "src" é mapeado para "principal.ip". |
| http_method | network.http.method | Se requestMethod não estiver vazio, ele será mapeado para http_method. Caso contrário, se o método não estiver vazio, ele será mapeado para http_method. Por fim, http_method é mapeado para network.http.method. |
| http_proxy_status_code | network.http.response_code | Se http_response estiver vazio ou for 0 ou -, e http_proxy_status_code não estiver vazio, ele será mapeado para network.http.response_code. |
| http_response | network.http.response_code | Se http_response não estiver vazio, não for 0 nem -, ele será mapeado para network.http.response_code. |
| http_user_agent | network.http.user_agent | Se http_user_agent não estiver vazio e não for -, ele será mapeado para network.http.user_agent. |
| em | network.received_bytes | Se "in" não estiver vazio, ele será mapeado para "bytes_in". Por fim, bytes_in é mapeado para network.received_bytes. |
| int_host | intermediary.hostname | Se int_ip não estiver vazio e int_host não estiver vazio e for diferente de int_ip, ele será mapeado para intermediary.hostname. |
| int_ip | intermediary.ip | Se dvchost não estiver vazio, ele será mapeado para int_ip. Por fim, int_ip é mapeado para intermediary.ip se for um endereço IP válido. Caso contrário, ele é mapeado para intermediary.hostname. |
| level | target_role.name | Se "level" não estiver vazio e "role" estiver, ele será mapeado para "role". Por fim, a função é mapeada para target_role.name. |
| log_level | security_result.severity | Se a gravidade for 1, o log_level contiver info ou a mensagem contiver notice, security_result.severity será definido como INFORMATIONAL. Se a gravidade for 7, security_result.severity será definido como HIGH. |
| loginID | principal.user.userid | Se loginID não estiver vazio, ele será mapeado para o usuário. Por fim, se o usuário não estiver vazio, não for - e não contiver LDAP, ele será mapeado para principal.user.userid. |
| método | network.http.method | Se requestMethod não estiver vazio, ele será mapeado para http_method. Caso contrário, se o método não estiver vazio, ele será mapeado para http_method. Por fim, http_method é mapeado para network.http.method. |
| NatRuleId | security_result.detection_fields.value | Se NatRuleId não estiver vazio, ele será mapeado para security_result.detection_fields.value com a chave NatRuleId. |
| out | network.sent_bytes | Se "out" não estiver vazio, ele será mapeado para "bytes_out". Por fim, bytes_out é mapeado para network.sent_bytes. |
| pid | target.process.pid | Se pid não estiver vazio, ele será mapeado para target.process.pid. |
| política | target_role.description | Se a política não estiver vazia, ela será mapeada para "policy". Se a política não estiver vazia e não for -, ela será mapeada para target_role.description. |
| Política | target_role.description | Se a política não estiver vazia, ela será mapeada para "policy". Se a política não estiver vazia e não for -, ela será mapeada para target_role.description. |
| product_event | metadata.product_event_type | Se o produto não estiver vazio, ele será mapeado para product_event. Se "product_event" e "deviceFacility" não estiverem vazios, eles serão concatenados com - e mapeados para "metadata.product_event_type". Caso contrário, "product_event" será mapeado para "metadata.product_event_type". |
| proxyStatus-code | network.http.response_code | Se http_response estiver vazio ou for 0 ou -, e http_proxy_status_code estiver vazio e proxyStatus-code não estiver, ele será mapeado para network.http.response_code. |
| refererUrl | network.http.referral_url | Se refererUrl não estiver vazio e não for -, ele será mapeado para network.http.referral_url. |
| requestClientApplication | network.http.user_agent | Se requestMethod não estiver vazio, ele será mapeado para http_user_agent. Por fim, http_user_agent é mapeado para network.http.user_agent. |
| requestMethod | network.http.method | Se requestMethod não estiver vazio, ele será mapeado para http_method. Por fim, http_method é mapeado para network.http.method. |
| papel | target_role.name | Se "level" não estiver vazio e "role" estiver, ele será mapeado para "role". Por fim, a função é mapeada para target_role.name. |
| RuleID | security_result.rule_id | Se RuleID não estiver vazio, ele será mapeado para security_result.rule_id. |
| serverStatus-code | network.http.response_code | Se http_response estiver vazio ou for 0 ou -, e http_proxy_status_code estiver vazio e proxyStatus-code não estiver, ele será mapeado para network.http.response_code. |
| gravidade, | security_result.severity | Se a gravidade for 1, o log_level contiver info ou a mensagem contiver notice, security_result.severity será definido como INFORMATIONAL. Se a gravidade for 7, security_result.severity será definido como HIGH. |
| spt | principal.port | Se "spt" não estiver vazio, ele será mapeado para "src_port". Por fim, src_port é mapeado para principal.port. |
| src | principal.ip | Se src_host não estiver vazio, ele será mapeado para source_ip_temp. Se source_ip_temp for um endereço IP válido e src estiver vazio, ele será mapeado para src. Se o host não estiver vazio, ele será mapeado para src. Por fim, "src" é mapeado para "principal.ip". |
| src_host | principal.hostname | Se src_host não estiver vazio, ele será mapeado para source_ip_temp. Se source_ip_temp não for um endereço IP válido, ele será mapeado para principal.hostname. Se source_ip_temp for um endereço IP válido e src estiver vazio, ele será mapeado para src. Por fim, "src" é mapeado para "principal.ip". |
| src_port | principal.port | Se src_port não estiver vazio, ele será mapeado para principal.port. |
| suser | principal.user.userid | Se loginID não estiver vazio, ele será mapeado para o usuário. Se "suser" não estiver vazio, ele será mapeado para "user". Por fim, se o usuário não estiver vazio, não for - e não contiver LDAP, ele será mapeado para principal.user.userid. |
| url | target.url | Se o URL não estiver vazio, ele será mapeado para target.url. |
| usuário | principal.user.userid | Se loginID não estiver vazio, ele será mapeado para o usuário. Se "suser" não estiver vazio, ele será mapeado para "user". Caso contrário, se usrName não estiver vazio, ele será mapeado para user. Por fim, se o usuário não estiver vazio, não for - e não contiver LDAP, ele será mapeado para principal.user.userid. |
| usrName | principal.user.userid | Se loginID não estiver vazio, ele será mapeado para o usuário. Se "suser" não estiver vazio, ele será mapeado para "user". Caso contrário, se usrName não estiver vazio, ele será mapeado para user. Por fim, se o usuário não estiver vazio, não for - e não contiver LDAP, ele será mapeado para principal.user.userid. |
| quando | metadata.event_timestamp | Se "when" não estiver vazio, ele será analisado e mapeado para "metadata.event_timestamp". |
| metadata.log_type | O valor FORCEPOINT_WEBPROXY é codificado em metadata.log_type. |
|
| metadata.product_name | O valor Forcepoint Webproxy é codificado em metadata.product_name. |
|
| metadata.vendor_name | O valor Forcepoint é codificado em metadata.vendor_name. |
|
| network.application_protocol | Se dst_port for 80, network.application_protocol será definido como HTTP. Se dst_port for 443, network.application_protocol será definido como HTTPS. |
|
| principal.user.group_identifiers | Se o usuário não estiver vazio, não for - e contiver LDAP, a parte da OU da string do usuário será extraída e mapeada para principal.user.group_identifiers. |
|
| principal.user.user_display_name | Se o usuário não estiver vazio, não for - e contiver LDAP, a parte do nome de usuário da string do usuário será extraída e mapeada para principal.user.user_display_name. |
|
| security_result.action | Se action_msg, action ou act não estiverem vazios, sec_action será definido como ALLOW ou BLOCK com base nos valores deles. Por fim, sec_action é mapeado para security_result.action. |
|
| security_result.category_details | Se "cat" não estiver vazio, ele será mapeado para "category". Por fim, a categoria é mapeada para security_result.category_details. Se cs2 não estiver vazio e não for 0, ele será mapeado para security_result.category_details com o prefixo Dynamic Category:. |
|
| security_result.detection_fields.key | O valor Disposition Number é fixado no código em security_result.detection_fields.key ao mapear a disposição ou cn1. O valor NatRuleId é codificado no security_result.detection_fields.key ao mapear NatRuleId. O valor Category Number é codificado no security_result.detection_fields.key ao mapear category_no. |
|
| security_result.severity | Se a gravidade for 1, o log_level contiver info ou a mensagem contiver notice, security_result.severity será definido como INFORMATIONAL. Se a gravidade for 7, security_result.severity será definido como HIGH. |
|
| target_role.description | Se a política não estiver vazia, ela será mapeada para "policy". Se a política não estiver vazia e não for -, ela será mapeada para target_role.description. |
|
| target_role.name | Se "level" não estiver vazio e "role" estiver, ele será mapeado para "role". Por fim, a função é mapeada para target_role.name. | |
| category_no | security_result.detection_fields.value | Se category_no não estiver vazio, ele será mapeado para security_result.detection_fields.value com a chave Category Number. |
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.