Raccogliere i log di Ivanti Connect Secure (Pulse Secure)
Questo documento spiega come importare i log di Ivanti Connect Secure (Pulse Secure) in Google Security Operations utilizzando Bindplane.
Ivanti Connect Secure (in precedenza Pulse Secure) è una soluzione VPN SSL che fornisce un accesso remoto sicuro ad applicazioni, risorse e reti aziendali. Supporta l'autenticazione a più fattori, il controllo della conformità degli endpoint e criteri di accesso granulari per i partner e i lavoratori da remoto. Nota: Pulse Secure è stata acquisita da Ivanti nel 2020. L'analizzatore sintattico estrae i campi dai log formattati syslog della VPN Pulse Secure. Utilizza grok per analizzare il messaggio di log e quindi mappa questi valori al modello UDM (Unified Data Model). Imposta anche i valori predefiniti dei metadati per l'origine e il tipo di evento.
Prima di iniziare
Assicurati di soddisfare i seguenti prerequisiti:
- Un'istanza Google SecOps
- Windows Server 2016 o versioni successive oppure host Linux con
systemd - Se l'agente viene eseguito dietro un proxy, assicurati che le porte del firewall siano aperte in base ai requisiti dell'agente Bindplane
- Accesso con privilegi alla console di amministrazione di Ivanti Connect Secure (Pulse Secure)
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
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 il comando:
sc query observiq-otel-collector
Il 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 il comando:
sudo systemctl status observiq-otel-collector
Il 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: udplog: listen_address: "0.0.0.0:514" exporters: chronicle/chronicle_w_labels: compression: gzip creds_file_path: '/path/to/ingestion-authentication-file.json' customer_id: 'YOUR_CUSTOMER_ID' endpoint: malachiteingestion-pa.googleapis.com log_type: 'PULSE_SECURE_VPN' raw_log_field: body ingestion_labels: service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - udplog exporters: - chronicle/chronicle_w_labels
Parametri di configurazione
Sostituisci i seguenti segnaposto:
Configurazione del ricevitore:
udplog: utilizzaudplogper syslog UDP otcplogper syslog TCP0.0.0.0: indirizzo IP su cui ascoltare (0.0.0.0per ascoltare su tutte le interfacce)514: Numero di porta su cui ascoltare (porta syslog standard)
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:
YOUR_CUSTOMER_ID: l'ID cliente della sezione Recupera ID clienteendpoint: URL endpoint regionale:- Stati Uniti:
malachiteingestion-pa.googleapis.com - Europa:
europe-malachiteingestion-pa.googleapis.com - Asia:
asia-southeast1-malachiteingestion-pa.googleapis.com - Per l'elenco completo, vedi Endpoint regionali.
- Stati Uniti:
log_type: Tipo di log esattamente come appare in Chronicle (PULSE_SECURE_VPN)
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 dei 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 individuare eventuali errori:
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
- Premi
Configurare l'inoltro di Syslog su Ivanti Connect Secure (Pulse Secure)
- Accedi alla console di amministrazione di Ivanti Connect Secure (in precedenza Pulse Secure).
- Vai a Sistema > Log/Monitoraggio > Server Syslog.
- Fai clic su Nuovo server per aggiungere un server syslog.
- Fornisci i seguenti dettagli di configurazione:
- Nome/IP del server: inserisci l'indirizzo IP dell'host dell'agente Bindplane.
- Porta server: inserisci
514. - Struttura: seleziona LOCAL0 (o la struttura che preferisci).
- Tipo: seleziona UDP.
- Nella sezione Filtro eventi, seleziona i tipi di eventi da inoltrare:
- Standard: per il formato syslog standard
- Seleziona le categorie di log:
- Eventi: seleziona Log di accesso utente, Log amministrativi, Eventi sensore.
- Livelli di gravità: seleziona Informazioni e livelli superiori per una registrazione completa.
- Fai clic su Salva modifiche.
- Verifica che i messaggi syslog vengano inviati controllando i log dell'agente Bindplane.
Tabella di mappatura UDM
| Campo log | Mappatura UDM | Logic |
|---|---|---|
| azione | security_result.action_details | Mappato direttamente dal campo Azione. |
| applicazione | principal.application | Mappato direttamente dal campo dell'applicazione. |
| bytes_read | network.received_bytes | Mappato direttamente dal campo bytes_read e convertito in numero intero senza segno. |
| bytes_written | network.sent_bytes | Mappato direttamente dal campo bytes_written e convertito in numero intero senza segno. |
| client_host | principal.hostname, principal.asset.hostname | Mappato direttamente dal campo client_host. |
| cmd | principal.process.command_line | Mappato direttamente dal campo cmd. |
| connection_status | security_result.detection_fields.value.string_value | Mappato direttamente dal campo connection_status. |
| data_time | metadata.event_timestamp.seconds | Analizzato dal campo data_time utilizzando vari formati di timestamp (MM-gg-aaaa HH:mm:ss Z, RFC 3339, ISO8601, MMM d HH:mm:ss, MMM d HH:mm:ss). |
| devname | principal.hostname, principal.asset.hostname | Mappato direttamente dal campo devname. |
| dstip | target.ip, target.asset.ip | Mappato direttamente dal campo dstip. |
| dstport | target.port | Mappato direttamente dal campo dstport e convertito in numero intero. |
| dstcountry | target.location.country_or_region | Mappato direttamente dal campo dstcountry se non è "Reserved" o vuoto. |
| duration | network.session_duration.seconds | Mappato direttamente dal campo della durata e convertito in numero intero. |
| dvc | intermediary.hostname o intermediary.ip | Se il campo dvc può essere convertito in un indirizzo IP, viene mappato a intermediary.ip. In caso contrario, viene mappato su intermediary.hostname. |
| dvc_hostname | intermediary.hostname, principal.hostname, principal.asset.hostname o intermediary.ip, principal.ip, principal.asset.ip | Se il campo dvc_hostname può essere convertito in un indirizzo IP, viene mappato ai rispettivi campi IP. In caso contrario, viene mappato ai rispettivi campi del nome host. |
| event_type | metadata.product_event_type | Mappato direttamente dal campo event_type. |
| failure_reason | security_result.description | Mappato direttamente dal campo failure_reason. Se il messaggio contiene "perché host", il testo "host" viene anteposto al motivo dell'errore. |
| has_principal | event.idm.read_only_udm.principal (presenza) | Impostato su "true" se uno dei campi dell'entità è compilato, su "false" in caso contrario. Derivato dalla logica del parser. |
| has_target | event.idm.read_only_udm.target (presenza) | Impostato su "true" se uno dei campi target è compilato, "false" in caso contrario. Derivato dalla logica del parser. |
| has_target_user | event.idm.read_only_udm.target.user.userid (presenza) | Impostato su "true" se target.user.userid è compilato, "false" in caso contrario. Derivato dalla logica del parser. |
| host_ip | principal.ip, principal.asset.ip | Mappato direttamente dal campo host_ip. |
| host_mac | principal.mac | Mappato direttamente dal campo host_mac, sostituendo i trattini con i due punti. |
| http_method | network.http.method | Mappato direttamente dal campo http_method. |
| http_response | network.http.response_code | Mappato direttamente dal campo http_response e convertito in numero intero. |
| info_desc | about.labels.value | Mappato direttamente dal campo info_desc. |
| ip_new | target.ip, target.asset.ip | Mappato direttamente dal campo ip_new. |
| livello | security_result.severity, security_result.severity_details | security_result.severity deriva dal campo level ("error"/"warning" -> HIGH, "notice" -> MEDIUM, "information"/"info" -> LOW). Il valore non elaborato del livello viene mappato anche su security_result.severity_details. |
| logid | metadata.product_log_id | Mappato direttamente dal campo logid. |
| locip | principal.ip, principal.asset.ip | Mappato direttamente dal campo locip. |
| messaggio | metadata.description | Utilizzato per estrarre vari campi utilizzando i filtri grok e kv. Se il messaggio contiene "EventID", viene elaborato come log eventi di Windows. |
| message_info | metadata.description | Mappato direttamente a metadata.description se non utilizzato in altri pattern grok più specifici. |
| msg | metadata.product_event_type, metadata.description | Se il campo msg è presente, il tipo di prodotto viene estratto e mappato a metadata.product_event_type, mentre il messaggio rimanente viene mappato a metadata.description. |
| msg_hostname | principal.hostname, principal.asset.hostname | Mappato direttamente dal campo msg_hostname. |
| msg_ip | principal.ip, principal.asset.ip | Mappato direttamente dal campo msg_ip. |
| msg_user_agent | network.http.user_agent, network.http.parsed_user_agent, metadata.product_version | La stringa user agent è mappata a network.http.user_agent, l'user agent analizzato è mappato a network.http.parsed_user_agent e la versione del prodotto (se presente) è mappata a metadata.product_version. |
| network_duration | network.session_duration.seconds | Mappato direttamente dal campo network_duration e convertito in numero intero. |
| policyid | security_result.rule_id | Mappato direttamente dal campo policyid. |
| policyname | security_result.rule_name | Mappato direttamente dal campo policyname. |
| policytype | security_result.rule_type | Mappato direttamente dal campo policytype. |
| priority_code | about.labels.value | Mappato direttamente dal campo priority_code e utilizzato anche per derivare about.labels.value per la chiave "Severity" (vedi Logica). |
| prod_name | metadata.product_name | Mappato direttamente dal campo prod_name. |
| product_type | metadata.product_event_type | Mappato direttamente dal campo product_type. |
| product_version | metadata.product_version | Mappato direttamente dal campo product_version. |
| proto | network.ip_protocol | Mappato a network.ip_protocol dopo la conversione in un nome di protocollo IP utilizzando una ricerca. |
| pwd | principal.process.file.full_path | Mappato direttamente dal campo pwd. |
| realm | principal.group.attribute.labels.value | Mappato direttamente dal campo Realm. |
| rcvdbyte | network.received_bytes | Mappato direttamente dal campo rcvdbyte e convertito in numero intero senza segno. |
| remip | target.ip | Mappato direttamente dal campo remip. |
| resource_name | target.resource.name | Mappato direttamente dal campo resource_name dopo la rimozione di spazi vuoti e trattini iniziali e finali. |
| resource_status | security_result.description | Mappato direttamente dal campo resource_status. |
| resource_user_group | principal.user.group_identifiers | Mappato direttamente dal campo resource_user_group. |
| resource_user_name | principal.user.userid | Mappato direttamente dal campo resource_user_name. |
| ruoli | principal.user.group_identifiers | Mappato direttamente dal campo dei ruoli. |
| sentbyte | network.sent_bytes | Mappato direttamente dal campo sentbyte e convertito in numero intero senza segno. |
| session_id | network.session_id | Mappato direttamente dal campo session_id. |
| sessionid | network.session_id | Mappato direttamente dal campo sessionid. |
| srcip | principal.ip, principal.asset.ip | Mappato direttamente dal campo srcip. |
| srcport | principal.port | Mappato direttamente dal campo srcport e convertito in numero intero. |
| srccountry | principal.location.country_or_region | Mappato direttamente dal campo srccountry se non è "Reserved" o vuoto. |
| sottotipo | metadata.product_event_type | Utilizzato in combinazione con type per formare metadata.product_event_type. |
| target_file | target.file.full_path | Mappato direttamente dal campo target_file. |
| target_host | target.hostname, target.asset.hostname | Mappato direttamente dal campo target_host. |
| target_ip | target.ip, target.asset.ip | Mappato direttamente dal campo target_ip. |
| target_port | target.port | Mappato direttamente dal campo target_port e convertito in numero intero. |
| target_url | target.url | Mappato direttamente dal campo target_url. |
| tempo | metadata.event_timestamp.seconds | Analizzato dal campo ora utilizzando il formato "aaaa-MM-gg HH:mm:ss". |
| tipo | metadata.product_event_type | Utilizzato insieme al sottotipo per formare metadata.product_event_type. |
| u_event_source_ip | principal.ip, principal.asset.ip o target.ip | Se sono presenti target_ip o target_host, u_event_source_ip viene mappato a principal.ip e principal.asset.ip. In caso contrario, se target_ip, target_host e target_url sono tutti vuoti, u_event_source_ip viene mappato a target.ip. |
| u_observer_ip | observer.ip | Mappato direttamente dal campo u_observer_ip. |
| u_prin_ip | principal.ip, principal.asset.ip | Mappato direttamente dal campo u_prin_ip. |
| utente | target.user.userid | Mappato direttamente dal campo utente. |
| user_agent | network.http.user_agent, network.http.parsed_user_agent | La stringa user agent è mappata a network.http.user_agent e l'user agent analizzato è mappato a network.http.parsed_user_agent. |
| user_group_identifier | target.user.group_identifiers o principal.user.group_identifiers | Mappato a target.user.group_identifiers nella maggior parte dei casi. Mappato a principal.user.group_identifiers negli eventi Modifica IP (USER_UNCATEGORIZED) e Restrizioni del realm. |
| user_ip | principal.ip, principal.asset.ip | Mappato direttamente dal campo user_ip. Se è vuoto e u_event_source_ip non è vuoto, prende il valore di u_event_source_ip. |
| nome utente | principal.user.userid o target.user.userid | Mappato a principal.user.userid nella maggior parte dei casi. Mappato su target.user.userid in alcuni scenari specifici (ad es. quando detect_user_logout_failed è false e detect_policy_change_failed è false). |
| username_removed | target.user.userid | Mappato direttamente dal campo username_removed. |
| vd | principal.administrative_domain | Mappato direttamente dal campo vd. |
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.