Coletar registros do Symantec VIP Authentication Hub

Compatível com:

Este documento explica como ingerir registros do Symantec VIP Authentication Hub no Google Security Operations usando o Bindplane. Primeiro, o código do analisador limpa e pré-processa a mensagem de registro de entrada, convertendo campos específicos e reestruturando dados de pares de chave-valor. Em seguida, ele extrai informações relevantes de vários campos usando padrões grok e lógica condicional, mapeando-os para os atributos correspondentes no Modelo de dados unificado (UDM, na sigla em inglês) para representação padronizada de ocorrência de segurança.

Antes de começar

Verifique se você atende aos seguintes pré-requisitos:

  • Instância do Google SecOps
  • Host Windows 2016 ou mais recente ou Linux com systemd
  • Se estiver executando por trás de um proxy, as portas do firewall estarão abertas.
  • Acesso privilegiado ao hub de autenticação VIP da Symantec.

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 do 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

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
    

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
    

Outros recursos de instalação

Para mais opções de instalação, consulte o guia de instalação.

Configurar o agente do Bindplane para ingerir o Syslog e enviar ao Google SecOps

  1. 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).
  2. 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: 'SYMANTEC_VIP_AUTHHUB'
                raw_log_field: body
    
    service:
        pipelines:
            logs/source0__chronicle_w_labels-0:
                receivers:
                    - udplog
                exporters:
                    - chronicle/chronicle_w_labels
    
  3. Substitua a porta e o endereço IP conforme necessário na sua infraestrutura.

  4. Substitua <customer_id> pelo ID do cliente real.

  5. 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 Syslog no Symantec VIP Authentication Hub

  1. Faça login na UI da Web do Symantec VIP Gateway.
  2. Acesse Registros > Configuração do Syslog.
  3. Se você estiver configurando o Syslog pela primeira vez, será solicitado que você configure as definições dele. Selecione Sim
  4. Se você já tiver configurado o Syslog, clique em Editar na parte de baixo da página.
  5. Informe os seguintes detalhes de configuração:
    • Facilidade do Syslog: selecione LOG_LOCAL0.
    • Host syslog: insira o endereço IP do agente do Bindplane.
    • Porta do Syslog: insira o número da porta do agente Bindplane (por exemplo, 514 para UDP).
  6. Clique em Salvar.
  7. Acesse Provedores de identidade > Configuração do portal de autoatendimento.
  8. Edite os seguintes detalhes de configuração:
    • Nível de registro: selecione Informações.
    • Enable Syslog: selecione Yes.
  9. Clique em Enviar.
  10. Acesse Provedores de identidade > Configuração de autenticação do VIP Manager.
  11. Edite os seguintes detalhes de configuração:
    • Nível de registro: selecione Informações.
    • Enable Syslog: selecione Yes.
  12. Clique em Enviar.
  13. Acesse Repositório de usuários > Sincronização de diretório LDAP.
  14. Edite os seguintes detalhes de configuração:
    • Nível do registro: selecione Informações.
    • Enable Syslog: selecione Yes.
  15. Clique em Enviar.

Tabela de mapeamento da UDM

