Collecter les journaux Microsoft PowerShell

Compatible avec :

Ce document explique comment ingérer des journaux Microsoft PowerShell dans Google Security Operations à l'aide de l'agent Bindplane.

Microsoft PowerShell est un framework Microsoft d'automatisation des tâches et de gestion de la configuration, qui se compose d'un interpréteur de commandes et d'un langage de script. Les journaux PowerShell enregistrent l'exécution des scripts, l'activité des modules et les appels de commandes. Ils offrent ainsi une visibilité sur les opérations PowerShell pour la surveillance de la sécurité et l'analyse forensique.

Avant de commencer

Assurez-vous de remplir les conditions suivantes :

  • Instance Google SecOps
  • Windows Server 2016 ou version ultérieure
  • Connectivité réseau entre l'hôte Windows et Google SecOps
  • Si vous exécutez l'agent derrière un proxy, assurez-vous que les ports de pare-feu sont ouverts conformément aux exigences de l'agent Bindplane.
  • Accès administrateur à l'hôte Windows pour configurer la journalisation PowerShell et installer l'agent Bindplane

Configurer la journalisation PowerShell

La journalisation PowerShell doit être activée sur les hôtes Windows avant de pouvoir collecter les journaux. Par défaut, la journalisation PowerShell est minimale. Activez la journalisation des blocs de script pour enregistrer l'activité PowerShell détaillée.

Activer la journalisation du blocage de scripts à l'aide d'une règle de groupe

  1. Ouvrez l'Éditeur de stratégie de groupe locale en exécutant gpedit.msc en tant qu'administrateur.
  2. Accédez à Configuration ordinateur> Modèles d'administration> Composants Windows> Windows PowerShell.
  3. Double-cliquez sur Activer la journalisation des blocs de script PowerShell.
  4. Sélectionnez Activé.
  5. Si vous le souhaitez, cochez la case Consigner les événements de début et de fin d'invocation des blocs de script pour capturer les événements de début et de fin de chaque bloc de script. Notez que cette option génère un grand nombre de journaux.
  6. Cliquez sur OK.
  7. Ouvrez l'invite de commande en tant qu'administrateur et exécutez gpupdate /force pour appliquer immédiatement la règle.

Activer la journalisation du blocage de scripts à l'aide du registre

Vous pouvez également activer la journalisation des blocs de script en définissant la valeur de registre suivante :

  1. Ouvrez l'Éditeur du Registre en exécutant regedit en tant qu'administrateur.
  2. Accédez à HKLM\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging.
  3. Si la clé n'existe pas, créez-la.
  4. Créez une valeur DWORD (32 bits) nommée EnableScriptBlockLogging et définissez sa valeur sur 1.
  5. Redémarrez les sessions PowerShell pour que la modification prenne effet.

La journalisation des blocs de script PowerShell écrit les événements dans le canal du journal des événements Microsoft-Windows-PowerShell/Operational avec l'ID d'événement 4104.

Facultatif : Activer la journalisation des modules

La journalisation des modules enregistre les détails de l'exécution du pipeline pour les modules spécifiés. Pour activer la journalisation des modules pour tous les modules, procédez comme suit :

  1. Dans l'Éditeur de stratégie de groupe local, accédez à Configuration ordinateur > Modèles d'administration > Composants Windows > Windows PowerShell.
  2. Double-cliquez sur Activer la journalisation des modules.
  3. Sélectionnez Activé.
  4. Cliquez sur Afficher à côté de Noms des modules.
  5. Saisissez * pour consigner tous les modules.
  6. Cliquez sur OK dans la fenêtre Module Names (Noms des modules).
  7. Cliquez sur OK dans la fenêtre Module Logging (Journalisation des modules).
  8. Exécutez gpupdate /force pour appliquer la règle.

Les événements de journalisation des modules sont écrits dans le journal des événements Windows PowerShell avec l'ID d'événement 4103.

Facultatif : Activer la transcription

