Collecter les journaux Microsoft Defender pour IoT (CyberX)
Ce document explique comment ingérer les journaux Microsoft Defender for IoT (CyberX) dans Google Security Operations à l'aide de Bindplane.
Microsoft Defender for IoT (anciennement CyberX) est une plate-forme de sécurité IoT/OT sans agent qui permet de découvrir les ressources, de gérer les failles et de surveiller en continu les menaces pour les environnements de systèmes de contrôle industriel (ICS) et de technologies opérationnelles (OT). Il détecte les comportements anormaux et les menaces connues sur les réseaux IoT/OT sans impacter les processus opérationnels. L'analyseur extrait les champs des journaux syslog et au format clé-valeur de CyberX. Il utilise grok et/ou kv pour analyser le message du journal, puis mappe ces valeurs au modèle de données unifié (UDM). Il définit également les valeurs de métadonnées par défaut pour la source et le type d'événement.
Avant de commencer
Assurez-vous de remplir les conditions suivantes :
- Une instance Google SecOps
- Windows Server 2016 ou version ultérieure, ou hôte Linux avec
systemd - 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 privilégié à la console du capteur Microsoft Defender pour IoT
Obtenir le fichier d'authentification d'ingestion Google SecOps
- Connectez-vous à la console Google SecOps.
- Accédez à Paramètres du 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 sur lequel 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 système d'exploitation Windows ou Linux 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-collector
Le service doit être indiqué comme RUNNING (EN COURS D'EXÉCUTION).
Installation de Linux
- Ouvrez un terminal avec les droits root ou sudo.
Exécutez la commande suivante :
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.shAttendez la fin de l'installation.
Vérifiez l'installation en exécutant la commande suivante :
sudo systemctl status observiq-otel-collector
Le service doit être indiqué comme actif (en cours d'exécution).
Autres ressources d'installation
Pour obtenir d'autres options d'installation et de dépannage, consultez le guide d'installation de l'agent Bindplane.
Configurer l'agent Bindplane pour ingérer les journaux syslog et les envoyer à Google SecOps
Localiser le fichier de configuration
Linux :
sudo nano /etc/bindplane-agent/config.yamlWindows :
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: udplog: listen_address: "0.0.0.0:514" exporters: chronicle/chronicle_w_labels: compression: gzip creds_file_path: '/path/to/ingestion-authentication-file.json' customer_id: 'YOUR_CUSTOMER_ID' endpoint: malachiteingestion-pa.googleapis.com log_type: 'CYBERX' raw_log_field: body ingestion_labels: service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - udplog exporters: - chronicle/chronicle_w_labels
Paramètres de configuration
Remplacez les espaces réservés suivants :
Configuration du récepteur :
udplog: utilisezudplogpour syslog UDP outcplogpour syslog TCP.0.0.0.0: adresse IP à écouter (0.0.0.0pour écouter sur toutes les interfaces)514: numéro de port à écouter (port syslog standard)
Configuration de l'exportateur :
creds_file_path: chemin d'accès complet au fichier d'authentification de l'ingestion :- Linux :
/etc/bindplane-agent/ingestion-auth.json - Windows :
C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json
- Linux :
YOUR_CUSTOMER_ID: ID client de la section "Obtenir l'ID client"endpoint: URL du point de terminaison régional :- É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: type de journal tel qu'il apparaît dans Chronicle (CYBERX)
Enregistrez le fichier de configuration.
- Après avoir modifié le fichier, enregistrez-le :
- Linux : appuyez sur
Ctrl+O, puis surEnter, puis surCtrl+X. - Windows : cliquez sur Fichier > Enregistrer.
- Linux : appuyez sur
Redémarrez l'agent Bindplane pour appliquer les modifications.
Pour redémarrer l'agent Bindplane sous Linux, exécutez la commande suivante :
sudo systemctl restart observiq-otel-collectorVérifiez que le service est en cours d'exécution :
sudo systemctl status observiq-otel-collectorRecherchez les erreurs dans les journaux :
sudo journalctl -u observiq-otel-collector -f
Pour redémarrer l'agent Bindplane dans Windows, choisissez l'une des options suivantes :
Invite de commandes ou PowerShell en tant qu'administrateur :
net stop observiq-otel-collector && net start observiq-otel-collectorConsole 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
Configurer le transfert Syslog sur Microsoft Defender pour IoT (CyberX)
- Connectez-vous à la console du capteur Microsoft Defender for IoT (anciennement CyberX).
- Accédez à Paramètres système > Transfert.
- Cliquez sur Ajouter (ou sur +) pour créer une règle de transfert.
- Fournissez les informations de configuration suivantes :
- Nom de la règle : saisissez un nom descriptif (par exemple,
Google-SecOps-Bindplane). - Gravité : sélectionnez Toutes (ou sélectionnez des niveaux de gravité spécifiques : mineure, majeure, critique).
- Protocole : sélectionnez Tous (ou sélectionnez des protocoles spécifiques à surveiller).
- Moteur : sélectionnez Tous (ou sélectionnez des moteurs de détection spécifiques).
- Action : sélectionnez Envoyer Syslog.
- Nom de la règle : saisissez un nom descriptif (par exemple,
- Dans la configuration Serveur Syslog :
- Hôte : saisissez l'adresse IP de l'hôte de l'agent Bindplane.
- Port : saisissez
514. - Protocole : sélectionnez UDP.
- Format : sélectionnez CEF (Common Event Format).
- Fuseau horaire : sélectionnez UTC (recommandé).
- Cliquez sur Enregistrer.
- Activez la règle de transfert en la définissant sur Active.
- Vérifiez que les messages syslog sont envoyés en consultant les journaux de l'agent Bindplane.
Table de mappage UDM
| Champ de journal | Mappage UDM | Logique |
|---|---|---|
| Masque d'accès | security_result.detection_fields.value | Valeur de access_mask à partir de access_request_kvdata analysé |
| Domaine du compte | principal.administrative_domain | Valeur de "principal_domain" à partir de "principal_kvdata" analysé |
| Domaine du compte | target.administrative_domain | Valeur de target_domain à partir de target_kvdata analysé |
| Nom du compte | principal.user.userid | Valeur de principal_account_name à partir de principal_kvdata analysé |
| Nom du compte | target.user.userid | Valeur de target_account_name à partir de target_kvdata analysé |
| action | security_result.action_details | Valeur de l'action |
| action | security_result.action | Dérivé. Si l'action est "accept", "passthrough", "pass", "permit", "detected" ou "close", mappez-la sur "ALLOW". Si l'action est "deny", "dropped" ou "blocked", mappez-la sur "BLOCK". Si l'action est "timeout", mappez-la sur "ÉCHEC". Sinon, mappez sur "UNKNOWN_ACTION". |
| Nom de l'algorithme | security_result.detection_fields.value | Valeur de algorithm_name à partir de cryptographic_kvdata analysé |
| application | target.application | Valeur du service si app_protocol_output est vide |
| appcat | security_result.detection_fields.value | Valeur de appcat |
| Nom de l'application | principal.application | Valeur de application_name |
| package d'authentification | security_result.about.resource.name | Valeur de authentication_package |
| Alerte Azure Defender pour IoT | security_result.detection_fields.value | Valeur de azure_defender_for_iot_alert |
| channel | security_result.detection_fields.value | Valeur du canal |
| Adresse du client | principal.ip, principal.asset.ip | Valeur de source_ip |
| Port client | principal.port | Valeur de source_port |
| craction | security_result.detection_fields.value | Valeur de la fraction |
| Les identifiants du Gestionnaire d'identifiants ont été sauvegardés | security_result.description | Valeur de la description |
| Les identifiants Credential Manager ont été lus. | security_result.description | Valeur de la description |
| crscore | security_result.severity_details | Valeur de crscore |
| crlevel | security_result.severity, security_result.severity_details | Valeur de crlevel. Si crlevel est défini sur "HIGH", "MEDIUM", "LOW" ou "CRITICAL", mappez-le sur le niveau de gravité UDM correspondant. |
| Opération de chiffrement | metadata.description | Valeur de product_desc |
| Nom de la plate-forme CyberX | security_result.detection_fields.value | Valeur de cyberx_platform_name |
| Description | security_result.description | Valeur de la description si le message est vide |
| Destination | target.ip, target.asset.ip ou target.hostname | Si la destination est une adresse IP, mappez-la sur target.ip et target.asset.ip. Sinon, mappez sur target.hostname. |
| Adresse de destination | target.ip, target.asset.ip | Valeur de destination_ip à partir de network_information analysé |
| DRA de destination | target.resource.name | Valeur de destination_dra |
| Adresse IP de destination | target.ip, target.asset.ip | Valeur de destination_ip |
| Port de destination | target.port | Valeur de destination_port à partir de network_information analysé |
| devid | principal.resource.product_object_id | Valeur de devid |
| devname | principal.resource.name | Valeur de devname |
| Direction | network.direction | Si la direction est "incoming", "inbound" ou "response", mappez-la sur "INBOUND". Si la direction est "outgoing", "outbound" ou "request", mappez-la sur "OUTBOUND". |
| dstip | target.ip, target.asset.ip | Valeur de dstip si destination_ip est vide |
| dstcountry | target.location.country_or_region | Valeur de dstcountry |
| dstintf | security_result.detection_fields.value | Valeur de dstintf |
| dstintfrole | security_result.detection_fields.value | Valeur de dstintfrole |
| dstosname | target.platform | Valeur de dstosname si elle est "WINDOWS", "LINUX" ou "MAC". |
| dstport | target.port | Valeur de dstport si destination_port est vide |
| dstswversion | target.platform_version | Valeur de dstswversion |
| duration | network.session_duration.seconds | Valeur de la durée |
| event_id | security_result.rule_name | Utilisé pour construire le nom de la règle sous la forme "EventID: %{event_id}" |
| event_in_sequence | security_result.detection_fields.value | Valeur de event_in_sequence |
| ID d'exécution du filtre | security_result.detection_fields.value | Valeur de filter_run_time_id à partir de filter_information analysé |
| Adhésion à des groupes | security_result.detection_fields.value | Valeur de group_membership si event_id n'est pas 4627 |
| Adhésion à des groupes | target.user.group_identifiers | Valeurs de group_membership analysées si event_id est défini sur 4627 |
| handle_id | security_result.detection_fields.value | Valeur de handle_id à partir de object_kvdata analysé |
| ID du compte | security_result.detection_fields.value | Valeur de handle_id à partir de object_kvdata analysé |
| impersonation_level | security_result.detection_fields.value | Valeur de "impersonation_level" à partir de "logon_information_kvdata" analysé |
| Longueur de la clé | security_result.detection_fields.value | Valeur de key_length à partir de auth_kvdata analysé |
| Nom de clé | security_result.detection_fields.value | Valeur de key_name à partir de cryptographic_kvdata analysé |
| Type de clé | security_result.detection_fields.value | Valeur de key_type à partir de cryptographic_kvdata analysé |
| keywords | security_result.detection_fields.value | Valeur des mots clés |
| Nom du calque | security_result.detection_fields.value | Valeur de layer_name à partir de filter_information analysé |
| ID d'exécution du calque | security_result.detection_fields.value | Valeur de layer_run_time_id à partir de filter_information analysé |
| logid | metadata.product_log_id | Valeur de logid |
| GUID de connexion | principal.resource.product_object_id | Valeur de logon_guid |
| ID de connexion | security_result.detection_fields.value | Valeur de logon_id |
| logon_type | event.idm.read_only_udm.extensions.auth.mechanism | Dérivé. Si logon_type est défini sur "3", mappez-le sur "NETWORK". Si la valeur est "4", mappez-la sur "BATCH". Si la valeur est "5", mappez-la sur "SERVICE". Si la valeur est "8", mappez-la sur "NETWORK_CLEAR_TEXT". Si la valeur est "9", mappez-la sur "NEW_CREDENTIALS". Si la valeur est "10", mappez-la sur "REMOTE_INTERACTIVE". Si la valeur est "11", mappez-la sur "CACHED_INTERACTIVE". Sinon, s'il n'est pas vide, mappez-le sur "MECHANISM_OTHER". |
| Compte de connexion | security_result.detection_fields.value | Valeur de logon_id à partir de l'analyse grok |
| Processus de connexion | security_result.detection_fields.value | Valeur de logon_process à partir de auth_kvdata analysé |
| Libellé obligatoire | security_result.detection_fields.value | Valeur de mandatory_label |
| mastersrcmac | principal.mac | Valeur de mastersrcmac |
| Message | security_result.description | Valeur du message |
| new_process_id | target.process.pid | Valeur de new_process_id à partir de process_kvdata analysé |
| new_process_name | target.process.file.full_path | Valeur de new_process_name à partir de process_kvdata analysé |
| Nom de l'objet | security_result.detection_fields.value | Valeur de object_name à partir de object_kvdata analysé |
| Serveur d'objets | security_result.detection_fields.value | Valeur de object_server à partir de object_kvdata analysé |
| Type d'objet | security_result.detection_fields.value | Valeur de object_type à partir de object_kvdata analysé |
| osname | principal.platform | Valeur de osname si elle est "WINDOWS", "LINUX" ou "MAC". |
| Nom du package (NTLM uniquement) | security_result.detection_fields.value | Valeur de package_name à partir de auth_kvdata analysé |
| policyid | security_result.rule_id | Valeur de policyid |
| policyname | security_result.rule_name | Valeur de policyname |
| policytype | security_result.rule_type | Valeur de policytype |
| ID du processus | principal.process.pid | Valeur de process_id |
| Nom du processus | principal.process.file.full_path | Valeur de creator_process_name à partir de process_kvdata analysé |
| profile_changed | security_result.detection_fields.value | Valeur de profile_changed |
| Profil modifié | security_result.detection_fields.value | Valeur de "profile_changed" à partir de l'analyse grok |
| proto | network.ip_protocol | Si le proto est "17", mappez-le sur "UDP". Si le type ou le sous-type est "6" ou "wad", mappez-le sur "TCP". Si la valeur est "41", mappez-la sur "IP6IN4". Si le service est "PING", si le protocole est "1" ou si le service contient "ICMP", mappez-le sur "ICMP". |
| Protocole | network.application_protocol | Valeur de app_protocol_output dérivée de Protocol |
| Nom du fournisseur | security_result.detection_fields.value | Valeur de provider_name à partir de provider_kvdata ou cryptographic_kvdata analysés |
| rcvdbyte | network.received_bytes | Valeur de rcvdbyte |
| rcvdpkt | security_result.detection_fields.value | Valeur de rcvdpkt |
| restricted_admin_mode | security_result.detection_fields.value | Valeur de "restricted_admin_mode" à partir de "logon_information_kvdata" analysé |
| Code renvoyé | security_result.detection_fields.value | Valeur de return_code à partir de cryptographic_kvdata analysé |
| réponse | security_result.detection_fields.value | Valeur de la réponse |
| rule_id | security_result.rule_id | Valeur de rule_id |
| ID de sécurité | principal.user.windows_sid | Valeur de principal_security_id à partir de principal_kvdata analysé |
| ID de sécurité | target.user.windows_sid | Valeur de target_security_id à partir de target_kvdata analysé |
| sentbyte | network.sent_bytes | Valeur de sentbyte |
| sentpkt | security_result.detection_fields.value | Valeur de sentpkt |
| service | network.application_protocol ou target.application | Valeur de app_protocol_output dérivée du service. Si app_protocol_output est vide, mappez-le sur target.application. |
| ID du service | security_result.detection_fields.value | Valeur de service_id à partir de service_kvdata analysé |
| Nom du service | security_result.detection_fields.value | Valeur de service_name à partir de service_kvdata analysé |
| sessionid | network.session_id | Valeur de sessionid |
| Gravité | security_result.severity, security_result.severity_details | Si la gravité est "ERROR" (ERREUR) ou "CRITICAL" (CRITIQUE), mappez-la sur la gravité UDM correspondante. Si la valeur est "INFO", mappez-la sur "INFORMATIONAL". Si la valeur est "MINOR", mappez-la sur "LOW". Si la valeur est "WARNING", mappez-la sur "MEDIUM". Si la valeur est "MAJOR", mappez-la sur "HIGH". Mappez également la valeur brute à severity_details. |
| de gravité, | security_result.severity, security_result.severity_details | Si la gravité est "1", "2" ou "3", mappez-la sur "LOW". Si la valeur est "4", "5" ou "6", elle correspond à "MEDIUM". Si la valeur est "7", "8" ou "9", elle correspond à "HIGH". Mappez également la valeur brute à severity_details. |
| Nom de partage | security_result.detection_fields.value | Valeur de share_name à partir de share_information_kvdata analysé |
| Partager le chemin | security_result.detection_fields.value | Valeur de share_path à partir de share_information_kvdata analysé |
| Source | principal.ip, principal.asset.ip ou principal.hostname, principal.asset.hostname | Si la source est une adresse IP, mappez-la sur principal.ip et principal.asset.ip. Sinon, mappez sur principal.hostname et principal.asset.hostname. |
| Adresse source | principal.ip, principal.asset.ip | Valeur de source_ip à partir de network_information analysé |
| DRA source | principal.resource.name | Valeur de source_dra |
| Adresse IP source | principal.ip | Valeur de source_ip |
| Adresse réseau source | principal.ip, principal.asset.ip | Valeur de source_ip |
| Port source | principal.port | Valeur de source_port à partir de network_information analysé |
| Station de travail source | workstation_name | Valeur de source_workstation_name |
| srcip | source_ip | Valeur de srcip si source_ip est vide |
| srccountry | principal.location.country_or_region | Valeur de srccountry |
| srcmac | principal.mac | Valeur de srcmac |
| srcname | principal.hostname, principal.asset.hostname | Valeur de srcname |
| srcport | source_port | Valeur de srcport si source_port est vide |
| srcswversion | principal.platform_version | Valeur de srcswversion |
| Code d'état | network.http.response_code | Valeur de status_code |
| Type d'élévation du jeton | security_result.detection_fields.value | Valeur de token_elevation_type |
| transited_services | security_result.detection_fields.value | Valeur de transited_services à partir de auth_kvdata analysé |
| transip | principal.nat_ip | Valeur de la transip |
| transport | principal.nat_port | Valeur du transport |
| type | metadata.product_event_type | Utilisé avec le sous-type pour créer metadata.product_event_type |
| Type | security_result.detection_fields.value | Valeur du type |
| UUID | metadata.product_log_id | Valeur de l'UUID |
| vd | principal.administrative_domain | Valeur de vd |
| virtual_account | security_result.detection_fields.value | Valeur de virtual_account à partir de logon_information_kvdata analysé |
| Nom de la station de travail | principal.hostname, principal.asset.hostname | Valeur de workstation_name si aucun autre identifiant principal n'est présent |
| metadata.event_type | metadata.event_type | Dérivé. Si principal_present et target_present sont tous les deux définis sur "true", mappez sur "NETWORK_CONNECTION". Si user_present est défini sur "true", mappez-le sur "USER_RESOURCE_ACCESS". Si principal_present est défini sur "true", mappez-le sur "STATUS_UPDATE". Sinon, mappez-le sur "GENERIC_EVENT". |
| metadata.log_type | metadata.log_type | Codé en dur sur "CYBERX" |
| metadata.product_name | metadata.product_name | Codé en dur sur "CYBERX" |
| metadata.vendor_name | metadata.vendor_name | Codé en dur sur "CYBERX" |
| metadata.event_timestamp | metadata.event_timestamp | Copiée à partir du champ d'horodatage de premier niveau ou dérivée des champs "eventtime" ou "date et heure". |
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.