Collecter les journaux Microsoft Defender pour IoT (CyberX)

Compatible avec :

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

  1. Connectez-vous à la console Google SecOps.
  2. Accédez à Paramètres du SIEM > Agents de collecte.
  3. 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

  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 système d'exploitation Windows ou Linux 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).

Installation de Linux

  1. Ouvrez un terminal avec les droits root ou sudo.
  2. Exécutez la commande suivante :

    sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
    
  3. Attendez la fin de l'installation.

  4. 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.yaml
    
  • Windows :

    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:
        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 : utilisez udplog pour syslog UDP ou tcplog pour syslog TCP.
      • 0.0.0.0 : adresse IP à écouter (0.0.0.0 pour é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
      • 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.
      • 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 sur Enter, puis sur Ctrl+X.
    • Windows : cliquez sur Fichier > Enregistrer.

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-collector
    
    1. Vérifiez que le service est en cours d'exécution :

        sudo systemctl status observiq-otel-collector
      
    2. Recherchez 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-collector
      
    • 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"
        

Configurer le transfert Syslog sur Microsoft Defender pour IoT (CyberX)

  1. Connectez-vous à la console du capteur Microsoft Defender for IoT (anciennement CyberX).
  2. Accédez à Paramètres système > Transfert.
  3. Cliquez sur Ajouter (ou sur +) pour créer une règle de transfert.
  4. 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.
  5. 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é).
  6. Cliquez sur Enregistrer.
  7. Activez la règle de transfert en la définissant sur Active.
  8. 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.