Collecter les journaux PowerShell

Compatible avec :

Ce document explique comment collecter des journaux PowerShell dans Google Security Operations à l'aide de Bindplane. L'analyseur transforme les journaux Microsoft PowerShell bruts en modèle de données unifié (UDM). Il extrait d'abord les champs du message de journal brut, les normalise en champs UDM, puis enrichit les données avec un contexte supplémentaire basé sur des ID d'événement spécifiques. Il crée ainsi un événement UDM structuré pour l'analyse de la sécurité.

Avant de commencer

  • Assurez-vous de disposer d'une instance Google SecOps.
  • Assurez-vous de disposer de Windows 2016 ou d'une version ultérieure.
  • Si vous exécutez le programme derrière un proxy, assurez-vous que les ports du pare-feu sont ouverts.

Obtenir le fichier d'authentification d'ingestion Google SecOps

  1. Connectez-vous à la console Google SecOps.
  2. Accédez à Paramètres du SIEM > Agents de collecte.
  3. Téléchargez le fichier d'authentification d'ingestion. Enregistrez le fichier de manière sécurisée sur le système sur lequel Bindplane sera installé.

Obtenir l'ID client Google SecOps

  1. Connectez-vous à la console Google SecOps.
  2. Accédez à Paramètres SIEM> Profil.
  3. Copiez et enregistrez le numéro client de la section Informations sur l'organisation.

Installer l'agent Bindplane sur Windows

  1. Ouvrez l'invite de commandes ou PowerShell en tant qu'administrateur.
  2. Exécutez la commande suivante :

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

Ressources d'installation supplémentaires

Configurer l'agent Bindplane pour ingérer Syslog et l'envoyer à Google SecOps

  1. Avant de configurer le fichier YAML, arrêtez le service observIQ Distro for Open Telemetry Collector dans le panneau "Services".
  2. Accédez au fichier de configuration :

    1. Recherchez le fichier config.yaml. En règle générale, il se trouve dans le répertoire /etc/bindplane-agent/ sous Linux ou dans le répertoire d'installation sous Windows.
    2. Ouvrez le fichier à l'aide d'un éditeur de texte (par exemple, nano, vi ou le Bloc-notes).
  3. Modifiez le fichier config.yaml comme suit :

    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. Remplacez <customer_id> par le numéro client réel.

  5. Mettez à jour /path/to/ingestion-authentication-file.json en indiquant le chemin d'accès où le fichier d'authentification a été enregistré dans la section Obtenir le fichier d'authentification pour l'ingestion Google SecOps.

  6. Après avoir enregistré le fichier config.yaml, démarrez le service observIQ Distro for Open Telemetry Collector.

Redémarrez l'agent Bindplane pour appliquer les modifications.

  • Pour redémarrer l'agent Bindplane sous Windows, vous pouvez utiliser la console Services ou saisir la commande suivante :

    net stop BindPlaneAgent && net start BindPlaneAgent
    

Table de mappage UDM

