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 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
- 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é.
- 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.
- Cliquez sur OK.
- Ouvrez l'invite de commande en tant qu'administrateur et exécutez
gpupdate /forcepour 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 :
- 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 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 :
- Dans l'Éditeur de stratégie de groupe local, 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 des modules).
- 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 : 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 :
- Dans l'Éditeur de stratégie de groupe local, accédez à Configuration ordinateur > Modèles d'administration > Composants Windows > Windows PowerShell.
- Double-cliquez sur Turn on PowerShell Transcription (Activer la transcription PowerShell).
- Sélectionnez Activé.
- 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.
- Cochez Inclure les en-têtes d'invocation 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 le fichier d'authentification d'ingestion Google SecOps
- Connectez-vous à la console Google SecOps.
- Accédez à Paramètres du SIEM > Agent de collecte.
- Cliquez sur Télécharger pour télécharger le fichier d'authentification pour l'ingestion.
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
- Connectez-vous à la console Google SecOps.
- Accédez à Paramètres SIEM> Profil.
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
- Ouvrez l'invite de commandes 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 ê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.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: 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, 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 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.
- États-Unis :
log_type: défini surPOWERSHELLpour 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-collectorOu en utilisant la console Services :
- Appuyez sur
Win+R, saisissezservices.msc, puis appuyez sur Entrée. - Localisez observIQ OpenTelemetry Collector.
- Effectuez un clic droit, puis 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 vers Google SecOps.
- Connectez-vous à la console Google SecOps.
- Accédez à Examiner > Recherche.
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) 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.