Coletar registros do Symantec VIP Authentication Hub
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
- 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 o 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: 'SYMANTEC_VIP_AUTHHUB' 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 Syslog no Symantec VIP Authentication Hub
- Faça login na UI da Web do Symantec VIP Gateway.
- Acesse Registros > Configuração do Syslog.
- Se você estiver configurando o Syslog pela primeira vez, será solicitado que você configure as definições dele. Selecione Sim
- Se você já tiver configurado o Syslog, clique em Editar na parte de baixo da página.
- 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).
- Clique em Salvar.
- Acesse Provedores de identidade > Configuração do portal de autoatendimento.
- Edite os seguintes detalhes de configuração:
- Nível de registro: selecione Informações.
- Enable Syslog: selecione Yes.
- Clique em Enviar.
- Acesse Provedores de identidade > Configuração de autenticação do VIP Manager.
- Edite os seguintes detalhes de configuração:
- Nível de registro: selecione Informações.
- Enable Syslog: selecione Yes.
- Clique em Enviar.
- Acesse Repositório de usuários > Sincronização de diretório LDAP.
- Edite os seguintes detalhes de configuração:
- Nível do registro: selecione Informações.
- Enable Syslog: selecione Yes.
- 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.