Champ de journal Mappage UDM Logique
AccountName principal.user.userid Mappé directement à partir du champ AccountName dans le journal brut.
ActivityID security_result.detection_fields[0].value Mappé directement à partir du champ ActivityID dans le journal brut. Les accolades sont supprimées.
Canal Non mappé à l'objet IDM.
collection_time.nanos Non mappé à l'objet IDM.
collection_time.seconds Non mappé à l'objet IDM.
Commande Non mappé à l'objet IDM.
CommandLine Non mappé à l'objet IDM.
Ordinateur principal.hostname Directement mappé à partir du champ Computer dans le journal brut, le cas échéant.
ContextInfo Non mappé à l'objet IDM.
ContextInfo_Command Name security_result.detection_fields[0].value Directement mappé à partir du champ ContextInfo_Command Name dans le journal brut, le cas échéant.
Type de commande ContextInfo security_result.detection_fields[1].value Directement mappé à partir du champ ContextInfo_Command Type dans le journal brut, le cas échéant.
ContextInfo_Host Application target.process.command_line Directement mappé à partir du champ ContextInfo_Host Application dans le journal brut si powershell.Host Application n'est pas présent.
ContextInfo_Host ID target.asset.asset_id Directement mappé à partir du champ ContextInfo_Host ID dans le journal brut si powershell.Host ID n'est pas présent. La valeur est précédée de Host ID:.
ContextInfo_Host Name target.hostname Directement mappé à partir du champ ContextInfo_Host Name dans le journal brut si powershell.Host Name n'est pas présent.
ContextInfo_Script Name target.process.file.full_path Directement mappé à partir du champ ContextInfo_Script Name dans le journal brut si script_name n'est pas présent.
ContextInfo_Sequence Number security_result.detection_fields[2].value Directement mappé à partir du champ ContextInfo_Sequence Number dans le journal brut, le cas échéant. Converti en chaîne.
ContextInfo_Severity Non mappé à l'objet IDM.
create_time.nanos Non mappé à l'objet IDM.
create_time.seconds Non mappé à l'objet IDM.
customer_id Non mappé à l'objet IDM.
données Non mappé à l'objet IDM.
Données security_result.detection_fields[0].value Directement mappé à partir du champ Data dans le journal brut, le cas échéant.
Data_1 security_result.detection_fields[1].value Directement mappé à partir du champ Data_1 dans le journal brut, le cas échéant.
Data_2 security_result.detection_fields[2].value Directement mappé à partir du champ Data_2 dans le journal brut, le cas échéant.
Domaine principal.administrative_domain Mappé directement à partir du champ Domain dans le journal brut.
entries Non mappé à l'objet IDM.
ERROR_EVT_UNRESOLVED Non mappé à l'objet IDM.
EventCategory Non mappé à l'objet IDM.
EventData Non mappé à l'objet IDM.
EventID metadata.product_event_type, security_result.rule_name Mappé directement à partir du champ EventID dans le journal brut. La valeur est précédée de EventID: pour le champ security_result.rule_name.
EventLevel Non mappé à l'objet IDM.
EventLevelName security_result.severity Mappé en fonction de la valeur de EventLevelName :
 – Information correspond à INFORMATIONAL.
 - Verbose correspond à LOW.
EventLog Non mappé à l'objet IDM.
EventReceivedTime Non mappé à l'objet IDM.
EventType Non mappé à l'objet IDM.
EventTime metadata.event_timestamp Permet d'extraire le code temporel, le cas échéant.
ExecutionProcessID principal.process.pid Directement mappé à partir du champ ExecutionProcessID dans le journal brut, s'il est présent et non vide ou égal à 0. Converti en chaîne.
ExecutionThreadID security_result.detection_fields[2].value Directement mappé à partir du champ ExecutionThreadID dans le journal brut, s'il est présent et non vide ou égal à 0. Converti en chaîne.
Fichier target.process.file.full_path Directement mappé à partir du champ File dans le journal brut, le cas échéant.
Application hôte Non mappé à l'objet IDM.
HostApplication Non mappé à l'objet IDM.
Nom d'hôte principal.hostname Mappé directement à partir du champ Hostname dans le journal brut.
id Non mappé à l'objet IDM.
Mots clés Non mappé à l'objet IDM.
log_type metadata.log_type Mappé directement à partir du champ log_type dans le journal brut.
Machine principal.asset.asset_id, principal.asset.platform_software.platform_version Le champ Machine est analysé pour extraire l'ID de la machine et les informations sur la plate-forme. L'ID de la machine est précédé de Machine ID:. La plate-forme est mappée à l'énumération UDM en fonction de la valeur :
 – win correspond à WINDOWS.
 - mac correspond à MAC.
 - lin correspond à LINUX.
 : les autres valeurs sont mappées sur UNKNOWN_PLATFORM.
