Coletar registros do Ivanti Connect Secure (Pulse Secure)

Compatível com:

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

  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: '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: 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 (PULSE_SECURE_VPN)

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 no Ivanti Connect Secure (Pulse Secure)

  1. Faça login no console de administração do Ivanti Connect Secure (antigo Pulse Secure).
  2. Acesse Sistema > Registro/Monitoramento > Servidores Syslog.
  3. Clique em Novo servidor para adicionar um servidor syslog.
  4. 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.
  5. Na seção Filtro de eventos, selecione os tipos de eventos a serem encaminhados:
    • Padrão: para formato syslog padrão
  6. 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.
  7. Clique em Salvar alterações.
  8. 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.