Raccogliere i log di PowerShell
Questo documento spiega come raccogliere i log di PowerShell in Google Security Operations utilizzando Bindplane. Il parser trasforma i log Microsoft PowerShell non elaborati in un modello dei dati unificato (UDM). Innanzitutto, estrae i campi dal messaggio di log non elaborato, li normalizza in campi UDM e poi arricchisce i dati con un contesto aggiuntivo in base a ID evento specifici, creando infine un evento UDM strutturato per l'analisi della sicurezza.
Prima di iniziare
- Assicurati di avere un'istanza Google SecOps.
- Assicurati di avere Windows 2016 o versioni successive.
- Se l'esecuzione avviene tramite un proxy, assicurati che le porte del firewall siano aperte.
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 su 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
Risorse aggiuntive per l'installazione
- Per ulteriori opzioni di installazione, consulta questa guida all'installazione.
Configura l'agente Bindplane per importare Syslog e inviarli a Google SecOps
- Prima di configurare il file YAML, arresta il
observIQ Distro for Open Telemetry Collectorservizio nel pannello Servizi. 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,vio Blocco note).
- Individua il file
Modifica il file
config.yamlcome segue:receivers: windowseventlog/powershell: channel: Microsoft-Windows-PowerShell/Operational max_reads: 100 poll_interval: 5s raw: true start_at: end processors: batch: exporters: chronicle/powershell: endpoint: malachiteingestion-pa.googleapis.com # Adjust the path to the credentials file you downloaded in Step 1 creds: '/path/to/ingestion-authentication-file.json' log_type: 'POWERSHELL' override_log_type: false raw_log_field: body customer_id: '<customer_id>' service: pipelines: logs/winpowershell: receivers: - windowseventlog/powershell processors: [batch] exporters: [chronicle/powershell]Sostituisci
<customer_id>con l'ID cliente effettivo.Aggiorna
/path/to/ingestion-authentication-file.jsonal percorso in cui è stato salvato il file di autenticazione nella sezione Recupera il file di autenticazione per l'importazione di Google SecOps.Dopo aver salvato il file
config.yaml, avvia il servizioobservIQ Distro for Open Telemetry Collector.
Riavvia l'agente Bindplane per applicare le modifiche
Per riavviare l'agente Bindplane in Windows, puoi utilizzare la console Servizi o inserire il seguente comando:
net stop BindPlaneAgent && net start BindPlaneAgent
Tabella di mappatura UDM
| Campo log | Mappatura UDM | Logic |
|---|---|---|
| AccountName | principal.user.userid | Mappato direttamente dal campo AccountName nel log non elaborato. |
| ActivityID | security_result.detection_fields[0].value | Mappato direttamente dal campo ActivityID nel log non elaborato. Le parentesi graffe vengono rimosse. |
| Canale | Non mappato all'oggetto IDM. | |
| collection_time.nanos | Non mappato all'oggetto IDM. | |
| collection_time.seconds | Non mappato all'oggetto IDM. | |
| Comando | Non mappato all'oggetto IDM. | |
| CommandLine | Non mappato all'oggetto IDM. | |
| Computer | principal.hostname | Mappato direttamente dal campo Computer nel log non elaborato, se presente. |
| ContextInfo | Non mappato all'oggetto IDM. | |
| ContextInfo_Command Name | security_result.detection_fields[0].value | Mappato direttamente dal campo ContextInfo_Command Name nel log non elaborato, se presente. |
| ContextInfo_Command Type | security_result.detection_fields[1].value | Mappato direttamente dal campo ContextInfo_Command Type nel log non elaborato, se presente. |
| ContextInfo_Host Application | target.process.command_line | Mappato direttamente dal campo ContextInfo_Host Application nel log non elaborato se powershell.Host Application non è presente. |
| ContextInfo_Host ID | target.asset.asset_id | Mappato direttamente dal campo ContextInfo_Host ID nel log non elaborato se powershell.Host ID non è presente. Il valore è preceduto dal prefisso Host ID:. |
| ContextInfo_Host Name | target.hostname | Mappato direttamente dal campo ContextInfo_Host Name nel log non elaborato se powershell.Host Name non è presente. |
| ContextInfo_Script Name | target.process.file.full_path | Mappato direttamente dal campo ContextInfo_Script Name nel log non elaborato se script_name non è presente. |
| ContextInfo_Sequence Number | security_result.detection_fields[2].value | Mappato direttamente dal campo ContextInfo_Sequence Number nel log non elaborato, se presente. Convertito in una stringa. |
| ContextInfo_Severity | Non mappato all'oggetto IDM. | |
| create_time.nanos | Non mappato all'oggetto IDM. | |
| create_time.seconds | Non mappato all'oggetto IDM. | |
| customer_id | Non mappato all'oggetto IDM. | |
| dati | Non mappato all'oggetto IDM. | |
| Dati | security_result.detection_fields[0].value | Mappato direttamente dal campo Data nel log non elaborato, se presente. |
| Data_1 | security_result.detection_fields[1].value | Mappato direttamente dal campo Data_1 nel log non elaborato, se presente. |
| Data_2 | security_result.detection_fields[2].value | Mappato direttamente dal campo Data_2 nel log non elaborato, se presente. |
| Dominio | principal.administrative_domain | Mappato direttamente dal campo Domain nel log non elaborato. |
| entries | Non mappato all'oggetto IDM. | |
| ERROR_EVT_UNRESOLVED | Non mappato all'oggetto IDM. | |
| EventCategory | Non mappato all'oggetto IDM. | |
| EventData | Non mappato all'oggetto IDM. | |
| EventID | metadata.product_event_type, security_result.rule_name | Mappato direttamente dal campo EventID nel log non elaborato. Il valore è preceduto dal prefisso EventID: per il campo security_result.rule_name. |
| EventLevel | Non mappato all'oggetto IDM. | |
| EventLevelName | security_result.severity | Mappatura in base al valore di EventLevelName:- Information viene mappato a INFORMATIONAL.- Verbose maps to LOW. |
| EventLog | Non mappato all'oggetto IDM. | |
| EventReceivedTime | Non mappato all'oggetto IDM. | |
| EventType | Non mappato all'oggetto IDM. | |
| EventTime | metadata.event_timestamp | Utilizzato per estrarre il timestamp, se presente. |
| ExecutionProcessID | principal.process.pid | Mappato direttamente dal campo ExecutionProcessID nel log non elaborato, se presente e non vuoto o 0. Convertito in una stringa. |
| ExecutionThreadID | security_result.detection_fields[2].value | Mappato direttamente dal campo ExecutionThreadID nel log non elaborato, se presente e non vuoto o 0. Convertito in una stringa. |
| File | target.process.file.full_path | Mappato direttamente dal campo File nel log non elaborato, se presente. |
| Applicazione host | Non mappato all'oggetto IDM. | |
| HostApplication | Non mappato all'oggetto IDM. | |
| Nome host | principal.hostname | Mappato direttamente dal campo Hostname nel log non elaborato. |
| ID | Non mappato all'oggetto IDM. | |
| Parole chiave | Non mappato all'oggetto IDM. | |
| log_type | metadata.log_type | Mappato direttamente dal campo log_type nel log non elaborato. |
| Computer | principal.asset.asset_id, principal.asset.platform_software.platform_version | Il campo Machine viene analizzato per estrarre l'ID macchina e le informazioni sulla piattaforma. L'ID macchina è preceduto da Machine ID:. La piattaforma è mappata all'enumerazione UDM in base al valore: - win corrisponde a WINDOWS.- mac maps to MAC.- lin maps to LINUX.- Other values map to UNKNOWN_PLATFORM. |
| ManagementGroupName | additional.fields[0].value.string_value | Mappato direttamente dal campo ManagementGroupName nel log non elaborato, se presente. |
| Message.EventTime | metadata.event_timestamp | Utilizzato per estrarre il timestamp, se presente. Convertito in una stringa. |
| Message.Message | security_result.description | Mappato direttamente dal campo Message.Message nel log non elaborato se EventID è in [403, 4103, 4104] e message_message_not_found. I ritorni a capo e le tabulazioni vengono sostituiti con virgole. |
| Messaggio | security_result.description | Mappato direttamente dal campo Message nel log non elaborato, se presente. |
| MessageNumber | Non mappato all'oggetto IDM. | |
| MessageSourceAddress | principal.ip | Mappato direttamente dal campo MessageSourceAddress nel log non elaborato, se presente. |
| MessageTotal | Non mappato all'oggetto IDM. | |
| MG | Non mappato all'oggetto IDM. | |
| Opcode | metadata.description | Mappato direttamente dal campo Opcode nel log non elaborato. |
| OpcodeValue | Non mappato all'oggetto IDM. | |
| Output | security_result.detection_fields[0].value | Mappato direttamente dal campo Output nel log non elaborato, se presente. |
| powershell.Command Name | security_result.detection_fields[0].value | Mappato direttamente dal campo powershell.Command Name, se presente. |
| powershell.Command Type | security_result.detection_fields[1].value | Mappato direttamente dal campo powershell.Command Type, se presente. |
| powershell.Host Application | target.process.command_line | Mappato direttamente dal campo powershell.Host Application nel log non elaborato, se presente. |
| powershell.Host ID | target.asset.asset_id | Mappato direttamente dal campo powershell.Host ID nel log non elaborato, se presente. Il valore è preceduto dal prefisso Host ID:. |
| powershell.Host Name | target.hostname | Mappato direttamente dal campo powershell.Host Name nel log non elaborato, se presente. |
| powershell.HostApplication | target.process.command_line | Mappato direttamente dal campo powershell.HostApplication nel log non elaborato, se presente. |
| powershell.HostId | target.asset.asset_id | Mappato direttamente dal campo powershell.HostId nel log non elaborato, se presente. Il valore è preceduto dal prefisso Host ID:. |
| powershell.HostName | target.hostname | Mappato direttamente dal campo powershell.HostName nel log non elaborato, se presente. |
| powershell.Script Name | target.process.file.full_path | Mappato direttamente dal campo powershell.Script Name nel log non elaborato, se presente. |
| powershell.ScriptName | target.process.file.full_path | Mappato direttamente dal campo powershell.ScriptName nel log non elaborato, se presente. |
| powershell.Sequence Number | security_result.detection_fields[2].value | Mappato direttamente dal campo powershell.Sequence Number nel log non elaborato, se presente. |
| powershell.SequenceNumber | security_result.detection_fields[0].value | Mappato direttamente dal campo powershell.SequenceNumber nel log non elaborato, se presente. |
| powershell.UserId | principal.user.userid | Mappato direttamente dal campo powershell.UserId nel log non elaborato, se presente. |
| ID processo | principal.process.pid | Mappato direttamente dal campo Process ID nel log non elaborato se ExecutionProcessID e ProcessID non sono presenti, sono vuoti o sono pari a 0. Convertito in una stringa. |
| ProcessID | principal.process.pid | Mappato direttamente dal campo ProcessID nel log non elaborato se ExecutionProcessID non è presente, è vuoto o è 0. Convertito in una stringa. |
| ProviderGuid | metadata.product_deployment_id | Mappato direttamente dal campo ProviderGuid nel log non elaborato. Le parentesi graffe vengono rimosse. |
| PSEdition | Non mappato all'oggetto IDM. | |
| PSRemotingProtocolVersion | Non mappato all'oggetto IDM. | |
| PSVersion | Non mappato all'oggetto IDM. | |
| RecordNumber | metadata.product_log_id | Mappato direttamente dal campo RecordNumber nel log non elaborato. Convertito in una stringa. |
| RenderedDescription | security_result.description | Mappato direttamente dal campo RenderedDescription nel log non elaborato, se presente. |
| RunAs User | Non mappato all'oggetto IDM. | |
| ScriptBlockId | Non mappato all'oggetto IDM. | |
| ScriptBlockText | security_result.detection_fields[0].value | Mappato direttamente dal campo ScriptBlockText nel log non elaborato, se presente. |
| ID ScriptBlock | Non mappato all'oggetto IDM. | |
| Gravità | security_result.severity, security_result.severity_details | Mappatura eseguita in base al valore di Severity:- verbose o info corrisponde a LOW.- warn o err corrisponde a MEDIUM.- crit maps to HIGH.Il valore non elaborato viene mappato anche a security_result.severity_details. |
| source.collector_id | Non mappato all'oggetto IDM. | |
| source.customer_id | Non mappato all'oggetto IDM. | |
| Origine | additional.fields[1].value.string_value | Mappato direttamente dal campo Source nel log non elaborato, se presente. |
| SourceModuleName | principal.resource.name | Mappato direttamente dal campo SourceModuleName nel log non elaborato. |
| SourceModuleType | principal.resource.resource_subtype | Mappato direttamente dal campo SourceModuleType nel log non elaborato. |
| SourceName | metadata.product_name | Mappato direttamente dal campo SourceName nel log non elaborato. |
| start_time.nanos | Non mappato all'oggetto IDM. | |
| start_time.seconds | Non mappato all'oggetto IDM. | |
| TenantId | additional.fields[2].value.string_value | Mappato direttamente dal campo TenantId nel log non elaborato, se presente. |
| ThreadID | Non mappato all'oggetto IDM. | |
| timestamp.nanos | Non mappato all'oggetto IDM. | |
| timestamp.seconds | Non mappato all'oggetto IDM. | |
| tipo | Non mappato all'oggetto IDM. | |
| UserID | principal.user.windows_sid | Mappato direttamente dal campo UserID nel log non elaborato. |
| Nome utente | principal.user.userid | Mappato direttamente dal campo Username nel log non elaborato se AccountName non è presente. |
| metadata.vendor_name | Imposta su Microsoft. |
|
| metadata.event_type | Imposta su PROCESS_LAUNCH se EventID è 4104 e _Path è presente in Message, se EventID è 4103 o se EventID è in [800, 600, 400] e powershell.ScriptName e powershell.HostApplication sono presenti. Impostalo su PROCESS_TERMINATION se EventID è 403 e _HostApplication è presente in Message oppure se EventID è 403 e NewEngineState è Stopped. Impostato su STATUS_UPDATE se EventID è 4104 e _Path non è presente in Message, o se EventID è 4103 e no_value, script_name è vuoto, script_name_not_found e host_application_not_found sono tutti veri, o se EventID è 53504, o se EventID è 40962, o se EventID è 40961, o se EventID è vuoto e MessageSourceAddress è presente. Imposta su USER_UNCATEGORIZED se EventID è vuoto e Username è presente. Imposta su GENERIC_EVENT se EventID è vuoto e MessageSourceAddress e Username non sono presenti. |
|
| metadata.product_name | Imposta il valore su Powershell se SourceName non è presente. |
|
| security_result.action | Imposta su ALLOW. |
|
| security_result.detection_fields[0].key | Imposta su Activity ID. |
|
| security_result.detection_fields[1].key | Imposta su Sequence Number. |
|
| security_result.detection_fields[2].key | Imposta su ExecutionThreadID. |
|
| additional.fields[0].key | Imposta su Management Group Name. |
|
| additional.fields[1].key | Imposta su Source. |
|
| additional.fields[2].key | Imposta su TenantId. |
|
| principal.asset.platform_software.platform | Imposta WINDOWS se platform_software contiene win, MAC se contiene mac, LINUX se contiene lin e UNKNOWN_PLATFORM in caso contrario. |
|
| target.process.file.full_path | Imposta su _Path se EventID è 4104 e _Path è presente in Message. Imposta su file_path se EventID è 4104 e file_path è presente in Message. Imposta su _HostApplication se EventID è 403 e _HostApplication è presente in Message. |
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.