La transcription crée un enregistrement textuel de toutes les entrées et sorties de la session PowerShell. Pour activer la transcription, procédez comme suit :

  1. Dans l'Éditeur de stratégie de groupe local, accédez à Configuration ordinateur > Modèles d'administration > Composants Windows > Windows PowerShell.
  2. Double-cliquez sur Turn on PowerShell Transcription (Activer la transcription PowerShell).
  3. Sélectionnez Activé.
  4. Vous pouvez également spécifier un répertoire de sortie des transcriptions. Si vous le laissez vide, les transcriptions sont enregistrées dans le dossier "Documents" de chaque utilisateur.
  5. Cochez Inclure les en-têtes d'invocation pour inclure les codes temporels et les métadonnées.
  6. Cliquez sur OK.
  7. Exécutez gpupdate /force pour appliquer la règle.

Les transcriptions sont écrites dans des fichiers texte dont le nom commence par PowerShell_transcript.

Obtenir le fichier d'authentification d'ingestion Google SecOps

  1. Connectez-vous à la console Google SecOps.
  2. Accédez à Paramètres du SIEM > Agent de collecte.
  3. Cliquez sur Télécharger pour télécharger le fichier d'authentification pour l'ingestion.
  4. Enregistrez le fichier de manière sécurisée sur l'hôte Windows sur lequel l'agent 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

Installez l'agent BindPlane sur votre hôte Windows en suivant les instructions ci-dessous.

