Raccogli i log CASB di Symantec CloudSOC
Questo documento spiega come importare i log CASB di Symantec CloudSOC in Google Security Operations utilizzando l'agente Bindplane.
Symantec CloudSOC è un cloud access security broker (CASB) che genera messaggi syslog per l'attività delle applicazioni cloud, le violazioni delle policy DLP, i rilevamenti delle minacce, i risultati dell'ispezione dei contenuti e gli eventi di accesso degli utenti. Il parser estrae i campi dai log formattati in JSON e syslog e li mappa al modello UDM (Unified Data Model).
Prima di iniziare
Assicurati di soddisfare i seguenti prerequisiti:
- Un'istanza Google SecOps
- Windows Server 2016 o versioni successive o host Linux con
systemd - Connettività di rete tra l'agente Bindplane e l'host Symantec CloudSOC
- Se l'esecuzione avviene dietro un proxy, assicurati che le porte del firewall siano aperte in base ai requisiti dell'agente Bindplane
- Accesso amministrativo all'host Symantec CloudSOC
Ottieni le credenziali di Google SecOps per l'agente Bindplane
Per autenticare l'agente Bindplane in Google SecOps, scegli uno dei seguenti metodi:
- Nuovi deployment: utilizza l'API Chronicle (opzione 1).
- Deployment legacy: continua a utilizzare il file di autenticazione dell'acquisizione (opzione 2) fino al ritiro dell'API Ingestion il 20 luglio 2027.
Opzione 1: crea un account di servizio per l'API Chronicle (consigliata)
- Accedi alla Google Cloud console e seleziona il progetto Google Cloud collegato alla tua istanza Google SecOps.
- Vai a IAM e amministrazione > Service account.
- Fai clic su Crea service account.
- Fornisci i seguenti dettagli di configurazione:
- Nome service account: inserisci un nome per l'account (ad esempio
bindplane-ingest). - Descrizione del service account: inserisci una descrizione (ad esempio,
Bindplane agent log ingestion).
- Nome service account: inserisci un nome per l'account (ad esempio
- Fai clic su Crea e continua.
- Nella sezione Concedi a questo account di servizio l'accesso al progetto, fai clic su Seleziona un ruolo e seleziona Chronicle Editor.
- Fai clic su Continua e poi su Fine.
- Fai clic sul account di servizio che hai creato, quindi vai alla scheda Chiavi.
- Fai clic su Aggiungi chiave > Crea nuova chiave.
- Seleziona JSON e fai clic su Crea. Il file della chiave viene scaricato sul tuo computer.
- Salva il file della chiave come
ingestion-auth.jsonnella directory del raccoglitore Bindplane (/opt/observiq-otel-collector/ingestion-auth.jsonsu Linux oC:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.jsonsu Windows) oppure aggiornacreds_file_pathinconfig.yamlin modo che corrisponda al percorso in cui lo salvi. - Vai a IAM e amministrazione > Impostazioni e copia il numero di progetto. Ti servirà per la configurazione dell'esportatore.
Opzione 2: scarica il file di autenticazione dell'acquisizione (legacy)
- Accedi alla console Google SecOps.
- Vai a Impostazioni SIEM > Agenti di raccolta.
- Scarica il file di autenticazione dell'acquisizione.
- Salva il file in modo sicuro sul sistema in cui verrà installato l'agente Bindplane.
Ottieni 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 tuo 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 RUNNING.
Installazione di Linux
- Apri un terminale con privilegi 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 /opt/observiq-otel-collector/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: udplog: listen_address: "0.0.0.0:514" exporters: chronicle/symantec_casb: protocol: https # Region of your instance, for example us, europe, asia-southeast1 location: <LOCATION> # Project number of the Google Cloud project linked to the instance project: '<PROJECT_NUMBER>' compression: gzip creds_file_path: '/opt/observiq-otel-collector/ingestion-auth.json' customer_id: '<customer_id>' endpoint: chronicle.googleapis.com log_type: SYMANTEC_CASB raw_log_field: body service: pipelines: logs/symantec_casb_to_chronicle: receivers: - udplog exporters: - chronicle/symantec_casb
Parametri di configurazione
Sostituisci i seguenti segnaposto:
Configurazione del destinatario:
listen_address: Indirizzo IP e porta da ascoltare:0.0.0.0per ascoltare su tutte le interfacce (consigliato)- La porta
514è la porta syslog standard (richiede l'accesso root su Linux; utilizza1514per l'accesso non root)
Configurazione dell'esportatore:
creds_file_path: percorso completo del file della chiave JSON del account di servizio (opzione 1):- Linux:
/opt/observiq-otel-collector/ingestion-auth.json - Windows:
C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json
- Linux:
customer_id: ID cliente copiato dalla console Google SecOpslocation: sostituisci<LOCATION>con la regione della tua istanza Google SecOps (ad esempious,europeoasia-southeast1). L'esportatore aggiungechronicle.googleapis.comcome prefisso a questo valore. Per l'elenco completo, consulta Endpoint regionali.project: sostituisci<PROJECT_NUMBER>con il numero di progetto da IAM e amministrazione > Impostazioni.endpoint: mantieni l'impostazione suchronicle.googleapis.com.
Esportatore API di importazione legacy
Se utilizzi il file di autenticazione dell'importazione dell'opzione 2, sostituisci il blocco
exporterscon il seguente. Impostacreds_file_pathsul percorso del file di autenticazione dell'acquisizione e, se l'istanza si trova al di fuori degli Stati Uniti, sostituiscimalachiteingestion-pa.googleapis.comcon il tuo endpoint regionale (ad esempio,europe-malachiteingestion-pa.googleapis.com).exporters: chronicle/symantec_casb: compression: gzip creds_file_path: '/opt/observiq-otel-collector/ingestion-auth.json' customer_id: '<customer_id>' endpoint: malachiteingestion-pa.googleapis.com log_type: SYMANTEC_CASB raw_log_field: body
Salva 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 Servizi:
- 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 verificare la presenza di errori:
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
- Premi
Configura syslog in Symantec CloudSOC CASB
- Accedi all'host Symantec CloudSOC.
Esegui questo comando per identificare il logger utilizzato dal sistema:
ls -d /etc/*syslog*Vai alla sezione corrispondente, in base alla risposta:
- syslog.conf: Syslog legacy.
- syslog-ng.conf: Syslog-ng.
Configurazione syslog legacy
Apri il file
syslogd, che in genere si trova nella directory/etc/default:vi /etc/default/syslogdAssicurati che il valore
SYSLOGDcontenga il flag-r:SYSLOGD="-r"Salva il file ed esci dall'editor.
Apri il file
services, in genere situato nella directory/etc:vi /etc/servicesModifica il valore della porta per il servizio syslog:
syslog 514/udpSalva il file ed esci dall'editor.
Apri il file
syslog.conf, che in genere si trova nella directory/etc:vi /etc/syslog.confAggiorna la configurazione per inoltrare tutti i log all'agente Bindplane:
*.* @<BINDPLANE_IP>- Sostituisci
<BINDPLANE_IP>con l'indirizzo IP dell'agente Bindplane.
- Sostituisci
Apri il file
hosts, in genere situato nella directory/etc:vi /etc/hostsCrea una voce DNS locale per l'agente Bindplane:
<BINDPLANE_IP> bindplane_agent_hostSalva il file ed esci dall'editor.
Riavvia il servizio daemon syslog.
Configurazione di Syslog-ng
Apri il file
syslog-ng.conf, che in genere si trova nella directory/etc:vi /etc/syslog-ng.confAggiungi il seguente codice alla fine del file:
destination d_bindplane { udp("<BINDPLANE_IP>" port(514)); }; log { source(s_src); destination(d_bindplane); };- Sostituisci
<BINDPLANE_IP>con l'indirizzo IP dell'agente Bindplane.
- Sostituisci
Apri il file
hosts, in genere situato nella directory/etc:vi /etc/hostsCrea una voce DNS locale per l'agente Bindplane:
<BINDPLANE_IP> bindplane_agent_hostSalva il file ed esci dall'editor.
Riavvia il servizio daemon syslog-ng.
Tabella di mappatura UDM
| Campo log | Mappatura UDM | Logica |
|---|---|---|
_domain |
target.hostname |
Il valore del campo _domain |
_domain |
target.asset.hostname |
Il valore del campo _domain |
_id |
metadata.product_log_id |
Il valore del campo _id |
actions_taken |
security_result.detection_fields[].value |
Il valore del campo actions_taken. La chiave viene generata dinamicamente come Action_ + indice. |
activity_type |
metadata.product_event_type |
Il valore del campo activity_type se product_data.activity_type è vuoto o il valore di product_data.activity_type se non è vuoto. |
collector_device_ip |
principal.ip |
Il valore del campo collector_device_ip, se non Unknown IP. |
collector_device_ip |
principal.asset.ip |
Il valore del campo collector_device_ip, se non Unknown IP. |
collector_device_name |
principal.hostname |
Il valore del campo collector_device_name. |
collector_device_name |
principal.asset.hostname |
Il valore del campo collector_device_name. |
content_checks.dlp.raw_response.contentdetails[].contentBlockId |
security_result.detection_fields[].value |
Il valore di content_checks.dlp.raw_response.contentdetails[].contentBlockId. La chiave viene generata dinamicamente come contentBlockId_ + indice. |
content_checks.dlp.raw_response.contentdetails[].topLevelFileType |
security_result.detection_fields[].value |
Il valore di content_checks.dlp.raw_response.contentdetails[].topLevelFileType. La chiave viene generata dinamicamente come topLevelFileType_ + indice. |
content_checks.dlp.raw_response.requestid |
security_result.detection_fields[].value |
Il valore di content_checks.dlp.raw_response.requestid. Il tasto è Request ID. |
content_checks.dlp.raw_response.responseaction |
security_result.detection_fields[].value |
Il valore di content_checks.dlp.raw_response.responseaction. La chiave è Response Action. |
content_checks.dlp.raw_response.violation[].name |
security_result.detection_fields[].value |
Il valore di content_checks.dlp.raw_response.violation[].name. La chiave viene generata dinamicamente come Violation_Policy_Name_ + indice. |
content_checks.dlp.raw_response.violation[].policyId |
security_result.detection_fields[].value |
Il valore di content_checks.dlp.raw_response.violation[].policyId. La chiave viene generata dinamicamente come Violation_Policy_ID_ + indice. |
content_checks.dlp.updated_timestamp |
additional.fields[].value.string_value |
Il valore di content_checks.dlp.updated_timestamp. Il tasto è Updated TimeStamp. |
content_checks.filename |
target.file.full_path |
Il valore di content_checks.filename. |
content_checks.mimetype |
target.file.mime_type |
Il valore di content_checks.mimetype. |
content_checks.risktype_list[] |
security_result.detection_fields[].value |
Il valore di content_checks.risktype_list[]. La chiave viene generata dinamicamente come RiskType_ + indice. |
content_checks.vba_macros.expressions[].values[].key |
security_result.detection_fields[].key |
Il valore di content_checks.vba_macros.expressions[].values[].key concatenato con gli indici. |
content_checks.vba_macros.expressions[].values[].value |
security_result.detection_fields[].value |
Il valore di content_checks.vba_macros.expressions[].values[].value. |
content_checks.vk_content_iq_violations[] |
security_result.detection_fields[].value |
Il valore di content_checks.vk_content_iq_violations[]. La chiave viene generata dinamicamente come content_violation_ + indice. |
content_checks.vk_dlp_policy_violations[] |
security_result.detection_fields[].value |
Il valore di content_checks.vk_dlp_policy_violations[]. La chiave viene generata dinamicamente come dlp_policy_violation_ + indice. |
content_checks.vk_encryption |
security_result.detection_fields[].value |
Il valore di content_checks.vk_encryption. La chiave è vk_encryption. |
content_checks.vk_glba |
security_result.detection_fields[].value |
Il valore di content_checks.vk_glba. La chiave è vk_glba. |
content_checks.vk_hipaa |
security_result.detection_fields[].value |
Il valore di content_checks.vk_hipaa. Il tasto è vk_hipaa. |
content_checks.vk_pci |
security_result.detection_fields[].value |
Il valore di content_checks.vk_pci. La chiave è vk_pci. |
content_checks.vk_pii |
security_result.detection_fields[].value |
Il valore di content_checks.vk_pii. Il tasto è vk_pii. |
content_checks.vk_source_code |
security_result.detection_fields[].value |
Il valore di content_checks.vk_source_code. Il tasto è vk_source_code. |
content_checks.vk_vba_macros |
security_result.detection_fields[].value |
Il valore di content_checks.vk_vba_macros. Il tasto è vk_vba_macros. |
content_checks.vk_virus |
security_result.detection_fields[].value |
Il valore di content_checks.vk_virus. Il tasto è vk_virus. |
content_checks.violations |
security_result.detection_fields[].value |
Il valore di content_checks.violations. Il tasto è violations. |
created_timestamp |
additional.fields[].value.string_value |
Il valore di created_timestamp. Il tasto è Created TimeStamp. |
date |
metadata.event_timestamp.seconds |
Secondi dall'epoca estratti dal campo date. |
device_ip |
target.ip |
Il valore del campo device_ip, se non Unknown IP. |
device_ip |
target.asset.ip |
Il valore del campo device_ip, se non Unknown IP. |
file_size |
target.file.size |
Il valore di file_size o product_data.file_size se il primo è vuoto. Convertito in numero intero senza segno. |
file_url |
target.file.full_path |
Il valore di product_data.file_url. |
group_name |
target.group.group_display_name |
Il nome visualizzato estratto dal campo group_name. |
hosts[] |
principal.ip |
I valori del campo hosts, separati da virgole. |
inserted_timestamp |
additional.fields[].value.string_value |
Il valore di inserted_timestamp. La chiave è Inserted TimeStamp. |
instance |
principal.hostname |
Il primo valore del campo instance se è un array o il valore del campo instance se è una stringa. |
instance |
principal.asset.hostname |
Il primo valore del campo instance se si tratta di un array o il valore del campo instance se si tratta di una stringa. |
ioi_code |
security_result.summary |
Il valore del campo ioi_code. |
_latency |
security_result.detection_fields[].value |
Il valore del campo _latency. Il tasto è Latency. |
locations |
security_result.detection_fields[].value |
Il valore del campo locations. La chiave è Locations. |
log_name |
intermediary.asset.asset_id |
L'ID log estratto dal campo log_name, con prefisso logid:. |
mailbox_owner |
target.user.userid |
Il valore di product_data.mailbox owner. |
metadata.log_type |
metadata.log_type |
Impostato come hardcoded su SYMANTEC_CASB. |
metadata.product_name |
metadata.product_name |
Impostato come hardcoded su SYMANTEC_CASB. |
metadata.vendor_name |
metadata.vendor_name |
Codificato in modo permanente su SYMANTEC. |
msg |
metadata.description |
Il valore del campo msg o del campo message se msg non è presente. |
name |
security_result.detection_fields[].value |
Il valore del campo name. La chiave è Name. |
object_name |
security_result.detection_fields[].value |
Il valore del campo object_name. La chiave è Object Name. |
object_type |
target.resource.name |
Il valore del campo object_type. |
org_unit |
security_result.detection_fields[].value |
Il valore del campo org_unit. La chiave è org_unit ID. |
policy_action |
security_result.action_details |
Il valore del campo policy_action. |
policy_type |
security_result.detection_fields[].value |
Il valore del campo policy_type. La chiave è policy_type. |
policy_violated |
security_result.detection_fields[].value |
Il valore del campo policy_violated. Il tasto è policy_violated. |
product_data._domain |
target.hostname |
Il valore di product_data._domain. |
product_data._domain |
target.asset.hostname |
Il valore di product_data._domain. |
product_data.activity_type |
metadata.product_event_type |
Il valore di product_data.activity_type. |
product_data.file url |
target.file.full_path |
Il valore di product_data.file url. |
product_data.file_size |
target.file.size |
Il valore di product_data.file_size. |
product_data.group |
target.group.group_display_name |
Il valore di product_data.group. |
product_data.location |
principal.location.country_or_region |
Il valore di product_data.location. |
product_data.logon error |
security_result.summary |
Il valore di product_data.logon error. |
product_data.mailbox owner |
target.user.userid |
Il valore di product_data.mailbox owner. |
product_data.name |
target.file.full_path |
Il valore di product_data.name. |
product_data.object_name |
target.file.full_path |
Il valore di product_data.object_name. |
product_data.originatingserver product_data.service |
target.application |
Il valore di product_data.service. |
product_data.site url |
target.url |
Il valore di product_data.site url. |
product_data.target |
target.user.userid |
Il valore di product_data.target. |
product_data.useragent |
network.http.user_agent |
Il valore di product_data.useragent. |
product_name |
intermediary.application |
Il valore del campo product_name. |
product_uid |
metadata.product_name |
Il valore del campo product_uid. |
responsible_logs |
additional.fields[].value.string_value |
Il valore del campo responsible_logs. Il tasto è responsible_logs. |
resource_id |
target.resource.product_object_id |
Il valore del campo resource_id. |
risks |
security_result.detection_fields[].value |
Il valore del campo risks. Il tasto è Risks. |
security_result.action |
security_result.action |
Derivato da product_data.logon error. Imposta su BLOCK se product_data.logon error è BlockedByConditionalAccess. |
security_result.severity |
security_result.severity |
Il valore in maiuscolo del campo severity, se è uno dei livelli di gravità supportati. |
security_result.severity_details |
security_result.severity_details |
Il valore del campo severity, se non è uno dei livelli di gravità supportati. |
security_result.summary |
security_result.summary |
Il valore del campo ioi_code o product_data.logon error se ioi_code non è presente. |
service |
target.application |
Il valore del campo service se product_data.service è vuoto. |
site_url |
target.url |
Il valore di product_data.site url. |
source |
principal.resource.attribute.labels[].value |
Il valore del campo source. Il tasto è Source. |
sub_feature |
additional.fields[].value.string_value |
Il valore del campo sub_feature. Il tasto è Sub Feature. |
target.application |
target.application |
Derivato in base a product_data.activity_type e alla presenza dell'entità e della destinazione. |
target.resource.name |
target.resource.name |
Derivato in base a product_data.activity_type e alla presenza dell'entità e della destinazione. |
threat_score |
security_result.detection_fields[].value |
Il valore del campo threat_score. La chiave è Threat Score. |
transaction_id |
security_result.detection_fields[].value |
Il valore del campo transaction_id. Il tasto è Transaction ID. |
updated_timestamp |
additional.fields[].value.string_value |
Il valore di updated_timestamp o content_checks.dlp.updated_timestamp se il primo è vuoto. La chiave è Updated TimeStamp. |
user |
principal.user.userid |
Il valore del campo user. |
user_email |
target.user.userid |
Il valore del campo user_email. |
user_mail |
target.user.userid |
Il valore del campo user_mail estratto dal campo msg. |
user_name |
principal.user.user_display_name |
Il valore del campo user_name. |
user_uid |
principal.user.userid o target.user.userid |
Il valore del campo user_uid. Mappato a principal.user.userid se product_data.activity_type non è InvalidLogin o Login, altrimenti mappato a target.user.userid. |
uuid |
intermediary.asset.product_object_id |
Il valore del campo uuid. |
version |
metadata.product_version |
Il valore del campo version. |
user", "user_mail", and "user_uid |
principal.user.email_addresses |
Mappato dal log delle modifiche |
user_email", "mailbox_owner", "product_data.target", and "user_uid |
target.user.email_addresses |
Mappato dal log delle modifiche |
__event_timestamp |
metadata.event_timestamp |
Mappato dal log delle modifiche |
_elastic_timestamp", "created_timestamp", "inserted_timestamp", "updated_timestamp", "responsible_logs" and "sub_feature |
additional.fields |
Mappato dal log delle modifiche |
threat_score", "locations", "transaction_id", "content_checks.dlp.raw_response.requestid", "content_checks.dlp.raw_response.responseaction", "org_unit", "policy_type", "content_checks.vk_pci", "content_checks.vk_vba_macros", "content_checks.vk_glba", "content_checks.vk_source_code", "content_checks.vk_pii", "content_checks.vk_virus", "content_checks.vk_hipaa", "content_checks.violations", "object_name", "multi_user", "risks", "name", "_latency", "content_checks.dlp.raw_response.warning", "content_checks.dlp.raw_response.violation", "content_checks.dlp.raw_response.contentdetails", "content_checks.vk_dlp_policy_violations", "content_checks.risktype_list", "content_checks.vk_content_iq_violations", "actions_taken", "__detect_source", "multi_facility", "content_checks.vba_macros.expressions" and "policy_violated |
security_result.detection_fields |
Mappato dal log delle modifiche |
resource_id |
target.resource.id |
Mappato dal log delle modifiche |
Log delle modifiche
Visualizza il log delle modifiche per questo parser
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.