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
,vi
ou Bloco de Notas).
- Localize o arquivo
Edite o arquivo
config.yaml
da 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_labels
Substitua 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.json
para 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-agent
Para 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.