Campo de registro Mapeamento da UDM Lógica
/auth/v1/authenticate security_result.detection_fields[].value O valor é extraído do campo /auth/v1/authenticate no registro bruto e atribuído a um objeto security_result.detection_fields com a chave api.
__isAuditIdLcmIdStore additional.fields[].value.string_value O valor é extraído do campo __isAuditIdLcmIdStore no registro bruto e atribuído a um objeto additional.fields com a chave __isAuditIdLcmIdStore.
accessTokenScopes security_result.detection_fields[].value O valor é extraído do campo accessTokenScopes no registro bruto e atribuído a um objeto security_result.detection_fields com a chave accessTokenScopes.
accessTokenTid security_result.detection_fields[].value O valor é extraído do campo accessTokenTid no registro bruto e atribuído a um objeto security_result.detection_fields com a chave accessTokenTid.
api security_result.detection_fields[].value O valor é extraído do campo api no registro bruto e atribuído a um objeto security_result.detection_fields com a chave api.
appId additional.fields[].value.string_value O valor é extraído do campo appId no registro bruto e atribuído a um objeto additional.fields com a chave appId.
appName principal.application O valor é extraído do campo appName no registro bruto.
azpName additional.fields[].value.string_value O valor é extraído do campo azpName no registro bruto e atribuído a um objeto additional.fields com a chave azpName.
bytes_sent network.sent_bytes O valor é extraído do campo bytes_sent no registro bruto.
client principal.asset.ip, principal.ip O endereço IP é extraído do campo client no registro bruto usando um padrão grok e adicionado aos campos principal.ip e principal.asset.ip.
clientId additional.fields[].value.string_value, principal.user.userid O valor é extraído do campo clientId no registro bruto e atribuído a um objeto additional.fields com a chave clientId. Se o campo clientId não estiver vazio, ele também será usado para preencher o campo principal.user.userid.
clientIp principal.asset.ip, principal.ip O valor é extraído do campo clientIp no registro bruto e adicionado aos campos principal.ip e principal.asset.ip.
clientTid additional.fields[].value.string_value O valor é extraído do campo clientTid no registro bruto e atribuído a um objeto additional.fields com a chave clientTid.
clientTxnId additional.fields[].value.string_value O valor é extraído do campo clientTxnId no registro bruto e atribuído a um objeto additional.fields com a chave clientTxnId.
contentType additional.fields[].value.string_value O valor é extraído do campo contentType no registro bruto e atribuído a um objeto additional.fields com a chave contentType.
countryISO principal.location.country_or_region O valor é extraído do campo countryISO no registro bruto.
eventId metadata.product_event_type O valor é extraído do campo eventId no registro bruto.
flowStateId additional.fields[].value.string_value O valor é extraído do campo flowStateId no registro bruto e atribuído a um objeto additional.fields com a chave flowStateId.
geo.city_name principal.location.city O valor é extraído do campo geo.city_name no registro bruto.
geo.country_name principal.location.country_or_region O valor é extraído do campo geo.country_name no registro bruto.
geo.location.lat principal.location.region_coordinates.latitude O valor é extraído do campo geo.location.lat no registro bruto, convertido em um ponto flutuante e renomeado como principal.location.region_coordinates.latitude.
geo.location.lon principal.location.region_coordinates.longitude O valor é extraído do campo geo.location.lon no registro bruto, convertido em um ponto flutuante e renomeado como principal.location.region_coordinates.longitude.
guid metadata.product_log_id O valor é extraído do campo guid no registro bruto.
host principal.asset.hostname, principal.hostname O valor é extraído do campo host no registro bruto, sem as aspas, e adicionado aos campos principal.hostname e principal.asset.hostname.
httpMethod network.http.method O valor é extraído do campo httpMethod no registro bruto.
httpReferrer network.http.referral_url O valor é extraído do campo httpReferrer no registro bruto.
identitySourceId additional.fields[].value.string_value O valor é extraído do campo identitySourceId no registro bruto e atribuído a um objeto additional.fields com a chave identitySourceId.
internal-user-sync-ext-resourceGuid target.user.userid O valor é extraído do campo internal-user-sync-ext-resourceGuid no registro bruto.
internal-user-sync-ext-resourceName target.user.email_addresses O valor é extraído do campo internal-user-sync-ext-resourceName no registro bruto e adicionado ao campo target.user.email_addresses.
issuerUrl target.url O valor é extraído do campo issuerUrl no registro bruto.
kubernetes.annotations.cni.projectcalico.org_containerID target.resource.product_object_id O valor é extraído do campo kubernetes.annotations.cni.projectcalico.org_containerID no registro bruto.
kubernetes.annotations.cni.projectcalico.org_podIP target.resource.attribute.labels[].value O valor é extraído do campo kubernetes.annotations.cni.projectcalico.org_podIP no registro bruto e atribuído a um objeto target.resource.attribute.labels com a chave podIP.
kubernetes.annotations.cni.projectcalico.org_podIPs target.resource.attribute.labels[].value O valor é extraído do campo kubernetes.annotations.cni.projectcalico.org_podIPs no registro bruto e atribuído a um objeto target.resource.attribute.labels com a chave podIPs.
kubernetes.container_hash target.resource.attribute.labels[].value O valor é extraído do campo kubernetes.container_hash no registro bruto e atribuído a um objeto target.resource.attribute.labels com a chave container_hash.
kubernetes.container_image target.resource.attribute.labels[].value O valor é extraído do campo kubernetes.container_image no registro bruto e atribuído a um objeto target.resource.attribute.labels com a chave container_image.
kubernetes.container_name target.resource.attribute.labels[].value O valor é extraído do campo kubernetes.container_name no registro bruto e atribuído a um objeto target.resource.attribute.labels com a chave container_name.
kubernetes.docker_id target.resource.attribute.labels[].value O valor é extraído do campo kubernetes.docker_id no registro bruto e atribuído a um objeto target.resource.attribute.labels com a chave docker_id.
kubernetes.host principal.asset.hostname, principal.hostname O valor é extraído do campo kubernetes.host no registro bruto e adicionado aos campos principal.hostname e principal.asset.hostname.
kubernetes.labels.app Esse campo não é mapeado para o objeto IDM na UDM.
kubernetes.labels.app.kubernetes.io/component target.resource.attribute.labels[].value O valor é extraído do campo kubernetes.labels.app.kubernetes.io/component no registro bruto e atribuído a um objeto target.resource.attribute.labels com a chave io_component.
kubernetes.labels.app.kubernetes.io/instance target.resource.attribute.labels[].value O valor é extraído do campo kubernetes.labels.app.kubernetes.io/instance no registro bruto e atribuído a um objeto target.resource.attribute.labels com a chave io_instance.
kubernetes.labels.app.kubernetes.io/managed-by target.resource.attribute.labels[].value O valor é extraído do campo kubernetes.labels.app.kubernetes.io/managed-by no registro bruto e atribuído a um objeto target.resource.attribute.labels com a chave io_managed-by.
kubernetes.labels.app.kubernetes.io/name target.resource.attribute.labels[].value O valor é extraído do campo kubernetes.labels.app.kubernetes.io/name no registro bruto e atribuído a um objeto target.resource.attribute.labels com a chave io_name.
kubernetes.labels.app.kubernetes.io/part-of target.resource.attribute.labels[].value O valor é extraído do campo kubernetes.labels.app.kubernetes.io/part-of no registro bruto e atribuído a um objeto target.resource.attribute.labels com a chave io_part-of.
kubernetes.labels.app.kubernetes.io/version target.resource.attribute.labels[].value O valor é extraído do campo kubernetes.labels.app.kubernetes.io/version no registro bruto e atribuído a um objeto target.resource.attribute.labels com a chave io_version.
kubernetes.labels.helm.sh/chart target.resource.attribute.labels[].value O valor é extraído do campo kubernetes.labels.helm.sh/chart no registro bruto e atribuído a um objeto target.resource.attribute.labels com a chave helm_sh_chart.
kubernetes.labels.helmChartName target.resource.attribute.labels[].value O valor é extraído do campo kubernetes.labels.helmChartName no registro bruto e atribuído a um objeto target.resource.attribute.labels com a chave helmChartName.
kubernetes.labels.imageTag target.resource.attribute.labels[].value O valor é extraído do campo kubernetes.labels.imageTag no registro bruto e atribuído a um objeto target.resource.attribute.labels com a chave imageTag.
kubernetes.labels.pod-template-hash target.resource.attribute.labels[].value O valor é extraído do campo kubernetes.labels.pod-template-hash no registro bruto e atribuído a um objeto target.resource.attribute.labels com a chave pod-template-hash.
kubernetes.namespace_name target.resource.attribute.labels[].value O valor é extraído do campo kubernetes.namespace_name no registro bruto e atribuído a um objeto target.resource.attribute.labels com a chave namespace_name.
kubernetes.pod_id target.resource.attribute.labels[].value O valor é extraído do campo kubernetes.pod_id no registro bruto e atribuído a um objeto target.resource.attribute.labels com a chave pod_id.
kubernetes.pod_name target.resource.attribute.labels[].value O valor é extraído do campo kubernetes.pod_name no registro bruto e atribuído a um objeto target.resource.attribute.labels com a chave pod_name.
level security_result.severity Se o campo level no registro bruto corresponder a notice ou info (sem diferenciar maiúsculas de minúsculas), o campo security_result.severity será definido como INFORMATIONAL.
log security_result.description, level, kv_data Os campos level e kv_data são extraídos do campo log no registro bruto usando um padrão grok. O campo security_result.description é preenchido com todo o campo log.
logtag additional.fields[].value.string_value O valor é extraído do campo logtag no registro bruto e atribuído a um objeto additional.fields com a chave logtag.
method network.http.method O valor é extraído do campo method no registro bruto.
msg metadata.event_type, security_result.description O valor é extraído do campo msg no registro bruto e usado para preencher o campo security_result.description. O campo metadata.event_type é determinado com base no conteúdo do campo msg: * USER_CREATION se msg contiver Internal user created or updated. * USER_LOGIN se msg contiver Authorization Initiated Succesfully, Authentication Initiated Successfully ou Authentication Successful. * USER_RESOURCE_ACCESS se msg contiver Token Generated ou token verified. * NETWORK_CONNECTION se has_principal e has_target forem verdadeiros. * STATUS_UPDATE se has_principal for verdadeiro. * GENERIC_EVENT caso contrário.
path principal.file.full_path O valor é extraído do campo path no registro bruto.
principalId additional.fields[].value.string_value, principal.user.userid O valor é extraído do campo principalId no registro bruto e atribuído a um objeto additional.fields com a chave principalId. Se o campo principalId não for clientId e não estiver vazio, ele também será usado para preencher o campo principal.user.userid.
principalType additional.fields[].value.string_value O valor é extraído do campo principalType no registro bruto e atribuído a um objeto additional.fields com a chave principalType.
protocol network.application_protocol Se o campo protocol no registro bruto corresponder a HTTP (sem diferenciar maiúsculas de minúsculas), o campo network.application_protocol será definido como HTTP.
referrer network.http.referral_url O valor é extraído do campo referrer no registro bruto, sem aspas, e atribuído ao campo network.http.referral_url.
relVersion metadata.product_version O valor é extraído do campo relVersion no registro bruto.
remoteAddr additional.fields[].value.string_value O valor é extraído do campo remoteAddr no registro bruto e atribuído a um objeto additional.fields com a chave remoteAddr.
requestId additional.fields[].value.string_value O valor é extraído do campo requestId no registro bruto e atribuído a um objeto additional.fields com a chave requestId.
requestTime additional.fields[].value.string_value O valor é extraído do campo requestTime no registro bruto e atribuído a um objeto additional.fields com a chave requestTime.
responseCode network.http.response_code O valor numérico é extraído do campo responseCode no registro bruto usando um padrão grok, convertido em um número inteiro e atribuído ao campo network.http.response_code.
request method, path, protocol Os campos method, path e protocol são extraídos do campo request no registro bruto usando um padrão grok depois de remover as aspas.
server target.asset.hostname, target.hostname O valor é extraído do campo server no registro bruto e adicionado aos campos target.hostname e target.asset.hostname.
service additional.fields[].value.string_value O valor é extraído do campo service no registro bruto e atribuído a um objeto additional.fields com a chave service.
status network.http.response_code O valor é extraído do campo status no registro bruto, convertido em um número inteiro e atribuído ao campo network.http.response_code.
stream additional.fields[].value.string_value O valor é extraído do campo stream no registro bruto e atribuído a um objeto additional.fields com a chave stream.
sub additional.fields[].value.string_value O valor é extraído do campo sub no registro bruto e atribuído a um objeto additional.fields com a chave sub.
subType additional.fields[].value.string_value O valor é extraído do campo subType no registro bruto e atribuído a um objeto additional.fields com a chave subType.
tid additional.fields[].value.string_value O valor é extraído do campo tid no registro bruto e atribuído a um objeto additional.fields com a chave tid.
timestamp metadata.event_timestamp O valor é extraído do campo timestamp no registro bruto e analisado como um carimbo de data/hora ISO8601.
tname additional.fields[].value.string_value O valor é extraído do campo tname no registro bruto e atribuído a um objeto additional.fields com a chave tname.
txnId additional.fields[].value.string_value O valor é extraído do campo txnId no registro bruto e atribuído a um objeto additional.fields com a chave txnId.
type additional.fields[].value.string_value O valor é extraído do campo type no registro bruto e atribuído a um objeto additional.fields com a chave type.
userAgent network.http.parsed_user_agent, network.http.user_agent O valor é extraído do campo userAgent no registro bruto e atribuído aos campos network.http.user_agent e network.http.parsed_user_agent. O campo network.http.parsed_user_agent é convertido em um objeto de user agent analisado.
userDN additional.fields[].value.string_value O valor é extraído do campo userDN no registro bruto e atribuído a um objeto additional.fields com a chave userDN.
userGuid additional.fields[].value.string_value O valor é extraído do campo userGuid no registro bruto e atribuído a um objeto additional.fields com a chave userGuid.
userIdpGuid additional.fields[].value.string_value O valor é extraído do campo userIdpGuid no registro bruto e atribuído a um objeto additional.fields com a chave userIdpGuid.
userIP principal.asset.ip, principal.ip, target.asset.ip, target.ip, intermediary.ip Os endereços IP são extraídos do campo userIP no registro bruto usando um padrão grok. O primeiro endereço IP é adicionado aos campos principal.ip e principal.asset.ip. O segundo endereço IP é adicionado aos campos target.ip e target.asset.ip. O terceiro endereço IP é adicionado ao campo intermediary.ip.
userLoginId target.user.email_addresses Se o campo userLoginId no registro bruto não estiver vazio e corresponder a um padrão de endereço de e-mail, ele será adicionado ao campo target.user.email_addresses.
userLoginIdAttributeMappingName target.user.user_display_name O valor é extraído do campo userLoginIdAttributeMappingName no registro bruto.
userRiskLevel additional.fields[].value.string_value O valor é extraído do campo userRiskLevel no registro bruto e atribuído a um objeto additional.fields com a chave userRiskLevel.
userRiskScore additional.fields[].value.string_value O valor é extraído do campo userRiskScore no registro bruto e atribuído a um objeto additional.fields com a chave userRiskScore.
userIp principal.asset.ip, principal.ip O valor é extraído do campo userIp no registro bruto e adicionado aos campos principal.ip e principal.asset.ip.
userUniversalId additional.fields[].value.string_value O valor é extraído do campo userUniversalId no registro bruto e atribuído a um objeto additional.fields com a chave userUniversalId.
vhost additional.fields[].value.string_value O valor é extraído do campo vhost no registro bruto e atribuído a um objeto additional.fields com a chave vhost.
N/A extensions.auth.type O valor é definido como SSO se o campo metadata.event_type for USER_LOGIN.
N/A metadata.log_type O valor é definido como SYMANTEC_VIP_AUTHHUB.

Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.