Coletar registros do Ivanti Connect Secure (Pulse Secure)
Este documento explica como ingerir registros do Ivanti Connect Secure (Pulse Secure) no Google Security Operations usando o Bindplane.
O Ivanti Connect Secure (antigo Pulse Secure) é uma solução de VPN SSL que oferece acesso remoto seguro a aplicativos, recursos e redes empresariais. Ele aceita autenticação multifator, verificação de conformidade de endpoints e políticas de acesso granular para trabalhadores e parceiros remotos. Observação: a Pulse Secure foi adquirida pela Ivanti em 2020. O analisador extrai campos de registros formatados do syslog da VPN Pulse Secure. Ele usa o grok 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 ao console de administrador do Ivanti Connect Secure (Pulse Secure)
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: 'PULSE_SECURE_VPN' 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 (PULSE_SECURE_VPN)
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 no Ivanti Connect Secure (Pulse Secure)
- Faça login no console de administração do Ivanti Connect Secure (antigo Pulse Secure).
- Acesse Sistema > Registro/Monitoramento > Servidores Syslog.
- Clique em Novo servidor para adicionar um servidor syslog.
- Informe os seguintes detalhes de configuração:
- Nome/IP do servidor: insira o endereço IP do host do agente do Bindplane.
- Porta do servidor: insira
514. - Instalação: selecione LOCAL0 (ou a instalação de sua preferência).
- Tipo: selecione UDP.
- Na seção Filtro de eventos, selecione os tipos de eventos a serem encaminhados:
- Padrão: para formato syslog padrão
- Selecione as categorias de registro:
- Eventos: selecione Registros de acesso do usuário, Registros do administrador e Eventos do sensor.
- Níveis de gravidade: selecione Informações e acima para um registro abrangente.
- Clique em Salvar alterações.
- 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 | security_result.action_details | Mapeado diretamente do campo "action". |
| aplicativo | principal.application | Mapeado diretamente do campo "application". |
| bytes_read | network.received_bytes | Mapeado diretamente do campo "bytes_read" e convertido em um número inteiro sem sinal. |
| bytes_written | network.sent_bytes | Mapeado diretamente do campo "bytes_written" e convertido em um número inteiro sem sinal. |
| client_host | principal.hostname, principal.asset.hostname | Mapeado diretamente do campo "client_host". |
| cmd | principal.process.command_line | Mapeado diretamente do campo "cmd". |
| connection_status | security_result.detection_fields.value.string_value | Mapeado diretamente do campo "connection_status". |
| data_time | metadata.event_timestamp.seconds | Analisado do campo "data_time" usando vários formatos de carimbo de data/hora (MM-dd-aaaa HH:mm:ss Z, RFC 3339, ISO8601, MMM d HH:mm:ss, MMM d HH:mm:ss). |
| devname | principal.hostname, principal.asset.hostname | Mapeado diretamente do campo "devname". |
| dstip | target.ip, target.asset.ip | Mapeado diretamente do campo "dstip". |
| dstport | target.port | Mapeado diretamente do campo "dstport" e convertido em número inteiro. |
| dstcountry | target.location.country_or_region | Mapeado diretamente do campo "dstcountry" se ele não estiver "Reservado" ou vazio. |
| duration | network.session_duration.seconds | Mapeado diretamente do campo "duration" e convertido em número inteiro. |
| dvc | intermediary.hostname ou intermediary.ip | Se o campo "dvc" puder ser convertido em um endereço IP, ele será mapeado para "intermediary.ip". Caso contrário, ele será mapeado para intermediary.hostname. |
| dvc_hostname | intermediary.hostname, principal.hostname, principal.asset.hostname ou intermediary.ip, principal.ip, principal.asset.ip | Se o campo dvc_hostname puder ser convertido em um endereço IP, ele será mapeado para os respectivos campos de IP. Caso contrário, ele será mapeado para os respectivos campos de nome do host. |
| event_type | metadata.product_event_type | Mapeado diretamente do campo "event_type". |
| failure_reason | security_result.description | Mapeado diretamente do campo "failure_reason". Se a mensagem contiver "because host", o texto "host" será adicionado antes do motivo da falha. |
| has_principal | event.idm.read_only_udm.principal (presence) | Definido como "true" se algum campo principal estiver preenchido. Caso contrário, "false". Derivada pela lógica do analisador. |
| has_target | event.idm.read_only_udm.target (presença) | Definido como "true" se algum campo de destino for preenchido. Caso contrário, "false". Derivada pela lógica do analisador. |
| has_target_user | event.idm.read_only_udm.target.user.userid (presença) | Defina como "true" se target.user.userid estiver preenchido. Caso contrário, defina como "false". Derivada pela lógica do analisador. |
| host_ip | principal.ip, principal.asset.ip | Mapeado diretamente do campo "host_ip". |
| host_mac | principal.mac | Mapeado diretamente do campo "host_mac", substituindo hífens por dois-pontos. |
| http_method | network.http.method | Mapeado diretamente do campo "http_method". |
| http_response | network.http.response_code | Mapeado diretamente do campo "http_response" e convertido em número inteiro. |
| info_desc | about.labels.value | Mapeado diretamente do campo "info_desc". |
| ip_new | target.ip, target.asset.ip | Mapeado diretamente do campo "ip_new". |
| level | security_result.severity, security_result.severity_details | A gravidade de "security_result" é derivada do campo "level" ("error"/"warning" -> HIGH, "notice" -> MEDIUM, "information"/"info" -> LOW). O valor bruto do nível também é mapeado para security_result.severity_details. |
| logid | metadata.product_log_id | Mapeado diretamente do campo "logid". |
| locip | principal.ip, principal.asset.ip | Mapeado diretamente do campo "locip". |
| mensagem | metadata.description | Usado para extrair vários campos usando filtros grok e kv. Se a mensagem contiver "EventID", ela será processada como um log de eventos do Windows. |
| message_info | metadata.description | Mapeado diretamente para metadata.description se não for usado em padrões grok mais específicos. |
| msg | metadata.product_event_type, metadata.description | Se o campo "msg" estiver presente, o tipo de produto será extraído e mapeado para "metadata.product_event_type", e a mensagem restante será mapeada para "metadata.description". |
| msg_hostname | principal.hostname, principal.asset.hostname | Mapeado diretamente do campo "msg_hostname". |
| msg_ip | principal.ip, principal.asset.ip | Mapeado diretamente do campo "msg_ip". |
| msg_user_agent | network.http.user_agent, network.http.parsed_user_agent, metadata.product_version | A string do user agent é mapeada para network.http.user_agent, o user agent analisado é mapeado para network.http.parsed_user_agent, e a versão do produto (se presente) é mapeada para metadata.product_version. |
| network_duration | network.session_duration.seconds | Mapeado diretamente do campo "network_duration" e convertido em número inteiro. |
| policyid | security_result.rule_id | Mapeado diretamente do campo "policyid". |
| policyname | security_result.rule_name | Mapeado diretamente do campo "policyname". |
| policytype | security_result.rule_type | Mapeado diretamente do campo "policytype". |
| priority_code | about.labels.value | Mapeado diretamente do campo "priority_code" e também usado para derivar "about.labels.value" para a chave "Severity" (consulte "Logic"). |
| prod_name | metadata.product_name | Mapeado diretamente do campo "prod_name". |
| product_type | metadata.product_event_type | Mapeado diretamente do campo "product_type". |
| product_version | metadata.product_version | Mapeado diretamente do campo "product_version". |
| proto | network.ip_protocol | Mapeado para network.ip_protocol depois de ser convertido em um nome de protocolo IP usando uma pesquisa. |
| pwd | principal.process.file.full_path | Mapeado diretamente do campo "pwd". |
| realm | principal.group.attribute.labels.value | Mapeado diretamente do campo "realm". |
| rcvdbyte | network.received_bytes | Mapeado diretamente do campo "rcvdbyte" e convertido em um número inteiro sem sinal. |
| remip | target.ip | Mapeado diretamente do campo "remip". |
| resource_name | target.resource.name | Mapeado diretamente do campo "resource_name" depois de remover espaços em branco e hífens no início e no fim. |
| resource_status | security_result.description | Mapeado diretamente do campo "resource_status". |
| resource_user_group | principal.user.group_identifiers | Mapeado diretamente do campo "resource_user_group". |
| resource_user_name | principal.user.userid | Mapeado diretamente do campo "resource_user_name". |
| papéis | principal.user.group_identifiers | Mapeado diretamente do campo "roles". |
| sentbyte | network.sent_bytes | Mapeado diretamente do campo "sentbyte" e convertido em um número inteiro sem sinal. |
| session_id | network.session_id | Mapeado diretamente do campo "session_id". |
| sessionid | network.session_id | Mapeado diretamente do campo "sessionid". |
| srcip | principal.ip, principal.asset.ip | Mapeado diretamente do campo "srcip". |
| srcport | principal.port | Mapeado diretamente do campo "srcport" e convertido em número inteiro. |
| srccountry | principal.location.country_or_region | Mapeado diretamente do campo "srccountry" se ele não for "Reserved" ou estiver vazio. |
| subtype | metadata.product_event_type | Usado em conjunto com o tipo para formar metadata.product_event_type. |
| target_file | target.file.full_path | Mapeado diretamente do campo "target_file". |
| target_host | target.hostname, target.asset.hostname | Mapeado diretamente do campo "target_host". |
| target_ip | target.ip, target.asset.ip | Mapeado diretamente do campo "target_ip". |
| target_port | target.port | Mapeado diretamente do campo "target_port" e convertido em número inteiro. |
| target_url | target.url | Mapeado diretamente do campo "target_url". |
| tempo | metadata.event_timestamp.seconds | Analisado do campo "time" usando o formato "aaaa-MM-dd HH:mm:ss". |
| tipo | metadata.product_event_type | Usado em conjunto com o subtipo para formar metadata.product_event_type. |
| u_event_source_ip | principal.ip, principal.asset.ip ou target.ip | Se target_ip ou target_host estiverem presentes, u_event_source_ip será mapeado para principal.ip e principal.asset.ip. Caso contrário, se target_ip, target_host e target_url estiverem vazios, u_event_source_ip será mapeado para target.ip. |
| u_observer_ip | observer.ip | Mapeado diretamente do campo "u_observer_ip". |
| u_prin_ip | principal.ip, principal.asset.ip | Mapeado diretamente do campo "u_prin_ip". |
| usuário | target.user.userid | Mapeado diretamente do campo "user". |
| user_agent | network.http.user_agent, network.http.parsed_user_agent | A string de user agent é mapeada para network.http.user_agent, e o user agent analisado é mapeado para network.http.parsed_user_agent. |
| user_group_identifier | target.user.group_identifiers ou principal.user.group_identifiers | Mapeado para target.user.group_identifiers na maioria dos casos. Mapeado para principal.user.group_identifiers nos eventos de mudança de IP (USER_UNCATEGORIZED) e restrições do Realm. |
| user_ip | principal.ip, principal.asset.ip | Mapeado diretamente do campo "user_ip". Se estiver vazio e u_event_source_ip não estiver, ele vai receber o valor de u_event_source_ip. |
| nome de usuário | principal.user.userid ou target.user.userid | Mapeado para "principal.user.userid" na maioria dos casos. Mapeado para target.user.userid em alguns cenários específicos (por exemplo, quando detect_user_logout_failed é "false" e detect_policy_change_failed é "false"). |
| username_removed | target.user.userid | Mapeado diretamente do campo "username_removed". |
| vd | principal.administrative_domain | Mapeado diretamente do campo "vd". |
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.