Raccogliere i log di PowerShell

Supportato in:

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

  1. Accedi alla console Google SecOps.
  2. Vai a Impostazioni SIEM > Agenti di raccolta.
  3. 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

  1. Accedi alla console Google SecOps.
  2. Vai a Impostazioni SIEM > Profilo.
  3. Copia e salva l'ID cliente dalla sezione Dettagli dell'organizzazione.

Installa l'agente Bindplane su Windows

  1. Apri il prompt dei comandi o PowerShell come amministratore.
  2. Esegui questo comando:

    msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
    

Risorse di installazione aggiuntive

Configura l'agente Bindplane per importare i syslog e inviarli a Google SecOps

  1. Prima di configurare il file YAML, interrompi il observIQ Distro for Open Telemetry Collector servizio nel riquadro Servizi.
  2. Accedi al file di configurazione:

    1. Individua il file config.yaml. In genere si trova nella directory /etc/bindplane-agent/ su Linux o nella directory di installazione su Windows.
    2. Apri il file utilizzando un editor di testo (ad esempio nano, vi o Blocco note).
  3. 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] 
    
  4. Sostituisci <customer_id> con l'ID cliente effettivo.

  5. 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.

  6. Dopo aver salvato il file config.yaml, avvia il servizio observIQ 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 da security_result.detection_fields a target.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 a security_result.detection_fields.
  • Script Name è stato mappato a target.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 a metadata.product_version.
  • SystemTime è stato mappato a metadata.event_timestamp.
  • Sono stati mappati channel, keywords, MessageNumber, MessageTotal e ScriptBlockId a security_result.detection_fields.
  • Path è stato mappato a target.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 a principal.application.
  • HostId è stato mappato a principal.resource.product_object_id.
  • System.Computer è stato mappato a principal.hostname e principal.asset.hostname.
  • System.Version è stato mappato a metadata.product_version.
  • System.ProcessID è stato mappato a principal.process.pid.
  • System.ProviderName è stato mappato a principal.resource.attribute.labels.
  • Sono stati mappati HostVersion, RunspaceId, PipelineId, EngineVersion, DetailSequence, DetailTotal, SequenceNumber e ScriptName a additional.fields.
  • Sono stati mappati System.EventRecordID, System.Task, System.Keywords, System.Opcode e System.ThreadID a security.detection_fields.

2023-12-05

Miglioramento:

  • È stata aggiunta la mappatura per i log JSON non analizzati.
  • Computer è stato mappato a principal.hostname.
  • EventLevelName è stato mappato a security_result.severity.
  • ManagementGroupName, Source, TenantId mappati a additional_fields.
  • RenderedDescription è stato mappato a security_result.description.
  • UserName è stato mappato a principal.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 a STATUS_UPDATE.

Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.