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 non elaborati di Microsoft PowerShell in un modello dei dati unificato (UDM). Innanzitutto estrae i campi dal messaggio del log non elaborato, li normalizza nei 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 il servizio è in esecuzione dietro un proxy, assicurati che le porte del firewall siano aperte.
Recupera il file di autenticazione di importazione di Google SecOps
- Accedi alla console Google SecOps.
- Vai a Impostazioni SIEM > Agenti di raccolta.
- Scarica il file di autenticazione dell'importazione. Salva il file in modo sicuro sul sistema in cui verrà installato Bindplane.
Ottenere 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 di installazione aggiuntive
- Per altre opzioni di installazione, consulta questa guida all'installazione.
Configura l'agente Bindplane per importare i syslog e inviarli a Google SecOps
- Prima di configurare il file YAML, interrompi il
observIQ Distro for Open Telemetry Collector
servizio nel riquadro 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
,vi
o Blocco note).
- Individua il file
Modifica il file
config.yaml
come 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.json
con il percorso in cui è stato salvato il file di autenticazione nella sezione Ottenere 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 | Logica |
---|---|---|
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 | Se presente, mappato direttamente dal campo Computer nel log non elaborato. |
ContextInfo | Non mappato all'oggetto IDM. | |
Nome comando ContextInfo | security_result.detection_fields[0].value | Se presente, mappato direttamente dal campo ContextInfo_Command Name nel log non elaborato. |
Tipo di ContextInfo_Command | security_result.detection_fields[1].value | Se presente, mappato direttamente dal campo ContextInfo_Command Type nel log non elaborato. |
Applicazione ContextInfo_Host | target.process.command_line | Mappato direttamente dal campo ContextInfo_Host Application nel log non elaborato se powershell.Host Application non è presente. |
ID ContextInfo_Host | 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: . |
Nome host ContextInfo | target.hostname | Mappato direttamente dal campo ContextInfo_Host Name nel log non elaborato se powershell.Host Name non è presente. |
Nome script ContextInfo | 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 | Se presente, mappato direttamente dal campo Data nel log non elaborato. |
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 | Se presente, mappato direttamente dal campo Data_2 nel log non elaborato. |
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 da 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 corrisponde a INFORMATIONAL .- Verbose corrisponde a 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 | Se presente, mappato direttamente dal campo File nel log non elaborato. |
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 dal prefisso Machine ID: . La piattaforma viene mappata all'enum UDM in base al valore: - win corrisponde a WINDOWS .- mac corrisponde a MAC .- lin corrisponde a LINUX .: gli altri valori vengono mappati a UNKNOWN_PLATFORM . |
ManagementGroupName | additional.fields[0].value.string_value | Se presente, mappato direttamente dal campo ManagementGroupName nel log non elaborato. |
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 le virgole. |
Messaggio | security_result.description | Se presente, mappato direttamente dal campo Message nel log non elaborato. |
MessageNumber | Non mappato all'oggetto IDM. | |
MessageSourceAddress | principal.ip | Se presente, mappato direttamente dal campo MessageSourceAddress nel log non elaborato. |
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 | Se presente, mappato direttamente dal campo Output nel log non elaborato. |
powershell.Nome comando | security_result.detection_fields[0].value | Mappato direttamente dal campo powershell.Command Name , se presente. |
Tipo powershell.Command | security_result.detection_fields[1].value | Mappato direttamente dal campo powershell.Command Type , se presente. |
powershell.Host Application | target.process.command_line | Se presente, mappato direttamente dal campo powershell.Host Application nel log non elaborato. |
powershell.Host ID | target.asset.asset_id | Se presente, mappato direttamente dal campo powershell.Host ID nel log non elaborato. Il valore è preceduto dal prefisso Host ID: . |
powershell.Nome host | target.hostname | Se presente, mappato direttamente dal campo powershell.Host Name nel log non elaborato. |
powershell.HostApplication | target.process.command_line | Mappato direttamente dal campo powershell.HostApplication nel log non elaborato, se presente. |
powershell.HostId | target.asset.asset_id | Se presente, mappato direttamente dal campo powershell.HostId nel log non elaborato. Il valore è preceduto dal prefisso Host ID: . |
powershell.HostName | target.hostname | Se presente, mappato direttamente dal campo powershell.HostName nel log non elaborato. |
powershell.NomeScript | target.process.file.full_path | Se presente, mappato direttamente dal campo powershell.Script Name nel log non elaborato. |
powershell.ScriptName | target.process.file.full_path | Se presente, mappato direttamente dal campo powershell.ScriptName nel log non elaborato. |
powershell.Sequence Number | security_result.detection_fields[2].value | Se presente, mappato direttamente dal campo powershell.Sequence Number nel log non elaborato. |
powershell.SequenceNumber | security_result.detection_fields[0].value | Se presente, mappato direttamente dal campo powershell.SequenceNumber nel log non elaborato. |
powershell.UserId | principal.user.userid | Se presente, mappato direttamente dal campo powershell.UserId nel log non elaborato. |
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 | Se presente, mappato direttamente dal campo RenderedDescription nel log non elaborato. |
Utente RunAs | Non mappato all'oggetto IDM. | |
ScriptBlockId | Non mappato all'oggetto IDM. | |
ScriptBlockText | security_result.detection_fields[0].value | Se presente, mappato direttamente dal campo ScriptBlockText nel log non elaborato. |
ID ScriptBlock | Non mappato all'oggetto IDM. | |
Gravità | security_result.severity, security_result.severity_details | Mappatura in base al valore di Severity :- verbose o info a LOW .- warn o err corrisponde a MEDIUM .- crit corrisponde a HIGH .Il valore non elaborato è 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 | Se presente, mappato direttamente dal campo Source nel log non elaborato. |
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 | Se presente, mappato direttamente dal campo TenantId nel log non elaborato. |
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 PROCESS_LAUNCH se EventID è 4104 e _Path è presente in Message oppure se EventID è 4103 oppure se EventID è in [800 , 600 , 400 ] e sono presenti powershell.ScriptName e powershell.HostApplication . Imposta PROCESS_TERMINATION se EventID è 403 e _HostApplication è presente in Message oppure se EventID è 403 e NewEngineState è Stopped . Imposta STATUS_UPDATE se EventID è 4104 e _Path non è presente in Message oppure se EventID è 4103 e no_value , script_name è vuoto, script_name_not_found e host_application_not_found sono tutti veri oppure se EventID è 53504 oppure se EventID è 40962 oppure se EventID è 40961 oppure se EventID è vuoto e MessageSourceAddress è presente. Impostato su USER_UNCATEGORIZED se EventID è vuoto e Username è presente. Imposta GENERIC_EVENT se EventID è vuoto e MessageSourceAddress e Username non sono presenti. |
|
metadata.product_name | Imposta 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 su 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 . |
Modifiche
2025-01-29
Miglioramento:
- La mappatura di
ScriptBlockText
è stata modificata dasecurity_result.detection_fields
atarget.process.command_line
.
2025-01-28
Miglioramento:
- È stato aggiunto
gsub
per supportare il nuovo formato dei log JSON.
2025-01-09
Miglioramento:
Payload
è stato mappato asecurity_result.detection_fields
.Script Name
è stato mappato atarget.file.full_path
.
2024-11-28
Miglioramento:
- È stato aggiunto il supporto per il nuovo pattern dei log SYSLOG.
2024-08-20
Miglioramento:
- È stato aggiunto
gsub
per rimuovere i caratteri aggiuntivi per analizzare i log JSON.
2024-08-14
Miglioramento:
Version
è stato mappato ametadata.product_version
.SystemTime
è stato mappato ametadata.event_timestamp
.- Sono stati mappati
channel
,keywords
,MessageNumber
,MessageTotal
eScriptBlockId
asecurity_result.detection_fields
. Path
è stato mappato atarget.process.file.full_path
.
2024-07-24
Miglioramento:
- È stato aggiunto il supporto di un nuovo pattern di log JSON.
2024-07-20
Miglioramento:
HostApplication
è stato mappato aprincipal.application
.HostId
è stato mappato aprincipal.resource.product_object_id
.System.Computer
è stato mappato aprincipal.hostname
eprincipal.asset.hostname
.System.Version
è stato mappato ametadata.product_version
.System.ProcessID
è stato mappato aprincipal.process.pid
.System.ProviderName
è stato mappato aprincipal.resource.attribute.labels
.- Sono stati mappati
HostVersion
,RunspaceId
,PipelineId
,EngineVersion
,DetailSequence
,DetailTotal
,SequenceNumber
eScriptName
aadditional.fields
. - Sono stati mappati
System.EventRecordID
,System.Task
,System.Keywords
,System.Opcode
eSystem.ThreadID
asecurity.detection_fields
.
2023-12-05
Miglioramento:
- È stata aggiunta la mappatura per i log JSON non analizzati.
Computer
è stato mappato aprincipal.hostname
.EventLevelName
è stato mappato asecurity_result.severity
.ManagementGroupName
,Source
,TenantId
mappati aadditional_fields
.RenderedDescription
è stato mappato asecurity_result.description
.UserName
è stato mappato aprincipal.user.userid
.
2023-09-14
Miglioramento:
- Sono state aggiunte mappature per i log JSON non analizzati.
- È stata mappata la colonna "winlog.activity_id" alla colonna "security_result.detection_fields".
- È stata mappata "winlog.api" a "additional.fields".
- Sono stati mappati "winlog.channel" e "winlog.process.thread.id" a "security_result.about.resource.attribute.labels".
- È stato mappato "winlog.computer_name" a "principal.hostname".
- È stata eseguita la mappatura di "winlog.event_id" a "metadata.product_event_type" e "security_result.rule_name".
- È stata mappata la colonna "winlog.opcode" alla colonna "metadata.description".
- È stata mappata la colonna "winlog.process.pid" a "principal.process.pid".
- È stata mappata la colonna "winlog.provider_guid" alla colonna "metadata.product_deployment_id".
- È stata mappata la colonna "winlog.provider_name" alla colonna "metadata.product_name".
- È stata eseguita la mappatura di "winlog.record_id" a "metadata.product_log_id".
- È stata mappata la colonna "winlog.user.domain" a "principal.administrative_domain".
- È stato mappato "winlog.user.identifier" a "principal.user.windows_sid".
- È stato mappato "winlog.user.name" a "principal.user.userid".
2023-07-05
Miglioramento:
- Per "EventID = 403", è stato mappato "metadata.event_type" a "STATUS_UPDATE" quando il valore di "HostApplication" non è presente.
- È stato estratto il valore di "target.file.full_path" dal log utilizzando un pattern Grok quando "Path" è vuoto.
- È stata aggiunta la funzione gsub per rinominare "@timestamp" in "EventTime".
2022-11-09
Miglioramento:
- Il campo "ProviderGuid" è mappato a "metadata.product_deployment_id".
- Il campo "ExecutionProcessID" è mappato a "principal.process.pid".
- Il campo "ProcessID" o "ID processo" è mappato a "principal.process.pid".
- Il campo "SourceModuleType" è mappato a "principal.resource.resource_subtype".
- Il campo "SourceModuleName" è mappato a "principal.resource.name".
- Il campo "Macchina" è mappato a "principal.asset.asset_id".
- Il campo "MessageSourceAddress" è mappato a "principal.ip".
- Il campo "File" è mappato a "target.process.file.full_path".
- Il campo "Applicazione host" o "Comando" è mappato a "target.process.command_line".
- Il campo "Output" è mappato a "security_result.detection_fields".
- Il campo "Messaggio" è mappato a "security_result.description".
- Il campo "ActivityID" è mappato a "security_result.detection_fields".
- È stata aggiunta la seguente mappatura quando EventID è "4103"
- Il campo "ID host" o "ContextInfo_ID host" è mappato a "target.asset.asset_id".
- Il campo "Nome host" o "ContextInfo_Nome host" è mappato a "target.hostname".
- Il campo "ContextInfo_Script Name" è mappato a "target.process.file.full_path".
- Il campo "ContextInfo_Host Application" è mappato a "target.process.command_line".
- Il campo "ContextInfo_Command Name" è mappato a "security_result.detection_fields".
- Il campo "ContextInfo_Command Type" è mappato a "security_result.detection_fields".
- Il campo "ContextInfo_Sequence Number" o "Sequence Number" è mappato a "security_result.detection_fields".
- È stata aggiunta la seguente mappatura quando EventID è "800", "600" o "400"
- Il campo "UserId" è mappato a "principal.user.userid".
- Il campo "HostApplication" è mappato a "target.process.command_line".
- Il campo "HostId" è mappato a "target.asset.asset_id".
- Il campo "HostName" è mappato a "target.hostname".
- Il campo "ScriptName" è mappato a "target.process.file.full_path".
- Il campo "SequenceNumber" è mappato a "security_result.detection_fields".
2022-10-13
Correzione di bug:
- I log con errori sono stati analizzati apportando le seguenti modifiche.
- Sono stati aggiunti controlli
on_error
per i campi di cui non è stato possibile eseguire l'analisi in caso di assenza di valori. Campi come "opcode", "Host Application". - È stata aggiunta una nuova origine, "ContextInfo", per l'analisi KV quando "Message" non è presente nei log.
- Miglioramento:
- event_type modificato da
GENERIC_EVENT
aSTATUS_UPDATE
.
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.