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 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 que les journaux puissent être collectés. 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. Vous pouvez également cocher l'option Log script block invocation start / stop events (Enregistrer les événements de démarrage/d'arrêt d'appel de bloc de script) pour capturer les événements de démarrage et d'arrêt de chaque bloc de script. Notez que cette option génère un volume élevé de journaux.
  6. Cliquez sur OK.
  7. Ouvrez l'invite de commande en tant qu'administrateur, puis exécutez gpupdate /force pour appliquer la règle immédiatement.

Activer la journalisation des blocs de script à 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 soit prise en compte.

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 locale, 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 du module).
  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 : Activez 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 locale, accédez à Configuration ordinateur > Modèles d'administration > Composants Windows > Windows PowerShell.
  2. Double-cliquez sur Activer la transcription PowerShell.
  3. Sélectionnez Activé.
  4. Vous pouvez également spécifier un répertoire de sortie de la transcription. Si vous ne renseignez pas ce champ, les transcriptions sont enregistrées dans le dossier "Documents" de chaque utilisateur.
  5. Cochez Inclure les en-têtes d'appel 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 les identifiants Google SecOps pour l'agent Bindplane

Pour authentifier l'agent Bindplane auprès de Google SecOps, choisissez l'une des méthodes suivantes :

  • Nouveaux déploiements : utilisez l'API Chronicle (option 1).
  • Anciens déploiements : continuez à utiliser le fichier d'authentification d'ingestion (option 2) jusqu'à l'arrêt de l'API Ingestion le 20 juillet 2027.
  1. Connectez-vous à la consoleGoogle Cloud et sélectionnez le projet Google Cloud associé à votre instance Google SecOps.
  2. Accédez à IAM et administration > Comptes de service.
  3. Cliquez sur Créer un compte de service.
  4. Fournissez les informations de configuration suivantes :
    • Nom du compte de service : saisissez un nom pour le compte (par exemple, bindplane-ingest).
    • Description du compte de service : saisissez une description (par exemple, Bindplane agent log ingestion).
  5. Cliquez sur Créer et continuer.
  6. Dans la section Autoriser ce compte de service à accéder au projet, cliquez sur Sélectionner un rôle, puis sélectionnez Éditeur Chronicle.
  7. Cliquez sur Continue (Continuer), puis sur Done (OK).
  8. Cliquez sur le compte de service que vous avez créé, puis accédez à l'onglet Clés.
  9. Cliquez sur Ajouter une clé > Créer une clé.
  10. Sélectionnez JSON, puis cliquez sur Créer. Le fichier de clé est téléchargé sur votre ordinateur.
  11. Enregistrez le fichier de clé sous le nom ingestion-auth.json dans le répertoire du collecteur BindPlane (/opt/observiq-otel-collector/ingestion-auth.json sous Linux ou C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json sous Windows), ou mettez à jour creds_file_path dans config.yaml pour qu'il corresponde au chemin d'accès où vous l'enregistrez.
  12. Accédez à IAM et administration > Paramètres, puis copiez le numéro du projet. Vous en aurez besoin pour la configuration de l'exportateur.

Option 2 : Télécharger le fichier d'authentification d'ingestion (ancienne méthode)

  1. Connectez-vous à la console Google SecOps.
  2. Accédez à Paramètres SIEM> Agents de collecte.
  3. Téléchargez le fichier d'authentification d'ingestion.
  4. Enregistrez le fichier de manière sécurisée sur le système où 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 dans 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 Windows

  1. Ouvrez l'invite de commande 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 s'afficher comme étant EN COURS D'EXÉCUTION.

Ressources d'installation supplémentaires

