Collecter les journaux Microsoft PowerShell
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
- Ouvrez l'éditeur de stratégie de groupe locale en exécutant
gpedit.mscen tant qu'administrateur. - Accédez à Configuration ordinateur> Modèles d'administration> Composants Windows> Windows PowerShell.
- Double-cliquez sur Activer la journalisation des blocs de script PowerShell.
- Sélectionnez Activé.
- 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.
- Cliquez sur OK.
- Ouvrez l'invite de commande en tant qu'administrateur, puis exécutez
gpupdate /forcepour 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 :
- Ouvrez l'Éditeur du Registre en exécutant
regediten tant qu'administrateur. - Accédez à
HKLM\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging. - Si la clé n'existe pas, créez-la.
- Créez une valeur DWORD 32 bits nommée
EnableScriptBlockLogginget définissez sa valeur sur1. - 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 :
- Dans l'éditeur de stratégie de groupe locale, accédez à Configuration ordinateur > Modèles d'administration > Composants Windows > Windows PowerShell.
- Double-cliquez sur Activer la journalisation des modules.
- Sélectionnez Activé.
- Cliquez sur Afficher à côté de Noms des modules.
- Saisissez
*pour consigner tous les modules. - Cliquez sur OK dans la fenêtre Module Names (Noms des modules).
- Cliquez sur OK dans la fenêtre Module Logging (Journalisation du module).
- Exécutez
gpupdate /forcepour 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 :
- Dans l'Éditeur de stratégie de groupe locale, accédez à Configuration ordinateur > Modèles d'administration > Composants Windows > Windows PowerShell.
- Double-cliquez sur Activer la transcription PowerShell.
- Sélectionnez Activé.
- 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.
- Cochez Inclure les en-têtes d'appel pour inclure les codes temporels et les métadonnées.
- Cliquez sur OK.
- Exécutez
gpupdate /forcepour 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.
Option 1 : Créer un compte de service pour l'API Chronicle (recommandé)
- Connectez-vous à la consoleGoogle Cloud et sélectionnez le projet Google Cloud associé à votre instance Google SecOps.
- Accédez à IAM et administration > Comptes de service.
- Cliquez sur Créer un compte de service.
- 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).
- Nom du compte de service : saisissez un nom pour le compte (par exemple,
- Cliquez sur Créer et continuer.
- Dans la section Autoriser ce compte de service à accéder au projet, cliquez sur Sélectionner un rôle, puis sélectionnez Éditeur Chronicle.
- Cliquez sur Continue (Continuer), puis sur Done (OK).
- Cliquez sur le compte de service que vous avez créé, puis accédez à l'onglet Clés.
- Cliquez sur Ajouter une clé > Créer une clé.
- Sélectionnez JSON, puis cliquez sur Créer. Le fichier de clé est téléchargé sur votre ordinateur.
- Enregistrez le fichier de clé sous le nom
ingestion-auth.jsondans le répertoire du collecteur BindPlane (/opt/observiq-otel-collector/ingestion-auth.jsonsous Linux ouC:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.jsonsous Windows), ou mettez à jourcreds_file_pathdansconfig.yamlpour qu'il corresponde au chemin d'accès où vous l'enregistrez. - 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)
- Connectez-vous à la console Google SecOps.
- Accédez à Paramètres SIEM> Agents de collecte.
- Téléchargez le fichier d'authentification d'ingestion.
- 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
- Connectez-vous à la console Google SecOps.
- Accédez à Paramètres SIEM > Profil.
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
- Ouvrez l'invite de commande ou PowerShell en tant qu'administrateur.
Exécutez la commande suivante :
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quietAttendez la fin de l'installation.
Vérifiez l'installation en exécutant la commande suivante :
sc query observiq-otel-collectorLe 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.yamlpar 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, utilisezMicrosoft-Windows-PowerShell/Operational. Pour la journalisation des modules, utilisezWindows PowerShell.raw: définissez la valeur surtruepour envoyer le code XML brut du journal d'événements Windows à Google SecOps.start_at: définissez surendpour ne collecter que les nouveaux événements après le démarrage de l'agent. Définissez la valeur surbeginningpour 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,europeouasia-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 surchronicle.googleapis.com.log_type: définissez cette valeur surPOWERSHELLpour 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
exporterspar ce qui suit. Définissezcreds_file_pathsur le chemin d'accès au fichier d'authentification de l'ingestion. Si votre instance se trouve en dehors des États-Unis, remplacezmalachiteingestion-pa.googleapis.compar 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-collectorVous pouvez également utiliser la console Services :
- Appuyez sur
Win+R, saisissezservices.msc, puis appuyez sur Entrée. - Localisez observIQ OpenTelemetry Collector.
- Effectuez un clic droit et sélectionnez Redémarrer.
Vérifiez que le service est en cours d'exécution :
sc query observiq-otel-collectorRecherchez les erreurs dans les journaux :
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
- Appuyez sur
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.
- Connectez-vous à la console Google SecOps.
- Accédez à Examiner > Rechercher.
Exécutez la recherche suivante pour vérifier que les journaux PowerShell sont ingérés :
metadata.log_type = "POWERSHELL"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.