ManagementGroupName additional.fields[0].value.string_value Directement mappé à partir du champ ManagementGroupName dans le journal brut, le cas échéant.
Message.EventTime metadata.event_timestamp Permet d'extraire le code temporel, le cas échéant. Converti en chaîne.
Message.Message security_result.description Directement mappé à partir du champ Message.Message dans le journal brut si EventID est dans [403, 4103, 4104] et message_message_not_found. Les retours à la ligne et les tabulations sont remplacés par des virgules.
Message security_result.description Directement mappé à partir du champ Message dans le journal brut, le cas échéant.
MessageNumber Non mappé à l'objet IDM.
MessageSourceAddress principal.ip Directement mappé à partir du champ MessageSourceAddress dans le journal brut, le cas échéant.
MessageTotal Non mappé à l'objet IDM.
MG Non mappé à l'objet IDM.
Code opération metadata.description Mappé directement à partir du champ Opcode dans le journal brut.
OpcodeValue Non mappé à l'objet IDM.
Sortie security_result.detection_fields[0].value Directement mappé à partir du champ Output dans le journal brut, le cas échéant.
powershell.Command Name security_result.detection_fields[0].value Directement mappé à partir du champ powershell.Command Name, s'il est présent.
powershell.Command Type security_result.detection_fields[1].value Directement mappé à partir du champ powershell.Command Type, s'il est présent.
powershell.Host Application target.process.command_line Directement mappé à partir du champ powershell.Host Application dans le journal brut, le cas échéant.
powershell.Host ID target.asset.asset_id Directement mappé à partir du champ powershell.Host ID dans le journal brut, le cas échéant. La valeur est précédée de Host ID:.
powershell.Nom d'hôte target.hostname Directement mappé à partir du champ powershell.Host Name dans le journal brut, le cas échéant.
powershell.HostApplication target.process.command_line Directement mappé à partir du champ powershell.HostApplication dans le journal brut, le cas échéant.
powershell.HostId target.asset.asset_id Directement mappé à partir du champ powershell.HostId dans le journal brut, le cas échéant. La valeur est précédée de Host ID:.
powershell.HostName target.hostname Directement mappé à partir du champ powershell.HostName dans le journal brut, le cas échéant.
powershell.Script Name target.process.file.full_path Directement mappé à partir du champ powershell.Script Name dans le journal brut, le cas échéant.
powershell.ScriptName target.process.file.full_path Directement mappé à partir du champ powershell.ScriptName dans le journal brut, le cas échéant.
powershell.Sequence Number security_result.detection_fields[2].value Directement mappé à partir du champ powershell.Sequence Number dans le journal brut, le cas échéant.
powershell.SequenceNumber security_result.detection_fields[0].value Directement mappé à partir du champ powershell.SequenceNumber dans le journal brut, le cas échéant.
powershell.UserId principal.user.userid Directement mappé à partir du champ powershell.UserId dans le journal brut, le cas échéant.
ID du processus principal.process.pid Directement mappé à partir du champ Process ID dans le journal brut si ExecutionProcessID et ProcessID sont absents, vides ou égaux à 0. Converti en chaîne.
ProcessID principal.process.pid Directement mappé à partir du champ ProcessID dans le journal brut si ExecutionProcessID est absent, vide ou égal à 0. Converti en chaîne.
ProviderGuid metadata.product_deployment_id Mappé directement à partir du champ ProviderGuid dans le journal brut. Les accolades sont supprimées.
PSEdition Non mappé à l'objet IDM.
PSRemotingProtocolVersion Non mappé à l'objet IDM.
PSVersion Non mappé à l'objet IDM.
RecordNumber metadata.product_log_id Mappé directement à partir du champ RecordNumber dans le journal brut. Converti en chaîne.
RenderedDescription security_result.description Directement mappé à partir du champ RenderedDescription dans le journal brut, le cas échéant.
Utilisateur RunAs Non mappé à l'objet IDM.
ScriptBlockId Non mappé à l'objet IDM.
ScriptBlockText security_result.detection_fields[0].value Directement mappé à partir du champ ScriptBlockText dans le journal brut, le cas échéant.
ID ScriptBlock Non mappé à l'objet IDM.
Gravité security_result.severity, security_result.severity_details Mappé en fonction de la valeur de Severity :
 – verbose ou info correspond à LOW.
 – warn ou err correspond à MEDIUM.
 - crit correspond à HIGH.
 : la valeur brute est également mappée sur security_result.severity_details.
