Recolha registos do centro de autenticação VIP da Symantec
Este documento explica como carregar registos do Symantec VIP Authentication Hub para o Google Security Operations através do Bindplane. O código do analisador primeiro limpa e pré-processa a mensagem de registo de entrada, convertendo campos específicos e reestruturando dados de pares de chave/valor. Em seguida, extrai informações relevantes de vários campos através de padrões grok e lógica condicional, mapeando-os para os atributos correspondentes no modelo de dados unificado (UDM) para uma representação de eventos de segurança padronizada.
Antes de começar
Certifique-se de que tem os seguintes pré-requisitos:
- Instância do Google SecOps
- Windows 2016 ou posterior, ou anfitrião Linux com systemd
- Se estiver a ser executado através de um proxy, as portas da firewall estão abertas
- Acesso privilegiado ao centro de autenticação VIP da Symantec
Obtenha o ficheiro de autenticação de carregamento do Google SecOps
- Inicie sessão na consola Google SecOps.
- Aceda a Definições do SIEM > Agentes de recolha.
- Transfira o ficheiro de autenticação de carregamento. Guarde o ficheiro de forma segura no sistema onde o Bindplane vai ser instalado.
Obtenha o ID de cliente do Google SecOps
- Inicie sessão na consola Google SecOps.
- Aceda a Definições do SIEM > Perfil.
- Copie e guarde o ID do cliente da secção Detalhes da organização.
Instale o agente do Bindplane
Instalação do Windows
- Abra a Linha de comandos ou o PowerShell como administrador.
Execute o seguinte 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 raiz ou sudo.
Execute o seguinte comando:
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
Recursos de instalação adicionais
Para ver opções de instalação adicionais, consulte o guia de instalação.
Configure o agente Bindplane para carregar o Syslog e enviá-lo para o Google SecOps
- Aceda ao ficheiro de configuração:
- Localize o ficheiro
config.yaml
. Normalmente, encontra-se no diretório/etc/bindplane-agent/
no Linux ou no diretório de instalação no Windows. - Abra o ficheiro com um editor de texto (por exemplo,
nano
,vi
ou Bloco de notas).
- Localize o ficheiro
Edite o ficheiro
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 de cliente real.Atualize
/path/to/ingestion-authentication-file.json
para o caminho onde o ficheiro de autenticação foi guardado na secção Obtenha o ficheiro de autenticação de carregamento do Google SecOps.
Reinicie o agente do Bindplane para aplicar as alterações
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, pode usar a consola Services ou introduzir o seguinte comando:
net stop BindPlaneAgent && net start BindPlaneAgent
Configure o Syslog no centro de autenticação VIP da Symantec
- Inicie sessão na IU Web do Symantec VIP Gateway.
- Aceda a Registos > Configuração do Syslog.
- Se estiver a configurar o Syslog pela primeira vez, é-lhe pedido que configure as definições do Syslog. Selecione Sim.
- Se já configurou o Syslog, clique em Editar na parte inferior da página.
- Indique os seguintes detalhes de configuração:
- Syslog Facility: selecione LOG_LOCAL0.
- Anfitrião Syslog: introduza o endereço IP do agente Bindplane.
- Porta Syslog: introduza o número da porta do agente Bindplane (por exemplo,
514
para UDP).
- Clique em Guardar.
- Aceda a Fornecedores de identidade > Configuração do portal de autosserviço.
- Edite os seguintes detalhes de configuração:
- Nível de registo: selecione Informações.
- Ativar Syslog: selecione Sim.
- Clique em Enviar.
- Aceda a Fornecedores de identidade > Configuração de autenticação do gestor de VIP.
- Edite os seguintes detalhes de configuração:
- Nível de registo: selecione Informações.
- Ativar Syslog: selecione Sim.
- Clique em Enviar.
- Aceda a Armazenamento de utilizadores > Sincronização do diretório LDAP.
- Edite os seguintes detalhes de configuração:
- Nível do registo: selecione Informações.
- Ativar Syslog: selecione Sim.
- Clique em Enviar.
Tabela de mapeamento do UDM
Campo de registo | Mapeamento do UDM | Lógica |
---|---|---|
/auth/v1/authenticate |
security_result.detection_fields[].value |
O valor é retirado do campo /auth/v1/authenticate no registo não processado e atribuído a um objeto security_result.detection_fields com a chave api . |
__isAuditIdLcmIdStore |
additional.fields[].value.string_value |
O valor é retirado do campo __isAuditIdLcmIdStore no registo não processado e atribuído a um objeto additional.fields com a chave __isAuditIdLcmIdStore . |
accessTokenScopes |
security_result.detection_fields[].value |
O valor é retirado do campo accessTokenScopes no registo não processado e atribuído a um objeto security_result.detection_fields com a chave accessTokenScopes . |
accessTokenTid |
security_result.detection_fields[].value |
O valor é retirado do campo accessTokenTid no registo não processado e atribuído a um objeto security_result.detection_fields com a chave accessTokenTid . |
api |
security_result.detection_fields[].value |
O valor é retirado do campo api no registo não processado e atribuído a um objeto security_result.detection_fields com a chave api . |
appId |
additional.fields[].value.string_value |
O valor é retirado do campo appId no registo não processado e atribuído a um objeto additional.fields com a chave appId . |
appName |
principal.application |
O valor é retirado do campo appName no registo não processado. |
azpName |
additional.fields[].value.string_value |
O valor é retirado do campo azpName no registo não processado e atribuído a um objeto additional.fields com a chave azpName . |
bytes_sent |
network.sent_bytes |
O valor é retirado do campo bytes_sent no registo não processado. |
client |
principal.asset.ip , principal.ip |
O endereço IP é extraído do campo client no registo não processado através de 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 é retirado do campo clientId no registo não processado e atribuído a um objeto additional.fields com a chave clientId . Se o campo clientId não estiver vazio, também é usado para preencher o campo principal.user.userid . |
clientIp |
principal.asset.ip , principal.ip |
O valor é retirado do campo clientIp no registo não processado e adicionado aos campos principal.ip e principal.asset.ip . |
clientTid |
additional.fields[].value.string_value |
O valor é retirado do campo clientTid no registo não processado e atribuído a um objeto additional.fields com a chave clientTid . |
clientTxnId |
additional.fields[].value.string_value |
O valor é retirado do campo clientTxnId no registo não processado e atribuído a um objeto additional.fields com a chave clientTxnId . |
contentType |
additional.fields[].value.string_value |
O valor é retirado do campo contentType no registo não processado e atribuído a um objeto additional.fields com a chave contentType . |
countryISO |
principal.location.country_or_region |
O valor é retirado do campo countryISO no registo não processado. |
eventId |
metadata.product_event_type |
O valor é retirado do campo eventId no registo não processado. |
flowStateId |
additional.fields[].value.string_value |
O valor é retirado do campo flowStateId no registo não processado e atribuído a um objeto additional.fields com a chave flowStateId . |
geo.city_name |
principal.location.city |
O valor é retirado do campo geo.city_name no registo não processado. |
geo.country_name |
principal.location.country_or_region |
O valor é retirado do campo geo.country_name no registo não processado. |
geo.location.lat |
principal.location.region_coordinates.latitude |
O valor é retirado do campo geo.location.lat no registo não processado, convertido num número de vírgula flutuante e mudado para principal.location.region_coordinates.latitude . |
geo.location.lon |
principal.location.region_coordinates.longitude |
O valor é retirado do campo geo.location.lon no registo não processado, convertido num número de vírgula flutuante e mudado para principal.location.region_coordinates.longitude . |
guid |
metadata.product_log_id |
O valor é retirado do campo guid no registo não processado. |
host |
principal.asset.hostname , principal.hostname |
O valor é retirado do campo host no registo não processado, sem as aspas, e adicionado aos campos principal.hostname e principal.asset.hostname . |
httpMethod |
network.http.method |
O valor é retirado do campo httpMethod no registo não processado. |
httpReferrer |
network.http.referral_url |
O valor é retirado do campo httpReferrer no registo não processado. |
identitySourceId |
additional.fields[].value.string_value |
O valor é retirado do campo identitySourceId no registo não processado e atribuído a um objeto additional.fields com a chave identitySourceId . |
internal-user-sync-ext-resourceGuid |
target.user.userid |
O valor é retirado do campo internal-user-sync-ext-resourceGuid no registo não processado. |
internal-user-sync-ext-resourceName |
target.user.email_addresses |
O valor é retirado do campo internal-user-sync-ext-resourceName no registo não processado e adicionado ao campo target.user.email_addresses . |
issuerUrl |
target.url |
O valor é retirado do campo issuerUrl no registo não processado. |
kubernetes.annotations.cni.projectcalico.org_containerID |
target.resource.product_object_id |
O valor é retirado do campo kubernetes.annotations.cni.projectcalico.org_containerID no registo não processado. |
kubernetes.annotations.cni.projectcalico.org_podIP |
target.resource.attribute.labels[].value |
O valor é retirado do campo kubernetes.annotations.cni.projectcalico.org_podIP no registo não processado 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 é retirado do campo kubernetes.annotations.cni.projectcalico.org_podIPs no registo não processado e atribuído a um objeto target.resource.attribute.labels com a chave podIPs . |
kubernetes.container_hash |
target.resource.attribute.labels[].value |
O valor é retirado do campo kubernetes.container_hash no registo não processado 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 é retirado do campo kubernetes.container_image no registo não processado 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 é retirado do campo kubernetes.container_name no registo não processado 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 é retirado do campo kubernetes.docker_id no registo não processado e atribuído a um objeto target.resource.attribute.labels com a chave docker_id . |
kubernetes.host |
principal.asset.hostname , principal.hostname |
O valor é retirado do campo kubernetes.host no registo não processado e adicionado aos campos principal.hostname e principal.asset.hostname . |
kubernetes.labels.app |
Este campo não está mapeado para o objeto IDM no UDM. | |
kubernetes.labels.app.kubernetes.io/component |
target.resource.attribute.labels[].value |
O valor é retirado do campo kubernetes.labels.app.kubernetes.io/component no registo não processado 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 é retirado do campo kubernetes.labels.app.kubernetes.io/instance no registo não processado 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 é retirado do campo kubernetes.labels.app.kubernetes.io/managed-by no registo não processado 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 é retirado do campo kubernetes.labels.app.kubernetes.io/name no registo não processado 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 é retirado do campo kubernetes.labels.app.kubernetes.io/part-of no registo não processado 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 é retirado do campo kubernetes.labels.app.kubernetes.io/version no registo não processado 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 é retirado do campo kubernetes.labels.helm.sh/chart no registo não processado 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 é retirado do campo kubernetes.labels.helmChartName no registo não processado e atribuído a um objeto target.resource.attribute.labels com a chave helmChartName . |
kubernetes.labels.imageTag |
target.resource.attribute.labels[].value |
O valor é retirado do campo kubernetes.labels.imageTag no registo não processado 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 é retirado do campo kubernetes.labels.pod-template-hash no registo não processado 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 é retirado do campo kubernetes.namespace_name no registo não processado 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 é retirado do campo kubernetes.pod_id no registo não processado 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 é retirado do campo kubernetes.pod_name no registo não processado e atribuído a um objeto target.resource.attribute.labels com a chave pod_name . |
level |
security_result.severity |
Se o campo level no registo não processado corresponder a notice ou info (sem distinção entre maiúsculas e minúsculas), o campo security_result.severity é definido como INFORMATIONAL . |
log |
security_result.description , level , kv_data |
Os campos level e kv_data são extraídos do campo log no registo não processado através de um padrão grok. O campo security_result.description é preenchido com o campo log completo. |
logtag |
additional.fields[].value.string_value |
O valor é retirado do campo logtag no registo não processado e atribuído a um objeto additional.fields com a chave logtag . |
method |
network.http.method |
O valor é retirado do campo method no registo não processado. |
msg |
metadata.event_type , security_result.description |
O valor é retirado do campo msg no registo não processado 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 é retirado do campo path no registo não processado. |
principalId |
additional.fields[].value.string_value , principal.user.userid |
O valor é retirado do campo principalId no registo não processado 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, também é usado para preencher o campo principal.user.userid . |
principalType |
additional.fields[].value.string_value |
O valor é retirado do campo principalType no registo não processado e atribuído a um objeto additional.fields com a chave principalType . |
protocol |
network.application_protocol |
Se o campo protocol no registo não processado corresponder a HTTP (sem distinção entre maiúsculas e minúsculas), o campo network.application_protocol é definido como HTTP . |
referrer |
network.http.referral_url |
O valor é retirado do campo referrer no registo não processado, sem as aspas, e atribuído ao campo network.http.referral_url . |
relVersion |
metadata.product_version |
O valor é retirado do campo relVersion no registo não processado. |
remoteAddr |
additional.fields[].value.string_value |
O valor é retirado do campo remoteAddr no registo não processado e atribuído a um objeto additional.fields com a chave remoteAddr . |
requestId |
additional.fields[].value.string_value |
O valor é retirado do campo requestId no registo não processado e atribuído a um objeto additional.fields com a chave requestId . |
requestTime |
additional.fields[].value.string_value |
O valor é retirado do campo requestTime no registo não processado 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 registo não processado através de um padrão grok, convertido num 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 registo não processado através de um padrão grok após a remoção de quaisquer aspas. |
server |
target.asset.hostname , target.hostname |
O valor é retirado do campo server no registo não processado e adicionado aos campos target.hostname e target.asset.hostname . |
service |
additional.fields[].value.string_value |
O valor é retirado do campo service no registo não processado e atribuído a um objeto additional.fields com a chave service . |
status |
network.http.response_code |
O valor é retirado do campo status no registo não processado, convertido num número inteiro e atribuído ao campo network.http.response_code . |
stream |
additional.fields[].value.string_value |
O valor é retirado do campo stream no registo não processado e atribuído a um objeto additional.fields com a chave stream . |
sub |
additional.fields[].value.string_value |
O valor é retirado do campo sub no registo não processado e atribuído a um objeto additional.fields com a chave sub . |
subType |
additional.fields[].value.string_value |
O valor é retirado do campo subType no registo não processado e atribuído a um objeto additional.fields com a chave subType . |
tid |
additional.fields[].value.string_value |
O valor é retirado do campo tid no registo não processado e atribuído a um objeto additional.fields com a chave tid . |
timestamp |
metadata.event_timestamp |
O valor é retirado do campo timestamp no registo não processado e analisado como uma indicação de tempo ISO8601. |
tname |
additional.fields[].value.string_value |
O valor é retirado do campo tname no registo não processado e atribuído a um objeto additional.fields com a chave tname . |
txnId |
additional.fields[].value.string_value |
O valor é retirado do campo txnId no registo não processado e atribuído a um objeto additional.fields com a chave txnId . |
type |
additional.fields[].value.string_value |
O valor é retirado do campo type no registo não processado e atribuído a um objeto additional.fields com a chave type . |
userAgent |
network.http.parsed_user_agent , network.http.user_agent |
O valor é retirado do campo userAgent no registo não processado e atribuído aos campos network.http.user_agent e network.http.parsed_user_agent . O campo network.http.parsed_user_agent é, em seguida, convertido num objeto de agente do utilizador analisado. |
userDN |
additional.fields[].value.string_value |
O valor é retirado do campo userDN no registo não processado e atribuído a um objeto additional.fields com a chave userDN . |
userGuid |
additional.fields[].value.string_value |
O valor é retirado do campo userGuid no registo não processado e atribuído a um objeto additional.fields com a chave userGuid . |
userIdpGuid |
additional.fields[].value.string_value |
O valor é retirado do campo userIdpGuid no registo não processado e atribuído a um objeto additional.fields com a chave userIdpGuid . |
userIP |
principal.asset.ip , principal.ip , target.asset.ip , target.ip e intermediary.ip |
Os endereços IP são extraídos do campo userIP no registo não processado através de 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 registo não processado não estiver vazio e corresponder a um padrão de endereço de email, é adicionado ao campo target.user.email_addresses . |
userLoginIdAttributeMappingName |
target.user.user_display_name |
O valor é retirado do campo userLoginIdAttributeMappingName no registo não processado. |
userRiskLevel |
additional.fields[].value.string_value |
O valor é retirado do campo userRiskLevel no registo não processado e atribuído a um objeto additional.fields com a chave userRiskLevel . |
userRiskScore |
additional.fields[].value.string_value |
O valor é retirado do campo userRiskScore no registo não processado e atribuído a um objeto additional.fields com a chave userRiskScore . |
userIp |
principal.asset.ip , principal.ip |
O valor é retirado do campo userIp no registo não processado e adicionado aos campos principal.ip e principal.asset.ip . |
userUniversalId |
additional.fields[].value.string_value |
O valor é retirado do campo userUniversalId no registo não processado e atribuído a um objeto additional.fields com a chave userUniversalId . |
vhost |
additional.fields[].value.string_value |
O valor é retirado do campo vhost no registo não processado 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 da Google SecOps.