Installation de fenêtres

  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
    
  3. Attendez la fin de l'installation.

  4. Vérifiez l'installation en exécutant la commande suivante :

    sc query observiq-otel-collector
    

    Le service doit être indiqué comme RUNNING (EN COURS D'EXÉCUTION).

Autres ressources d'installation

Pour obtenir d'autres options d'installation et des conseils de dépannage, consultez le guide d'installation de l'agent Bindplane.

Configurer l'agent Bindplane pour collecter les journaux PowerShell

Localiser le fichier de configuration Windows

  • Localisez le fichier de configuration Windows comme suit :

    notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
    

Modifiez le fichier de configuration

  • Remplacez l'intégralité du contenu de config.yaml par la configuration suivante :

    receivers:
      windowseventlog/powershell:
        channel: Microsoft-Windows-PowerShell/Operational
        max_reads: 100
        poll_interval: 5s
        raw: true
        start_at: end
    
    processors:
      batch:
    
    exporters:
      chronicle/powershell:
        compression: gzip
        creds_file_path: 'C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json'
        customer_id: '<CUSTOMER_ID>'
        endpoint: malachiteingestion-pa.googleapis.com
        log_type: 'POWERSHELL'
        raw_log_field: body
        override_log_type: false
    
    service:
      pipelines:
        logs/powershell:
          receivers:
            - windowseventlog/powershell
          processors:
            - batch
          exporters:
            - chronicle/powershell
    

Paramètres de configuration

Remplacez les espaces réservés suivants :

  • Configuration du récepteur :

    • channel : canal du journal d'événements Windows à partir duquel collecter les données. Pour la journalisation des blocs de script PowerShell, utilisez Microsoft-Windows-PowerShell/Operational. Pour la journalisation des modules, utilisez Windows PowerShell.
    • raw : définissez la valeur sur true pour envoyer le code XML brut du journal d'événements Windows à Google SecOps.
    • start_at : définissez sur end pour ne collecter que les nouveaux événements après le démarrage de l'agent. Définissez la valeur sur beginning pour collecter tous les événements existants.
  • Configuration de l'exportateur :

    • <CUSTOMER_ID> : remplacez par l'ID client de l'étape précédente.
    • creds_file_path : chemin d'accès complet au fichier d'authentification de l'ingestion. Copiez le fichier d'authentification téléchargé à cet emplacement.
    • endpoint : URL du point de terminaison régional. Utilisez le point de terminaison pour votre région Google SecOps :

      • États-Unis : malachiteingestion-pa.googleapis.com
      • Europe : europe-malachiteingestion-pa.googleapis.com
      • Asie : asia-southeast1-malachiteingestion-pa.googleapis.com
      • Pour obtenir la liste complète, consultez Points de terminaison régionaux.
    • log_type : défini sur POWERSHELL pour utiliser l'analyseur PowerShell.

Enregistrez le fichier de configuration.

Une fois les modifications effectuées, enregistrez le fichier en cliquant sur Fichier > Enregistrer.

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

Windows

  • À l'aide de l'invite de commandes ou de PowerShell en tant qu'administrateur :

    net stop observiq-otel-collector && net start observiq-otel-collector
    
  • Ou en utilisant la console Services :

    1. Appuyez sur Win+R, saisissez services.msc, puis appuyez sur Entrée.
    2. Localisez observIQ OpenTelemetry Collector.
    3. Effectuez un clic droit, puis sélectionnez Redémarrer.
    4. Vérifiez que le service est en cours d'exécution :

      sc query observiq-otel-collector
      
    5. Recherchez les erreurs dans les journaux :

      type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
      

Vérifier l'ingestion des journaux

Après avoir configuré l'agent Bindplane et redémarré le service, les journaux PowerShell devraient commencer à être envoyés vers Google SecOps.

  1. Connectez-vous à la console Google SecOps.
  2. Accédez à Examiner > Recherche.
  3. Exécutez la recherche suivante pour vérifier que les journaux PowerShell sont ingérés :

    metadata.log_type = "POWERSHELL"
    
  4. Vérifiez que les événements s'affichent avec des codes temporels récents.

Les événements de journalisation des blocs de script PowerShell (ID d'événement 4104) s'affichent avec des détails sur les blocs de script exécutés, y compris le contenu du script, l'ID du bloc de script et le contexte d'exécution.

Table de mappage UDM

Champ de journal Mappage UDM Logique
HostId principal.resource.product_object_id Identifiant unique de l'objet produit associé à la ressource principale
System.Version metadata.product_version Version du produit ayant généré l'événement
System.EventId, EventID, winlog.event_id metadata.product_event_type Type d'événement tel que défini par le produit
Ordinateur, System.Computer, ordinateur, winlog.computer_name principal.hostname Nom d'hôte de l'entité principale
Ordinateur, System.Computer, ordinateur, winlog.computer_name principal.asset.hostname Nom d'hôte de l'élément associé au principal
System.EventRecordID, RecordNumber, winlog.record_id metadata.product_log_id Identifiant unique de l'entrée de journal dans le système de journalisation du produit
System.Opcode, opcode, winlog.opcode metadata.description Description de l'événement ou contexte supplémentaire
ProviderGuid, winlog.provider_guid metadata.product_deployment_id Identifiant unique du déploiement du produit
System.ProcessID, ProcessID, ExecutionProcessID, execution.process_id, winlog.process.pid principal.process.pid ID du processus principal
SourceModuleName principal.resource.name Nom de la ressource associée au compte principal
SourceModuleType principal.resource.resource_subtype Sous-type de la ressource associée au principal
security.user_id, UserID, winlog.user.identifier principal.user.windows_sid Identificateur de sécurité (SID) Windows pour l'utilisateur principal
metadata.event_type Type d'événement (par exemple, USER_LOGIN, NETWORK_CONNECTION)
SourceName, winlog.provider_name metadata.product_name Nom du produit qui a généré l'événement
AccountName, Username, UserName, winlog.user.name principal.user.userid ID utilisateur de l'utilisateur principal
Domaine, winlog.user.domain principal.administrative_domain Domaine administratif du mandant
Path, target_file, ScriptName, script_name, ContextInfo_Script Name, file_path target.process.file.full_path Chemin d'accès complet au fichier associé au processus cible
HostName, powershell.Host Name, ContextInfo_Host Name target.hostname Nom d'hôte de l'entité cible
HostName, powershell.Host Name, ContextInfo_Host Name target.asset.hostname Nom d'hôte de l'élément associé à la cible
ID de l'hôte, HostID, ContextInfo_Host ID target.asset.asset_id Identifiant unique de l'asset cible
Nombre_de_comando, ContextInfo_Command Name, CommandName target.application Nom de l'application associée à la cible
HostApplication, ContextInfo_Host Application target.process.command_line Ligne de commande utilisée pour lancer le processus cible
ScriptBlockText target.process.command_line Ligne de commande utilisée pour lancer le processus cible
MessageSourceAddress principal.ip Adresse IP du principal
MessageSourceAddress principal.asset.ip Adresse IP de l'élément associé au principal
Nombre_de_host principal.application Nom de l'application associée au principal
Version_de_host principal.platform_version Version de la plate-forme associée au compte principal
Id_de_host principal.resource.id Identifiant unique de la ressource principale
Application_host principal.process.file.full_path Chemin d'accès complet au fichier associé au processus principal
HostApplication principal.process.command_line Ligne de commande utilisée pour lancer le processus principal
Usuario, admin_domain principal.user.userid ID utilisateur de l'utilisateur principal
Usuario, admin_domain principal.administrative_domain Domaine administratif du mandant
CommandLine principal.process.command_line Ligne de commande utilisée pour lancer le processus principal
Machine, machine_id principal.asset.asset_id Identifiant unique de l'asset principal
Machine, platform_software principal.asset.platform_software.platform Type de plate-forme de l'asset (par exemple, WINDOWS, LINUX)
Machine, platform_software principal.asset.platform_software.platform_version Version du logiciel de la plate-forme sur le composant
MessageSourceAddress intermediary.ip Adresse IP de l'entité intermédiaire
MessageSourceAddress, Hostname intermediary.hostname Nom d'hôte de l'entité intermédiaire
MessageSourceAddress, Hostname intermediary.asset.hostname Nom d'hôte de l'élément associé à l'intermédiaire
MessageSourceAddress intermediary.port Numéro de port utilisé par l'intermédiaire
HostApplication target.process.command_line Ligne de commande utilisée pour lancer le processus cible
HostId target.asset.asset_id Identifiant unique de l'asset cible
SequenceNumber, ContextInfo_Sequence Number, Sequence Number security_result.detection_fields Paires clé/valeur d'informations de détection supplémentaires
ProviderName principal.resource.attribute.labels Libellés ou attributs associés à la ressource principale
NewEngineState additional.fields Champs personnalisés supplémentaires non couverts par le schéma UDM standard
PreviousEngineState additional.fields Champs personnalisés supplémentaires non couverts par le schéma UDM standard
ScriptName additional.fields Champs personnalisés supplémentaires non couverts par le schéma UDM standard
ManagementGroupName additional.fields Champs personnalisés supplémentaires non couverts par le schéma UDM standard
Source additional.fields Champs personnalisés supplémentaires non couverts par le schéma UDM standard
RenderedDescription security_result.description Description du résultat de sécurité ou de l'action entreprise
TenantId additional.fields Champs personnalisés supplémentaires non couverts par le schéma UDM standard
Nom d'utilisateur principal.user.userid ID utilisateur de l'utilisateur principal
ActivityID security_result.detection_fields Paires clé/valeur d'informations de détection supplémentaires
ExecutionThreadID, execution.thread_id, winlog.process.thread.id security_result.detection_fields Paires clé/valeur d'informations de détection supplémentaires
Sortie security_result.detection_fields Paires clé/valeur d'informations de détection supplémentaires
Données security_result.detection_fields Paires clé/valeur d'informations de détection supplémentaires
Data_1 additional.fields Champs personnalisés supplémentaires non couverts par le schéma UDM standard
data_1 security_result.detection_fields Paires clé/valeur d'informations de détection supplémentaires
Data_2 security_result.detection_fields Paires clé/valeur d'informations de détection supplémentaires
winlog.activity_id security_result.detection_fields Paires clé/valeur d'informations de détection supplémentaires
winlog.api additional.fields Champs personnalisés supplémentaires non couverts par le schéma UDM standard
winlog.channel principal.resource.attribute.labels Libellés ou attributs associés à la ressource principale
Décalage (offset) additional.fields Champs personnalisés supplémentaires non couverts par le schéma UDM standard
SeverityValue security_result.detection_fields Paires clé/valeur d'informations de détection supplémentaires
intermédiaire intermédiaire Informations sur les entités intermédiaires impliquées dans l'événement
security_result security_result Résultat global de sécurité, y compris les actions, les niveaux de gravité et les détections
metadata.vendor_name Nom du fournisseur qui a produit l'événement
SourceName metadata.product_name Nom du produit qui a généré l'événement

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