Raccogliere i log di Darktrace
Questo documento spiega come importare i log di Darktrace in Google Security Operations utilizzando l'agente Bindplane.
Darktrace è una piattaforma di cybersicurezza basata sull'AI che rileva minacce e anomalie in tempo reale. Il parser gestisce i log Darktrace formattati in formato CEF e JSON, estraendo i campi e mappandoli al modello Unified Data Model (UDM).
Prima di iniziare
Assicurati di soddisfare i seguenti prerequisiti:
- Un'istanza Google SecOps
- Windows Server 2016 o versioni successive oppure host Linux con
systemd - Connettività di rete tra l'agente Bindplane e l'appliance Darktrace
- Se l'agente viene eseguito dietro un proxy, assicurati che le porte del firewall siano aperte in base ai requisiti dell'agente Bindplane
- Accesso privilegiato alla UI web di Darktrace
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 l'agente 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
Installa l'agente Bindplane sul sistema operativo Windows o Linux seguendo le istruzioni riportate di seguito.
Installazione di Windows
- Apri 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" /quietAttendi il completamento dell'installazione.
Verifica l'installazione eseguendo:
sc query observiq-otel-collectorIl servizio dovrebbe essere visualizzato come IN ESECUZIONE.
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.shAttendi il completamento dell'installazione.
Verifica l'installazione eseguendo:
sudo systemctl status observiq-otel-collectorIl servizio dovrebbe essere visualizzato come attivo (in esecuzione).
Risorse aggiuntive per l'installazione
Per ulteriori opzioni di installazione e risoluzione dei problemi, consulta la guida all'installazione dell'agente Bindplane.
Configura l'agente Bindplane per importare syslog e inviarli a Google SecOps
Individua il file di configurazione
Linux:
sudo nano /etc/bindplane-agent/config.yamlWindows:
notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
Modifica il file di configurazione
Sostituisci l'intero contenuto di
config.yamlcon la seguente configurazione:receivers: tcplog: listen_address: "0.0.0.0:10282" exporters: chronicle/darktrace: compression: gzip creds_file_path: '/etc/bindplane-agent/ingestion-auth.json' customer_id: '<customer_id>' endpoint: malachiteingestion-pa.googleapis.com log_type: DARKTRACE raw_log_field: body service: pipelines: logs/darktrace_to_chronicle: receivers: - tcplog exporters: - chronicle/darktrace
Parametri di configurazione
Sostituisci i seguenti segnaposto:
Configurazione del ricevitore:
listen_address: Indirizzo IP e porta da ascoltare:0.0.0.0per ascoltare su tutte le interfacce (consigliato)- La porta
10282è la porta syslog CEF Darktrace predefinita (regola in base alle esigenze)
Configurazione dell'esportatore:
creds_file_path: percorso completo del file di autenticazione importazione:- Linux:
/etc/bindplane-agent/ingestion-auth.json - Windows:
C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json
- Linux:
customer_id: ID cliente copiato dalla console Google SecOpsendpoint: URL endpoint regionale:- Stati Uniti:
malachiteingestion-pa.googleapis.com - Europa:
europe-malachiteingestion-pa.googleapis.com - Asia:
asia-southeast1-malachiteingestion-pa.googleapis.com - Per un elenco completo, vedi Endpoint regionali.
- Stati Uniti:
Salvare il file di configurazione
- Dopo la modifica, salva il file:
- Linux: premi
Ctrl+O, poiEntere infineCtrl+X. - Windows: fai clic su File > Salva.
- Linux: premi
Riavvia l'agente Bindplane per applicare le modifiche
Per riavviare l'agente Bindplane in Linux, esegui questo comando:
sudo systemctl restart observiq-otel-collectorVerifica che il servizio sia in esecuzione:
sudo systemctl status observiq-otel-collectorControlla i log per individuare eventuali errori:
sudo journalctl -u observiq-otel-collector -f
Per riavviare l'agente Bindplane in Windows, scegli una delle seguenti opzioni:
Prompt dei comandi o PowerShell come amministratore:
net stop observiq-otel-collector && net start observiq-otel-collectorConsole Services:
- Premi
Win+R, digitaservices.msce premi Invio. - Individua observIQ OpenTelemetry Collector.
- Fai clic con il tasto destro del mouse e seleziona Riavvia.
Verifica che il servizio sia in esecuzione:
sc query observiq-otel-collectorControlla i log per individuare eventuali errori:
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
- Premi
Configurare syslog su Darktrace
- Accedi alla UI web di Darktrace.
- Vai ad Amministrazione > Configurazione di sistema.
- Fai clic su Verifica impostazioni avviso.
- Fornisci i seguenti dettagli di configurazione:
- Avvisi Syslog CEF: seleziona True.
- Server Syslog CEF: inserisci l'indirizzo IP di Bindplane.
- Porta server syslog CEF: inserisci il numero di porta di Bindplane (ad esempio,
10282). - Avviso TCP CEF Syslog: seleziona Vero.
- Fai clic su Salva.
Log di esempio Darktrace supportati
SYSLOG + KV (CEF)
{ "acknowledged": false, "commentCount": 0, "pbid": 900000001, "time": 1604055367000, "creationTime": 1604055367000, "model": { "name": "Compromise::Agent Beacon to New Endpoint", "uuid": "dfd6f10b-b91c-4244-9fd5-7c35caf21b33", "description": "A device is initiating multiple connections to a new external endpoint...", "priority": 2, "category": "Informational", "mitre": { "tactics": [ "command-and-control" ], "techniques": [ "T1071.001" ] } }, "triggeredComponents": [ { "time": 1677679818000, "ip": " ", "port": 443, "metric": { "name": "externalconnections" }, "triggeredFilters": [ { "filterType": "Connection hostname", "trigger": { "value": "beacon.external.io" } } ] } ], "score": 0.85, "device": { "did": 90001, "macaddress": " ", "ip": " ", "hostname": "user-laptop-1" } }SYSLOG + JSON
{ "dpi_engine": "dt-sensor-101", "proto": "tcp", "source_ip": " ", "source_port": 51000, "dest_ip": " ", "dest_port": 389, "src": " ", "dst": " ", "details": "AP request: srealm is [TESTDOMAIN.LOCAL], service is [LDAP/DC99.testdomain.local/testdomain.local], ST cipher is [aes256-cts-hmac-sha1-96]", "epochdate": 1690471502.2252, "@host": "log-collector-host", "uid": "ABCDEFGHIJ1234567890", "note": "KERBEROS::App", "@type": "notice" }
Tabella di mappatura UDM
| Campo log | Mappatura UDM | Logic |
|---|---|---|
| darktraceUrl | security_result.url_back_to_product | Il valore viene estratto dal campo darktraceUrl. |
| darktrace_host | observer.hostname | Il valore viene estratto dal campo darktrace_host se non è un indirizzo IP. |
| darktrace_ip | observer.ip | Il valore viene estratto dal campo darktrace_ip. |
| darktrace_user | observer.user.userid | Il valore viene estratto dal campo darktrace_user. |
| descrizione | security_result.summary, metadata.description | Il valore viene estratto dal campo description. |
| device.customFields.DT-AUTO.macaddress | principal.mac | Il valore viene estratto dal campo device.customFields.DT-AUTO.macaddress. |
| device.did | principal.asset.asset_id | Il valore viene estratto dal campo device.did, convertito in una stringa e preceduto da Device ID:. |
| device.firstSeen | principal.asset.first_seen_time | Il valore viene estratto dal campo device.firstSeen, convertito in una stringa e analizzato come timestamp UNIX in millisecondi. |
| device.hostname | principal.hostname, principal.asset.hostname | Il valore viene estratto dal campo device.hostname. |
| device.ip | principal.ip, principal.asset.ip | Il valore viene estratto dal campo device.ip se corrisponde al formato dell'indirizzo IP. |
| device.ips.0.subnet | additional.fields.subnet | Il valore viene estratto dal campo device.ips.0.subnet e preceduto dal prefisso subnet. |
| device.ips.ip | principal.ip, principal.asset.ip | Il valore viene estratto dal campo device.ips.ip per ogni indirizzo IP nell'elenco. |
| device.lastSeen | principal.asset.last_discover_time | Il valore viene estratto dal campo device.lastSeen, convertito in una stringa e analizzato come timestamp UNIX in millisecondi. |
| device.macaddress | principal.mac | Il valore viene estratto dal campo device.macaddress. |
| device.objecttype | principal.asset.type | Se il valore è device, il campo UDM è impostato su WORKSTATION. |
| device.sid | principal.resource.attribute.labels.sid | Il valore viene estratto dal campo device.sid e convertito in una stringa. |
| device.typelabel | principal.resource.attribute.labels.typelabel | Il valore viene estratto dal campo device.typelabel. |
| device.typename | principal.resource.attribute.labels.typename | Il valore viene estratto dal campo device.typename. |
| dst | target.ip, target.asset.ip | Il valore viene estratto dal campo dst. |
| dpt | target.port | Il valore viene estratto dal campo dpt e convertito in un numero intero. |
| dvc | principal.ip, principal.asset.ip | Se il valore di dvc è un indirizzo IP, viene aggiunto al campo UDM. |
| dvchost | principal.hostname, principal.asset.hostname | Il valore viene estratto dal campo dvchost. |
| endpoint | target.url | Il valore viene estratto dal campo endpoint. |
| event_time | metadata.event_timestamp | Il valore viene estratto dal campo event_time e analizzato come timestamp ISO8601. |
| externalId | metadata.product_log_id | Il valore viene estratto dal campo externalId. |
| incidentEventUrl | principal.url | Il valore viene estratto dal campo incidentEventUrl. |
| ip | principal.ip, principal.asset.ip | Il valore viene estratto dal campo ip se corrisponde al formato dell'indirizzo IP. |
| issue_msg | security_result.summary | Il valore viene estratto dal campo issue_msg. |
| messaggio | security_result.description | Il valore viene estratto dal campo message. |
| metodo | network.http.method | Il valore viene estratto dal campo method. |
| model.description | metadata.description | Il valore viene estratto dal campo model.description. |
| model.name | metadata.product_event_type | Il valore viene estratto dal campo model.name. |
| model.now.category | security_result.severity | Se il valore è critical, il campo UDM è impostato su CRITICAL. Se il valore è Informational, il campo UDM è impostato su INFORMATIONAL. Se il valore è Suspicious, il campo UDM è impostato su HIGH e la categoria è impostata su NETWORK_SUSPICIOUS. |
| model.now.description | metadata.description | Il valore viene estratto dal campo model.now.description. |
| model.now.message | security_result.description | Il valore viene estratto dal campo model.now.message. |
| model.now.name | metadata.product_event_type | Il valore viene estratto dal campo model.now.name. |
| model.now.pid | principal.process.pid | Il valore viene estratto dal campo model.now.pid e convertito in una stringa. |
| model.now.uuid | principal.user.userid | Il valore viene estratto dal campo model.now.uuid e il tipo di evento è impostato su USER_UNCATEGORIZED. |
| model.pid | principal.process.pid | Il valore viene estratto dal campo model.pid e convertito in una stringa. |
| model.then.description | principal.resource.attribute.labels.Model Then Description | Il valore viene estratto dal campo model.then.description. |
| model.then.name | principal.resource.attribute.labels.Model Then Name | Il valore viene estratto dal campo model.then.name. |
| model.then.pid | principal.resource.attribute.labels.Model Then Pid | Il valore viene estratto dal campo model.then.pid e convertito in una stringa. |
| model.then.uuid | principal.resource.attribute.labels.Model Then UUID | Il valore viene estratto dal campo model.then.uuid. |
| model.uuid | principal.user.userid | Il valore viene estratto dal campo model.uuid e il tipo di evento è impostato su USER_UNCATEGORIZED. |
| relatedBreaches.0.modelName | security_result.description | Il valore viene estratto dal campo relatedBreaches.0.modelName. |
| punteggio | security_result.priority, security_result.priority_details | Se il valore è compreso tra 0,8 e 1, la priorità è impostata su HIGH_PRIORITY. Se il valore è compreso tra 0,5 e 0,79, la priorità è impostata su MEDIUM_PRIORITY. Se il valore è compreso tra 0 e 0,49, la priorità è impostata su LOW_PRIORITY. I dettagli della priorità sono impostati su Score : seguito dal valore di score convertito in una stringa. |
| gravità | security_result.severity | Se il valore è 2, il campo UDM è impostato su MEDIUM. Se il valore è maggiore di 2, il campo UDM è impostato su HIGH. |
| shost | principal.hostname, principal.asset.hostname | Il valore viene estratto dal campo shost. |
| smac | principal.mac | Il valore viene estratto dal campo smac. |
| src | principal.ip, principal.asset.ip | Il valore viene estratto dal campo src. |
| stato | network.http.response_code | Il valore viene estratto dal campo status e convertito in una stringa. |
| riepilogo | metadata.description | Il valore viene estratto dal campo summary. |
| tempo | Il valore viene estratto dal campo time, convertito in una stringa e analizzato come timestamp UNIX in millisecondi. |
|
| timestamp | Il valore viene estratto dal campo timestamp e analizzato come timestamp ISO8601 o timestamp UNIX in millisecondi. |
|
| titolo | security_result.summary | Il valore viene estratto dal campo title. |
| triggeredComponents.ip | intermediary.ip | Il valore viene estratto dal campo triggeredComponents.ip se corrisponde al formato dell'indirizzo IP. |
| triggeredComponents.port | intermediary.port | Il valore viene estratto dal campo triggeredComponents.port e convertito in un numero intero. |
| nome utente | principal.user.userid | Il valore viene estratto dal campo username. |
| metadata.vendor_name | Imposta su DARKTRACE. |
|
| metadata.product_name | Imposta su DCIP. |
|
| metadata.log_type | Imposta su DARKTRACE. |
|
| network.ip_protocol | Imposta su TCP se issue_msg non contiene UDP. In caso contrario, impostalo su UDP. |
|
| security_result.action | Imposta su BLOCK se status è 401, altrimenti imposta su ALLOW. |
|
| security_result.severity | Imposta su INFORMATIONAL. |
|
| network.application_protocol | Imposta questo valore su HTTP se method non è vuoto. |
|
| metadata.event_type | Imposta questo valore su NETWORK_HTTP se method non è vuoto. Imposta su USER_LOGIN se description contiene logged into \\\\S+ over ssh. Imposta questo valore su NETWORK_CONNECTION se target_ip non è vuoto. In caso contrario, imposta il valore su STATUS_UPDATE. |
|
| extensions.auth.type | Imposta su MACHINE se description contiene logged into \\\\S+ over ssh. |
|
| security_result.category | Imposta su DATA_EXFILTRATION se issue_msg contiene Exfiltration. Imposta su NETWORK_MALICIOUS se issue_msg contiene Compromise. In caso contrario, imposta il valore su NETWORK_SUSPICIOUS. |
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.