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,viou Bloco de notas).
- Localize o ficheiro
Edite o ficheiro
config.yamlda 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_labelsSubstitua 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.jsonpara 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-agentPara 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,
514para 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.