source.collector_id Non mappé à l'objet IDM.
source.customer_id Non mappé à l'objet IDM.
Source additional.fields[1].value.string_value Directement mappé à partir du champ Source dans le journal brut, le cas échéant.
SourceModuleName principal.resource.name Mappé directement à partir du champ SourceModuleName dans le journal brut.
SourceModuleType principal.resource.resource_subtype Mappé directement à partir du champ SourceModuleType dans le journal brut.
SourceName metadata.product_name Mappé directement à partir du champ SourceName dans le journal brut.
start_time.nanos Non mappé à l'objet IDM.
start_time.seconds Non mappé à l'objet IDM.
TenantId additional.fields[2].value.string_value Directement mappé à partir du champ TenantId dans le journal brut, le cas échéant.
ThreadID Non mappé à l'objet IDM.
timestamp.nanos Non mappé à l'objet IDM.
timestamp.seconds Non mappé à l'objet IDM.
type Non mappé à l'objet IDM.
UserID principal.user.windows_sid Mappé directement à partir du champ UserID dans le journal brut.
Nom d'utilisateur principal.user.userid Directement mappé à partir du champ Username dans le journal brut si AccountName n'est pas présent.
metadata.vendor_name Variable définie sur Microsoft.
metadata.event_type Définie sur PROCESS_LAUNCH si EventID est 4104 et que _Path est présent dans Message, ou si EventID est 4103, ou si EventID est dans [800, 600, 400] et que powershell.ScriptName et powershell.HostApplication sont présents. Définie sur PROCESS_TERMINATION si EventID est 403 et que _HostApplication est présent dans Message, ou si EventID est 403 et que NewEngineState est Stopped. Définie sur STATUS_UPDATE si EventID est 4104 et que _Path n'est pas présent dans Message, ou si EventID est 4103 et que no_value, script_name est vide, script_name_not_found et host_application_not_found sont tous définis sur "true", ou si EventID est 53504, ou si EventID est 40962, ou si EventID est 40961, ou si EventID est vide et que MessageSourceAddress est présent. Définie sur USER_UNCATEGORIZED si EventID est vide et Username est présent. Définie sur GENERIC_EVENT si EventID est vide et que MessageSourceAddress et Username ne sont pas présents.
metadata.product_name Définie sur Powershell si SourceName n'est pas présent.
security_result.action Variable définie sur ALLOW.
security_result.detection_fields[0].key Variable définie sur Activity ID.
security_result.detection_fields[1].key Variable définie sur Sequence Number.
security_result.detection_fields[2].key Variable définie sur ExecutionThreadID.
additional.fields[0].key Variable définie sur Management Group Name.
additional.fields[1].key Variable définie sur Source.
additional.fields[2].key Variable définie sur TenantId.
principal.asset.platform_software.platform Définie sur WINDOWS si platform_software contient win, sur MAC si elle contient mac, sur LINUX si elle contient lin et sur UNKNOWN_PLATFORM dans le cas contraire.
target.process.file.full_path Définie sur _Path si EventID est 4104 et que _Path est présent dans Message. Définie sur file_path si EventID est 4104 et que file_path est présent dans Message. Définie sur _HostApplication si EventID est 403 et que _HostApplication est présent dans Message.

Modifications

2025-01-29

Amélioration :

  • Le mappage de ScriptBlockText est passé de security_result.detection_fields à target.process.command_line.

2025-01-28

Amélioration :

  • Ajout de gsub pour prendre en charge le nouveau format des journaux JSON.

2025-01-09

Amélioration :

  • Payload a été mappé sur security_result.detection_fields.
  • Script Name a été mappé sur target.file.full_path.

2024-11-28

Amélioration :

  • Ajout de la compatibilité avec un nouveau modèle de journaux SYSLOG.

2024-08-20

Amélioration :

  • Ajout de gsub pour supprimer les caractères supplémentaires afin d'analyser les journaux JSON.

2024-08-14

Amélioration :

  • Version a été mappé sur metadata.product_version.
  • SystemTime a été mappé sur metadata.event_timestamp.
  • channel, keywords, MessageNumber, MessageTotal et ScriptBlockId ont été mappés sur security_result.detection_fields.
  • Path a été mappé sur target.process.file.full_path.

2024-07-24

Amélioration :

  • Ajout de la compatibilité avec un nouveau modèle de journaux JSON.

2024-07-20

Amélioration :

  • HostApplication a été mappé sur principal.application.
  • HostId a été mappé sur principal.resource.product_object_id.
  • Mappage de System.Computer sur principal.hostname et principal.asset.hostname.
  • System.Version a été mappé sur metadata.product_version.
  • System.ProcessID a été mappé sur principal.process.pid.
  • System.ProviderName a été mappé sur principal.resource.attribute.labels.
  • Mappage de HostVersion, RunspaceId, PipelineId, EngineVersion, DetailSequence, DetailTotal, SequenceNumber et ScriptName sur additional.fields.
  • System.EventRecordID, System.Task, System.Keywords, System.Opcode et System.ThreadID ont été mappés sur security.detection_fields.

2023-12-05

Amélioration :

  • Mappage ajouté pour les journaux JSON non analysés.
  • Computer a été mappé sur principal.hostname.
  • EventLevelName a été mappé sur security_result.severity.
  • ManagementGroupName, Source et TenantId sont associés à additional_fields.
  • RenderedDescription a été mappé sur security_result.description.
  • UserName a été mappé sur principal.user.userid.

