Raccogliere i log di Symantec VIP Authentication Hub
Questo documento spiega come importare i log di Symantec VIP Authentication Hub in Google Security Operations utilizzando Bindplane. Il codice del parser pulisce e preelabora innanzitutto il messaggio di log di input, convertendo campi specifici e ristrutturando i dati dalle coppie chiave-valore. Poi estrae le informazioni pertinenti da vari campi utilizzando pattern grok e logica condizionale, mappandoli agli attributi corrispondenti all'interno di Unified Data Model (UDM) per una rappresentazione standardizzata degli eventi di sicurezza.
Prima di iniziare
Assicurati di soddisfare i seguenti prerequisiti:
- Istanza Google SecOps
- Host Windows 2016 o versioni successive o Linux con systemd
- Se l'esecuzione avviene tramite un proxy, le porte del firewall sono aperte
- Accesso con privilegi all'hub di autenticazione Symantec VIP
Recuperare il file di autenticazione importazione di Google SecOps
- Accedi alla console Google SecOps.
- Vai a Impostazioni SIEM > Agenti di raccolta.
- Scarica il file di autenticazione importazione. Salva il file in modo sicuro sul sistema in cui verrà installato Bindplane.
Recuperare l'ID cliente Google SecOps
- Accedi alla console Google SecOps.
- Vai a Impostazioni SIEM > Profilo.
- Copia e salva l'ID cliente dalla sezione Dettagli dell'organizzazione.
Installa l'agente Bindplane
Installazione di Windows
- Apri il prompt dei comandi o PowerShell come amministratore.
Esegui questo comando:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
Installazione di Linux
- Apri un terminale con privilegi di root o sudo.
Esegui questo comando:
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
Risorse aggiuntive per l'installazione
Per ulteriori opzioni di installazione, consulta la guida all'installazione.
Configura l'agente Bindplane per importare Syslog e inviarli a Google SecOps
- Accedi al file di configurazione:
- Individua il file
config.yaml
. In genere, si trova nella directory/etc/bindplane-agent/
su Linux o nella directory di installazione su Windows. - Apri il file utilizzando un editor di testo (ad esempio
nano
,vi
o Blocco note).
- Individua il file
Modifica il file
config.yaml
come segue: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
Sostituisci la porta e l'indirizzo IP in base alle esigenze della tua infrastruttura.
Sostituisci
<customer_id>
con l'ID cliente effettivo.Aggiorna
/path/to/ingestion-authentication-file.json
al percorso in cui è stato salvato il file di autenticazione nella sezione Recupera il file di autenticazione per l'importazione di Google SecOps.
Riavvia l'agente Bindplane per applicare le modifiche
Per riavviare l'agente Bindplane in Linux, esegui questo comando:
sudo systemctl restart bindplane-agent
Per riavviare l'agente Bindplane in Windows, puoi utilizzare la console Servizi o inserire il seguente comando:
net stop BindPlaneAgent && net start BindPlaneAgent
Configurare Syslog in Symantec VIP Authentication Hub
- Accedi alla UI web di Symantec VIP Gateway.
- Vai a Log > Configurazione Syslog.
- Se stai configurando Syslog per la prima volta, ti viene chiesto di configurare le impostazioni di Syslog. Seleziona Sì.
- Se hai già configurato Syslog, fai clic su Modifica in fondo alla pagina.
- Fornisci i seguenti dettagli di configurazione:
- Syslog Facility: seleziona LOG_LOCAL0.
- Host syslog: inserisci l'indirizzo IP dell'agente Bindplane.
- Porta Syslog: inserisci il numero di porta dell'agente Bindplane (ad esempio,
514
per UDP).
- Fai clic su Salva.
- Vai a Provider identità > Configurazione del portale self-service.
- Modifica i seguenti dettagli della configurazione:
- Livello di logging: seleziona Informazioni.
- Enable Syslog (Attiva Syslog): seleziona Yes (Sì).
- Fai clic su Invia.
- Vai a Provider identità > Configurazione dell'autenticazione di VIP Manager.
- Modifica i seguenti dettagli della configurazione:
- Livello di logging: seleziona Informazioni.
- Enable Syslog (Attiva Syslog): seleziona Yes (Sì).
- Fai clic su Invia.
- Vai a User Store > Sincronizzazione directory LDAP.
- Modifica i seguenti dettagli della configurazione:
- Livello di log: seleziona Informazioni.
- Enable Syslog (Attiva Syslog): seleziona Yes (Sì).
- Fai clic su Invia.
Tabella di mappatura UDM
Campo log | Mappatura UDM | Logic |
---|---|---|
/auth/v1/authenticate |
security_result.detection_fields[].value |
Il valore viene estratto dal campo /auth/v1/authenticate nel log non elaborato e assegnato a un oggetto security_result.detection_fields con la chiave api . |
__isAuditIdLcmIdStore |
additional.fields[].value.string_value |
Il valore viene estratto dal campo __isAuditIdLcmIdStore nel log non elaborato e assegnato a un oggetto additional.fields con la chiave __isAuditIdLcmIdStore . |
accessTokenScopes |
security_result.detection_fields[].value |
Il valore viene estratto dal campo accessTokenScopes nel log non elaborato e assegnato a un oggetto security_result.detection_fields con la chiave accessTokenScopes . |
accessTokenTid |
security_result.detection_fields[].value |
Il valore viene estratto dal campo accessTokenTid nel log non elaborato e assegnato a un oggetto security_result.detection_fields con la chiave accessTokenTid . |
api |
security_result.detection_fields[].value |
Il valore viene estratto dal campo api nel log non elaborato e assegnato a un oggetto security_result.detection_fields con la chiave api . |
appId |
additional.fields[].value.string_value |
Il valore viene estratto dal campo appId nel log non elaborato e assegnato a un oggetto additional.fields con la chiave appId . |
appName |
principal.application |
Il valore viene estratto dal campo appName nel log non elaborato. |
azpName |
additional.fields[].value.string_value |
Il valore viene estratto dal campo azpName nel log non elaborato e assegnato a un oggetto additional.fields con la chiave azpName . |
bytes_sent |
network.sent_bytes |
Il valore viene estratto dal campo bytes_sent nel log non elaborato. |
client |
principal.asset.ip , principal.ip |
L'indirizzo IP viene estratto dal campo client nel log non elaborato utilizzando un pattern grok e aggiunto ai campi principal.ip e principal.asset.ip . |
clientId |
additional.fields[].value.string_value , principal.user.userid |
Il valore viene estratto dal campo clientId nel log non elaborato e assegnato a un oggetto additional.fields con la chiave clientId . Se il campo clientId non è vuoto, viene utilizzato anche per compilare il campo principal.user.userid . |
clientIp |
principal.asset.ip , principal.ip |
Il valore viene estratto dal campo clientIp nel log non elaborato e aggiunto ai campi principal.ip e principal.asset.ip . |
clientTid |
additional.fields[].value.string_value |
Il valore viene estratto dal campo clientTid nel log non elaborato e assegnato a un oggetto additional.fields con la chiave clientTid . |
clientTxnId |
additional.fields[].value.string_value |
Il valore viene estratto dal campo clientTxnId nel log non elaborato e assegnato a un oggetto additional.fields con la chiave clientTxnId . |
contentType |
additional.fields[].value.string_value |
Il valore viene estratto dal campo contentType nel log non elaborato e assegnato a un oggetto additional.fields con la chiave contentType . |
countryISO |
principal.location.country_or_region |
Il valore viene estratto dal campo countryISO nel log non elaborato. |
eventId |
metadata.product_event_type |
Il valore viene estratto dal campo eventId nel log non elaborato. |
flowStateId |
additional.fields[].value.string_value |
Il valore viene estratto dal campo flowStateId nel log non elaborato e assegnato a un oggetto additional.fields con la chiave flowStateId . |
geo.city_name |
principal.location.city |
Il valore viene estratto dal campo geo.city_name nel log non elaborato. |
geo.country_name |
principal.location.country_or_region |
Il valore viene estratto dal campo geo.country_name nel log non elaborato. |
geo.location.lat |
principal.location.region_coordinates.latitude |
Il valore viene estratto dal campo geo.location.lat nel log non elaborato, convertito in un numero in virgola mobile e rinominato in principal.location.region_coordinates.latitude . |
geo.location.lon |
principal.location.region_coordinates.longitude |
Il valore viene estratto dal campo geo.location.lon nel log non elaborato, convertito in un numero in virgola mobile e rinominato in principal.location.region_coordinates.longitude . |
guid |
metadata.product_log_id |
Il valore viene estratto dal campo guid nel log non elaborato. |
host |
principal.asset.hostname , principal.hostname |
Il valore viene estratto dal campo host nel log non elaborato, privato di eventuali virgolette e aggiunto ai campi principal.hostname e principal.asset.hostname . |
httpMethod |
network.http.method |
Il valore viene estratto dal campo httpMethod nel log non elaborato. |
httpReferrer |
network.http.referral_url |
Il valore viene estratto dal campo httpReferrer nel log non elaborato. |
identitySourceId |
additional.fields[].value.string_value |
Il valore viene estratto dal campo identitySourceId nel log non elaborato e assegnato a un oggetto additional.fields con la chiave identitySourceId . |
internal-user-sync-ext-resourceGuid |
target.user.userid |
Il valore viene estratto dal campo internal-user-sync-ext-resourceGuid nel log non elaborato. |
internal-user-sync-ext-resourceName |
target.user.email_addresses |
Il valore viene estratto dal campo internal-user-sync-ext-resourceName nel log non elaborato e aggiunto al campo target.user.email_addresses . |
issuerUrl |
target.url |
Il valore viene estratto dal campo issuerUrl nel log non elaborato. |
kubernetes.annotations.cni.projectcalico.org_containerID |
target.resource.product_object_id |
Il valore viene estratto dal campo kubernetes.annotations.cni.projectcalico.org_containerID nel log non elaborato. |
kubernetes.annotations.cni.projectcalico.org_podIP |
target.resource.attribute.labels[].value |
Il valore viene estratto dal campo kubernetes.annotations.cni.projectcalico.org_podIP nel log non elaborato e assegnato a un oggetto target.resource.attribute.labels con la chiave podIP . |
kubernetes.annotations.cni.projectcalico.org_podIPs |
target.resource.attribute.labels[].value |
Il valore viene estratto dal campo kubernetes.annotations.cni.projectcalico.org_podIPs nel log non elaborato e assegnato a un oggetto target.resource.attribute.labels con la chiave podIPs . |
kubernetes.container_hash |
target.resource.attribute.labels[].value |
Il valore viene estratto dal campo kubernetes.container_hash nel log non elaborato e assegnato a un oggetto target.resource.attribute.labels con la chiave container_hash . |
kubernetes.container_image |
target.resource.attribute.labels[].value |
Il valore viene estratto dal campo kubernetes.container_image nel log non elaborato e assegnato a un oggetto target.resource.attribute.labels con la chiave container_image . |
kubernetes.container_name |
target.resource.attribute.labels[].value |
Il valore viene estratto dal campo kubernetes.container_name nel log non elaborato e assegnato a un oggetto target.resource.attribute.labels con la chiave container_name . |
kubernetes.docker_id |
target.resource.attribute.labels[].value |
Il valore viene estratto dal campo kubernetes.docker_id nel log non elaborato e assegnato a un oggetto target.resource.attribute.labels con la chiave docker_id . |
kubernetes.host |
principal.asset.hostname , principal.hostname |
Il valore viene estratto dal campo kubernetes.host nel log non elaborato e aggiunto ai campi principal.hostname e principal.asset.hostname . |
kubernetes.labels.app |
Questo campo non è mappato all'oggetto IDM nell'UDM. | |
kubernetes.labels.app.kubernetes.io/component |
target.resource.attribute.labels[].value |
Il valore viene estratto dal campo kubernetes.labels.app.kubernetes.io/component nel log non elaborato e assegnato a un oggetto target.resource.attribute.labels con la chiave io_component . |
kubernetes.labels.app.kubernetes.io/instance |
target.resource.attribute.labels[].value |
Il valore viene estratto dal campo kubernetes.labels.app.kubernetes.io/instance nel log non elaborato e assegnato a un oggetto target.resource.attribute.labels con la chiave io_instance . |
kubernetes.labels.app.kubernetes.io/managed-by |
target.resource.attribute.labels[].value |
Il valore viene estratto dal campo kubernetes.labels.app.kubernetes.io/managed-by nel log non elaborato e assegnato a un oggetto target.resource.attribute.labels con la chiave io_managed-by . |
kubernetes.labels.app.kubernetes.io/name |
target.resource.attribute.labels[].value |
Il valore viene estratto dal campo kubernetes.labels.app.kubernetes.io/name nel log non elaborato e assegnato a un oggetto target.resource.attribute.labels con la chiave io_name . |
kubernetes.labels.app.kubernetes.io/part-of |
target.resource.attribute.labels[].value |
Il valore viene estratto dal campo kubernetes.labels.app.kubernetes.io/part-of nel log non elaborato e assegnato a un oggetto target.resource.attribute.labels con la chiave io_part-of . |
kubernetes.labels.app.kubernetes.io/version |
target.resource.attribute.labels[].value |
Il valore viene estratto dal campo kubernetes.labels.app.kubernetes.io/version nel log non elaborato e assegnato a un oggetto target.resource.attribute.labels con la chiave io_version . |
kubernetes.labels.helm.sh/chart |
target.resource.attribute.labels[].value |
Il valore viene estratto dal campo kubernetes.labels.helm.sh/chart nel log non elaborato e assegnato a un oggetto target.resource.attribute.labels con la chiave helm_sh_chart . |
kubernetes.labels.helmChartName |
target.resource.attribute.labels[].value |
Il valore viene estratto dal campo kubernetes.labels.helmChartName nel log non elaborato e assegnato a un oggetto target.resource.attribute.labels con la chiave helmChartName . |
kubernetes.labels.imageTag |
target.resource.attribute.labels[].value |
Il valore viene estratto dal campo kubernetes.labels.imageTag nel log non elaborato e assegnato a un oggetto target.resource.attribute.labels con la chiave imageTag . |
kubernetes.labels.pod-template-hash |
target.resource.attribute.labels[].value |
Il valore viene estratto dal campo kubernetes.labels.pod-template-hash nel log non elaborato e assegnato a un oggetto target.resource.attribute.labels con la chiave pod-template-hash . |
kubernetes.namespace_name |
target.resource.attribute.labels[].value |
Il valore viene estratto dal campo kubernetes.namespace_name nel log non elaborato e assegnato a un oggetto target.resource.attribute.labels con la chiave namespace_name . |
kubernetes.pod_id |
target.resource.attribute.labels[].value |
Il valore viene estratto dal campo kubernetes.pod_id nel log non elaborato e assegnato a un oggetto target.resource.attribute.labels con la chiave pod_id . |
kubernetes.pod_name |
target.resource.attribute.labels[].value |
Il valore viene estratto dal campo kubernetes.pod_name nel log non elaborato e assegnato a un oggetto target.resource.attribute.labels con la chiave pod_name . |
level |
security_result.severity |
Se il campo level nel log non elaborato corrisponde a notice o info (senza distinzione tra maiuscole e minuscole), il campo security_result.severity viene impostato su INFORMATIONAL . |
log |
security_result.description , level , kv_data |
I campi level e kv_data vengono estratti dal campo log nel log non elaborato utilizzando un pattern grok. Il campo security_result.description viene compilato con l'intero campo log . |
logtag |
additional.fields[].value.string_value |
Il valore viene estratto dal campo logtag nel log non elaborato e assegnato a un oggetto additional.fields con la chiave logtag . |
method |
network.http.method |
Il valore viene estratto dal campo method nel log non elaborato. |
msg |
metadata.event_type , security_result.description |
Il valore viene estratto dal campo msg nel log non elaborato e utilizzato per compilare il campo security_result.description . Il campo metadata.event_type è determinato in base ai contenuti del campo msg : * USER_CREATION se msg contiene Internal user created or updated . * USER_LOGIN se msg contiene Authorization Initiated Succesfully , Authentication Initiated Successfully o Authentication Successful . * USER_RESOURCE_ACCESS se msg contiene Token Generated o token verified . * NETWORK_CONNECTION se sia has_principal che has_target sono true. * STATUS_UPDATE se has_principal è true. * GENERIC_EVENT altrimenti. |
path |
principal.file.full_path |
Il valore viene estratto dal campo path nel log non elaborato. |
principalId |
additional.fields[].value.string_value , principal.user.userid |
Il valore viene estratto dal campo principalId nel log non elaborato e assegnato a un oggetto additional.fields con la chiave principalId . Se il campo principalId non è clientId e non è vuoto, viene utilizzato anche per compilare il campo principal.user.userid . |
principalType |
additional.fields[].value.string_value |
Il valore viene estratto dal campo principalType nel log non elaborato e assegnato a un oggetto additional.fields con la chiave principalType . |
protocol |
network.application_protocol |
Se il campo protocol nel log non elaborato corrisponde a HTTP (senza distinzione tra maiuscole e minuscole), il campo network.application_protocol viene impostato su HTTP . |
referrer |
network.http.referral_url |
Il valore viene estratto dal campo referrer nel log non elaborato, privato di eventuali virgolette e assegnato al campo network.http.referral_url . |
relVersion |
metadata.product_version |
Il valore viene estratto dal campo relVersion nel log non elaborato. |
remoteAddr |
additional.fields[].value.string_value |
Il valore viene estratto dal campo remoteAddr nel log non elaborato e assegnato a un oggetto additional.fields con la chiave remoteAddr . |
requestId |
additional.fields[].value.string_value |
Il valore viene estratto dal campo requestId nel log non elaborato e assegnato a un oggetto additional.fields con la chiave requestId . |
requestTime |
additional.fields[].value.string_value |
Il valore viene estratto dal campo requestTime nel log non elaborato e assegnato a un oggetto additional.fields con la chiave requestTime . |
responseCode |
network.http.response_code |
Il valore numerico viene estratto dal campo responseCode nel log non elaborato utilizzando un pattern grok, convertito in un numero intero e assegnato al campo network.http.response_code . |
request |
method , path , protocol |
I campi method , path e protocol vengono estratti dal campo request nel log non elaborato utilizzando un pattern grok dopo aver rimosso le virgolette. |
server |
target.asset.hostname , target.hostname |
Il valore viene estratto dal campo server nel log non elaborato e aggiunto ai campi target.hostname e target.asset.hostname . |
service |
additional.fields[].value.string_value |
Il valore viene estratto dal campo service nel log non elaborato e assegnato a un oggetto additional.fields con la chiave service . |
status |
network.http.response_code |
Il valore viene estratto dal campo status nel log non elaborato, convertito in un numero intero e assegnato al campo network.http.response_code . |
stream |
additional.fields[].value.string_value |
Il valore viene estratto dal campo stream nel log non elaborato e assegnato a un oggetto additional.fields con la chiave stream . |
sub |
additional.fields[].value.string_value |
Il valore viene estratto dal campo sub nel log non elaborato e assegnato a un oggetto additional.fields con la chiave sub . |
subType |
additional.fields[].value.string_value |
Il valore viene estratto dal campo subType nel log non elaborato e assegnato a un oggetto additional.fields con la chiave subType . |
tid |
additional.fields[].value.string_value |
Il valore viene estratto dal campo tid nel log non elaborato e assegnato a un oggetto additional.fields con la chiave tid . |
timestamp |
metadata.event_timestamp |
Il valore viene estratto dal campo timestamp nel log non elaborato e analizzato come timestamp ISO8601. |
tname |
additional.fields[].value.string_value |
Il valore viene estratto dal campo tname nel log non elaborato e assegnato a un oggetto additional.fields con la chiave tname . |
txnId |
additional.fields[].value.string_value |
Il valore viene estratto dal campo txnId nel log non elaborato e assegnato a un oggetto additional.fields con la chiave txnId . |
type |
additional.fields[].value.string_value |
Il valore viene estratto dal campo type nel log non elaborato e assegnato a un oggetto additional.fields con la chiave type . |
userAgent |
network.http.parsed_user_agent , network.http.user_agent |
Il valore viene estratto dal campo userAgent nel log non elaborato e assegnato ai campi network.http.user_agent e network.http.parsed_user_agent . Il campo network.http.parsed_user_agent viene quindi convertito in un oggetto user agent analizzato. |
userDN |
additional.fields[].value.string_value |
Il valore viene estratto dal campo userDN nel log non elaborato e assegnato a un oggetto additional.fields con la chiave userDN . |
userGuid |
additional.fields[].value.string_value |
Il valore viene estratto dal campo userGuid nel log non elaborato e assegnato a un oggetto additional.fields con la chiave userGuid . |
userIdpGuid |
additional.fields[].value.string_value |
Il valore viene estratto dal campo userIdpGuid nel log non elaborato e assegnato a un oggetto additional.fields con la chiave userIdpGuid . |
userIP |
principal.asset.ip , principal.ip , target.asset.ip , target.ip , intermediary.ip |
Gli indirizzi IP vengono estratti dal campo userIP nel log non elaborato utilizzando un pattern grok. Il primo indirizzo IP viene aggiunto ai campi principal.ip e principal.asset.ip . Il secondo indirizzo IP viene aggiunto ai campi target.ip e target.asset.ip . Il terzo indirizzo IP viene aggiunto al campo intermediary.ip . |
userLoginId |
target.user.email_addresses |
Se il campo userLoginId nel log non elaborato non è vuoto e corrisponde a un pattern di indirizzo email, viene aggiunto al campo target.user.email_addresses . |
userLoginIdAttributeMappingName |
target.user.user_display_name |
Il valore viene estratto dal campo userLoginIdAttributeMappingName nel log non elaborato. |
userRiskLevel |
additional.fields[].value.string_value |
Il valore viene estratto dal campo userRiskLevel nel log non elaborato e assegnato a un oggetto additional.fields con la chiave userRiskLevel . |
userRiskScore |
additional.fields[].value.string_value |
Il valore viene estratto dal campo userRiskScore nel log non elaborato e assegnato a un oggetto additional.fields con la chiave userRiskScore . |
userIp |
principal.asset.ip , principal.ip |
Il valore viene estratto dal campo userIp nel log non elaborato e aggiunto ai campi principal.ip e principal.asset.ip . |
userUniversalId |
additional.fields[].value.string_value |
Il valore viene estratto dal campo userUniversalId nel log non elaborato e assegnato a un oggetto additional.fields con la chiave userUniversalId . |
vhost |
additional.fields[].value.string_value |
Il valore viene estratto dal campo vhost nel log non elaborato e assegnato a un oggetto additional.fields con la chiave vhost . |
N/D | extensions.auth.type |
Il valore è impostato su SSO se il campo metadata.event_type è USER_LOGIN . |
N/D | metadata.log_type |
Il valore è impostato su SYMANTEC_VIP_AUTHHUB . |
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.