Pour en savoir plus sur les options d'installation et le 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

  • Recherchez 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:
        protocol: https
        # Region of your instance, for example us, europe, asia-southeast1
        location: <LOCATION>
        # Project number of the Google Cloud project linked to the instance
        project: '<PROJECT_NUMBER>'
        compression: gzip
        creds_file_path: 'C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json'
        customer_id: '<CUSTOMER_ID>'
        endpoint: chronicle.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 des é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 le numéro client de l'étape précédente.
    • creds_file_path : chemin d'accès complet au fichier de clé JSON du compte de service (option 1). Copiez le fichier d'identifiants à cet emplacement.
    • location : remplacez <LOCATION> par la région de votre instance Google SecOps (par exemple, us, europe ou asia-southeast1). L'exportateur ajoute cette valeur en préfixe à chronicle.googleapis.com. Pour obtenir la liste complète, consultez Points de terminaison régionaux.
    • project : remplacez <PROJECT_NUMBER> par le numéro de projet indiqué dans IAM et administration > Paramètres.
    • endpoint : laissez la valeur définie sur chronicle.googleapis.com.

    • log_type : définissez cette valeur sur POWERSHELL pour utiliser l'analyseur PowerShell.

Ancien exportateur d'API d'ingestion

  • Si vous utilisez le fichier d'authentification d'ingestion de l'option 2, remplacez le bloc exporters par ce qui suit. Définissez creds_file_path sur le chemin d'accès au fichier d'authentification de l'ingestion. Si votre instance se trouve en dehors des États-Unis, remplacez malachiteingestion-pa.googleapis.com par votre point de terminaison régional (par exemple, europe-malachiteingestion-pa.googleapis.com).

    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
    

Enregistrez le fichier de configuration.

Après avoir modifié le fichier, enregistrez-le 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
    
  • Vous pouvez également utiliser 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 et 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 à Google SecOps.

  1. Connectez-vous à la console Google SecOps.
  2. Accédez à Examiner > Rechercher.
  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) affichent des informations 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 du 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
Computer, System.Computer, computer, winlog.computer_name principal.asset.hostname Nom d'hôte de l'élément associé au compte 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 Identifiant de processus 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 Identifiant de sécurité Windows (SID) de 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'asset 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 compte principal
Nombre_de_host principal.application Nom de l'application associée au compte 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'élément (par exemple, WINDOWS, LINUX)
Machine, platform_software principal.asset.platform_software.platform_version Version du logiciel de la plate-forme sur l'élément
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 Étiquettes 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 effectuée
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 Étiquettes 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 de sécurité global, 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 ayant généré l'événement
syslog_host event.idm.read_only_udm.intermediary.hostname Mappé à partir du journal des modifications
Computer event.idm.read_only_udm.intermediary.hostname Mappé à partir du journal des modifications
Version event.idm.read_only_udm.metadata.product_version Mappé à partir du journal des modifications
Task event.idm.read_only_udm.security_result.detection_fields Mappé à partir du journal des modifications
OpcodeValue event.idm.read_only_udm.security_result.detection_fields Mappé à partir du journal des modifications
ThreadID event.idm.read_only_udm.security_result.detection_fields Mappé à partir du journal des modifications
AccountType event.idm.read_only_udm.security_result.detection_fields Mappé à partir du journal des modifications
Offset event1.idm.read_only_udm.additional.fields Mappé à partir du journal des modifications
SeverityValue event1.idm.read_only_udm.additional.fields Mappé à partir du journal des modifications
NewEngineState", "PreviousEngineState", "HostVersion", "RunspaceId", "SequenceNumber", "EngineVersion" and "PipelineId additional.fields Mappé à partir du journal des modifications
Payload security_result.detection_fields Mappé à partir du journal des modifications
Script Name target.file.full_path Mappé à partir du journal des modifications
SystemTime metadata.event_timestamp Mappé à partir du journal des modifications
channel", "keywords", "MessageNumber", "MessageTotal", and "ScriptBlockId security_result.detection_fields Mappé à partir du journal des modifications
System.ProviderName principal.resource.attribute.labels Mappé à partir du journal des modifications
HostVersion", "RunspaceId", "PipelineId", "EngineVersion", "DetailSequence", "DetailTotal", "SequenceNumber", and "ScriptName additional.fields Mappé à partir du journal des modifications
System.EventRecordID", "System.Task", "System.Keywords", "System.Opcode", and "System.ThreadID security.detection_fields Mappé à partir du journal des modifications
EventLevelName security_result.severity Mappé à partir du journal des modifications
ManagementGroupName", "Source", "TenantId additional_fields Mappé à partir du journal des modifications

Journal des modifications

Afficher le journal des modifications de cet analyseur

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