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 Collector
servizio 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
,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
al 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.