2023-09-14

Amélioration :

  • Ajout de mappages pour les journaux JSON non analysés.
  • Mappé "winlog.activity_id" à "security_result.detection_fields".
  • Mappé "winlog.api" sur "additional.fields".
  • Mappage de "winlog.channel" et "winlog.process.thread.id" à "security_result.about.resource.attribute.labels".
  • Mappage de "winlog.computer_name" à "principal.hostname".
  • Mappé "winlog.event_id" sur "metadata.product_event_type" et "security_result.rule_name".
  • Mappage de "winlog.opcode" à "metadata.description".
  • Mappé "winlog.process.pid" sur "principal.process.pid".
  • Mappage de "winlog.provider_guid" à "metadata.product_deployment_id".
  • Mappé "winlog.provider_name" à "metadata.product_name".
  • Mappage de "winlog.record_id" à "metadata.product_log_id".
  • Mappage de "winlog.user.domain" à "principal.administrative_domain".
  • Mappé "winlog.user.identifier" sur "principal.user.windows_sid".
  • Mappé "winlog.user.name" à "principal.user.userid".

2023-07-05

Amélioration :

  • Pour "EventID = 403", mappage de "metadata.event_type" sur "STATUS_UPDATE" lorsque la valeur de "HostApplication" est absente.
  • Extrait la valeur de "target.file.full_path" du journal à l'aide d'un modèle Grok lorsque "Path" est vide.
  • Ajout de la fonction gsub pour renommer "@timestamp" en "EventTime".

2022-11-09

Amélioration :

  • Le champ "ProviderGuid" est mappé à "metadata.product_deployment_id".
  • Le champ "ExecutionProcessID" est mappé à "principal.process.pid".
  • Le champ "ProcessID" ou "Process ID" est mappé sur "principal.process.pid".
  • Le champ "SourceModuleType" est mappé à "principal.resource.resource_subtype".
  • Le champ "SourceModuleName" est mappé à "principal.resource.name".
  • Le champ "Machine" est mappé à "principal.asset.asset_id".
  • Le champ "MessageSourceAddress" est mappé sur "principal.ip".
  • Le champ "Fichier" est mappé à "target.process.file.full_path".
  • Le champ "Application hôte" ou "Commande" est mappé sur "target.process.command_line".
  • Le champ "Output" est mappé à "security_result.detection_fields".
  • Le champ "Message" est mappé à "security_result.description".
  • Le champ "ActivityID" est mappé à "security_result.detection_fields".
  • Mappage ajouté lorsque EventID est défini sur "4103"
  • Le champ "ID de l'hôte" ou "ContextInfo_Host ID" est mappé sur "target.asset.asset_id".
  • Le champ "Nom d'hôte" ou "ContextInfo_Host Name" est mappé sur "target.hostname".
  • Le champ "ContextInfo_Script Name" est mappé sur "target.process.file.full_path".
  • Le champ "ContextInfo_Host Application" est mappé à "target.process.command_line".
  • Le champ "ContextInfo_Command Name" est mappé à "security_result.detection_fields".
  • Le champ "ContextInfo_Command Type" est mappé sur "security_result.detection_fields".
  • Le champ "ContextInfo_Sequence Number" ou "Sequence Number" est mappé sur "security_result.detection_fields".
  • Mappage ajouté lorsque EventID est défini sur "800", "600" ou "400"
  • Le champ "UserId" est mappé à "principal.user.userid".
  • Le champ "HostApplication" est mappé sur "target.process.command_line".
  • Le champ "HostId" est mappé à "target.asset.asset_id".
  • Le champ "HostName" est mappé sur "target.hostname".
  • Le champ "ScriptName" est mappé à "target.process.file.full_path".
  • Le champ "SequenceNumber" est mappé à "security_result.detection_fields".

2022-10-13

Correction de bug :

  • Les journaux d'analyse ont échoué en raison des modifications suivantes.
  • Ajout de vérifications on_error sur les champs dont l'analyse a échoué en l'absence de valeurs. Champs tels que "opcode" et "Host Application".
  • Ajout d'une nouvelle source, "ContextInfo", pour l'analyse KV lorsque "Message" n'est pas présent dans les journaux.
  • Amélioration :
  • Le type d'événement est passé de GENERIC_EVENT à STATUS_UPDATE.

Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.