Collecter les journaux Juniper Junos

Compatible avec :

Ce document explique comment ingérer des journaux Juniper Junos dans Google Security Operations à l'aide de Bindplane.

Juniper Junos OS est le système d'exploitation qui alimente les routeurs, les commutateurs et les dispositifs de sécurité Juniper Networks. Il fournit une plate-forme unifiée pour la gestion de l'infrastructure réseau, le routage, la commutation et les fonctions de sécurité, avec une journalisation complète des événements système, des événements de sécurité et du trafic réseau. L'analyseur extrait les champs des journaux syslog et des journaux au format clé-valeur de Juniper Junos. Il utilise grok et/ou kv pour analyser le message de journal, puis mappe ces valeurs au modèle de données unifié (UDM). Il définit également des 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é à l'appareil Juniper exécutant Junos OS

Obtenir des 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 sur lequel 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 Détails de 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 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.

Installation de Linux

  1. Ouvrez un terminal avec des droits d'accès racine 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).

Ressources d'installation supplémentaires

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 /opt/observiq-otel-collector/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:
        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: '/path/to/ingestion-authentication-file.json'
        customer_id: 'YOUR_CUSTOMER_ID'
        endpoint: chronicle.googleapis.com
        log_type: 'JUNIPER_JUNOS'
        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 sur laquelle écouter (0.0.0.0 pour écouter sur toutes les interfaces)
      • 514 : numéro de port sur lequel écouter (port syslog standard)
    • Configuration de l'exportateur :

      • creds_file_path : chemin d'accès complet au fichier de clé JSON du compte de service (option 1) :
        • Linux : /opt/observiq-otel-collector/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"
      • 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 : type de journal tel qu'il apparaît dans Chronicle (JUNIPER_JUNOS)

Ancien exportateur d'API d'ingestion

  • Si vous utilisez le fichier d'authentification d'ingestion de l'option 2, remplacez le bloc exporters par le code suivant. Définissez creds_file_path sur le chemin d'accès au fichier d'authentification d'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/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: 'JUNIPER_JUNOS'
        raw_log_field: body
        ingestion_labels:
    

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 sous Windows, choisissez l'une des options suivantes :

    • Invite de commande 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. Recherchez 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"
        

Configurer le transfert Syslog sur Juniper Junos

  1. Connectez-vous à l'appareil Juniper via SSH ou la console.
  2. Passez en mode de configuration :

    configure
    
  3. Configurez l'hôte syslog à l'aide des commandes suivantes :

    set system syslog host BINDPLANE_IP any info
    set system syslog host BINDPLANE_IP port 514
    set system syslog host BINDPLANE_IP facility-override local7
    set system syslog host BINDPLANE_IP log-prefix JUNOS
    
    • Remplacez BINDPLANE_IP par l'adresse IP de l'hôte de l'agent Bindplane.
  4. Configurez des sources de journaux supplémentaires (facultatif, mais recommandé) :

    set system syslog host BINDPLANE_IP authorization info
    set system syslog host BINDPLANE_IP daemon info
    set system syslog host BINDPLANE_IP kernel info
    set system syslog host BINDPLANE_IP firewall any
    set system syslog host BINDPLANE_IP interactive-commands info
    
  5. Configurez les données syslog structurées (facultatif pour une analyse améliorée) :

    set system syslog host BINDPLANE_IP structured-data
    
  6. Validez la configuration :

    commit and-quit
    
  7. Vérifiez la configuration de syslog :

    show system syslog host BINDPLANE_IP
    
  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
DPT target.port Port de destination de la connexion réseau, converti en entier.
DST target.ip Adresse IP de destination de la connexion réseau.
FLAG additional.fields{}.key: "FLAG", additional.fields{}.value.string_value: Valeur de FLAG Option TCP associée à la connexion réseau.
ID additional.fields{}.key: "ID", additional.fields{}.value.string_value: Valeur de l'ID Champ d'identification IP.
IN additional.fields{}.key: "IN", additional.fields{}.value.string_value: Valeur de IN Interface réseau entrante.
LEN additional.fields{}.key: "LEN", additional.fields{}.value.string_value: Valeur de LEN Longueur du paquet IP.
MAC principal.mac Adresse MAC extraite du champ MAC.
SORTIE additional.fields{}.key: "OUT", additional.fields{}.value.string_value: Valeur de OUT Interface réseau sortante.
PREC additional.fields{}.key: "PREC", additional.fields{}.value.string_value: Valeur de PREC Champ de priorité dans l'en-tête IP.
PROTO network.ip_protocol Protocole IP utilisé dans la connexion réseau.
RES additional.fields{}.key: "RES", additional.fields{}.value.string_value: Valeur de RES Champ réservé dans l'en-tête TCP.
SPT principal.port Port source de la connexion réseau, converti en nombre entier.
SRC principal.ip Adresse IP source de la connexion réseau.
TOS additional.fields{}.key: "TOS", additional.fields{}.value.string_value: Valeur de TOS Le champ Type de service dans l'en-tête IP.
Valeur TTL network.dns.additional.ttl Valeur Time To Live, convertie en entier non signé.
URGP additional.fields{}.key: "URGP", additional.fields{}.value.string_value: Valeur de l'URGP Champ de pointeur urgent dans l'en-tête TCP.
WINDOW additional.fields{}.key: "WINDOW_SIZE", additional.fields{}.value.string_value: Valeur de WINDOW Taille de la fenêtre TCP.
action security_result.action Action effectuée par le pare-feu, extraite du message CEF.
agt observer.ip Adresse IP de l'agent.
amac target.mac Adresse MAC de la cible, convertie en minuscules et avec les traits d'union remplacés par des deux-points.
application target.application Application impliquée dans l'événement.
artz observer.zone Fuseau horaire de l'observateur.
atz target.location.country_or_region Fuseau horaire cible.
categoryBehavior additional.fields{}.key: "Category Behavior", additional.fields{}.value.string_value: valeur de categoryBehavior sans les barres obliques Comportement de la catégorie.
categoryDeviceGroup additional.fields{}.key: "Category Device Group", additional.fields{}.value.string_value: Valeur de categoryDeviceGroup sans les barres obliques Groupe d'appareils de catégorie.
categoryObject additional.fields{}.key: "Category Object", additional.fields{}.value.string_value: valeur de categoryObject sans les barres obliques Objet de catégorie.
categoryOutcome additional.fields{}.key: "Category Outcome", additional.fields{}.value.string_value: valeur de categoryOutcome sans les barres obliques Résultat pour la catégorie.
categorySignificance additional.fields{}.key: "category Significance", additional.fields{}.value.string_value: Valeur de categorySignificance Importance de la catégorie.
commande target.process.command_line La commande exécutée.
cs1Label additional.fields{}.key: cs1Label, additional.fields{}.value.string_value: valeur du champ CEF correspondant Libellé et valeur du champ de chaîne personnalisée 1 du message CEF.
cs2Label additional.fields{}.key: cs2Label, additional.fields{}.value.string_value: valeur du champ CEF correspondant Libellé et valeur du champ de chaîne personnalisée 2 du message CEF.
cs3Label additional.fields{}.key: cs3Label, additional.fields{}.value.string_value: valeur du champ CEF correspondant Libellé et valeur du champ de chaîne personnalisé 3 du message CEF.
cs4Label additional.fields{}.key: cs4Label, additional.fields{}.value.string_value: valeur du champ CEF correspondant Libellé et valeur du champ de chaîne personnalisé 4 du message CEF.
cs5Label additional.fields{}.key: cs5Label, additional.fields{}.value.string_value: valeur du champ CEF correspondant Libellé et valeur du champ de chaîne personnalisé 5 du message CEF.
cs6Label additional.fields{}.key: cs6Label, additional.fields{}.value.string_value: Valeur du champ CEF correspondant Libellé et valeur du champ de chaîne personnalisé 6 du message CEF.
dhost target.hostname Nom d'hôte de destination.
deviceCustomString1 additional.fields{}.key: cs1Label, additional.fields{}.value.string_value: Value of deviceCustomString1 Chaîne personnalisée de l'appareil 1.
deviceCustomString2 additional.fields{}.key: cs2Label, additional.fields{}.value.string_value: Value of deviceCustomString2 Chaîne personnalisée 2 de l'appareil.
deviceCustomString3 additional.fields{}.key: cs3Label, additional.fields{}.value.string_value: Value of deviceCustomString3 Chaîne personnalisée de l'appareil 3.
deviceCustomString4 additional.fields{}.key: cs4Label, additional.fields{}.value.string_value: Value of deviceCustomString4 Chaîne personnalisée de l'appareil 4.
deviceCustomString5 additional.fields{}.key: cs5Label, additional.fields{}.value.string_value: Value of deviceCustomString5 Chaîne personnalisée de l'appareil 5.
deviceCustomString6 additional.fields{}.key: cs6Label, additional.fields{}.value.string_value: Value of deviceCustomString6 Chaîne personnalisée de l'appareil 6.
deviceDirection network.direction Sens du trafic réseau.
deviceEventClassId additional.fields{}.key: "eventId", additional.fields{}.value.string_value: Value of deviceEventClassId ID de la classe d'événement de l'appareil.
deviceFacility observer.product.subproduct Installation de l'appareil.
deviceProcessName about.process.command_line Nom du processus de l'appareil.
deviceSeverity security_result.severity Gravité de l'appareil.
deviceTimeZone observer.zone Fuseau horaire de l'appareil.
deviceVendor metadata.vendor_name Le fournisseur de l'appareil.
deviceVersion metadata.product_version Version de l'appareil.
dpt target.port Le port de destination.
dst target.ip Adresse IP de destination.
duser target.user.user_display_name L'utilisateur de destination.
eventId additional.fields{}.key: "eventId", additional.fields{}.value.string_value: Value of eventId ID de l'événement.
event_time metadata.event_timestamp Heure à laquelle l'événement s'est produit, analysée à partir du message.
firewall_action security_result.action_details Action de pare-feu effectuée.
hôte principal.hostname, intermediary.hostname Nom d'hôte de l'appareil qui génère le journal. Utilisé pour le principal et l'intermédiaire dans différents cas.
Message security_result.summary Message associé à l'événement, utilisé comme résumé du résultat de sécurité.
nom metadata.product_event_type Nom de l'événement.
process_name additional.fields{}.key: "process_name", additional.fields{}.value.string_value: Value of process_name Nom du processus.
p_id target.process.pid ID du processus, converti en chaîne.
sha256 principal.process.file.sha256 Hachage SHA256 d'un fichier, extrait des informations de clé SSH2.
shost principal.hostname Nom d'hôte source.
source_address principal.ip Adresse IP source.
source_port principal.port Port source, converti en entier.
src principal.ip Adresse IP source.
src_ip principal.ip Adresse IP source.
src_port principal.port Port source, converti en entier.
ssh2 security_result.detection_fields{}.key: "ssh2", security_result.detection_fields{}.value: Value of ssh2 Informations sur la clé SSH2.
subtype metadata.product_event_type Sous-type de l'événement.
task_summary security_result.description Résumé de la tâche, utilisé comme description du résultat de sécurité.
code temporel metadata.event_timestamp Horodatage de l'événement.
utilisateur target.user.userid Utilisateur associé à l'événement.
nom d'utilisateur principal.user.userid Nom d'utilisateur associé à l'événement.
user_name principal.user.userid Le nom d'utilisateur.
metadata.vendor_name Codé en dur sur "Juniper Firewall". Codé en dur sur "Juniper Firewall". Codé en dur sur "JUNIPER_JUNOS". Déterminé par la logique de l'analyseur en fonction du contenu du journal. La valeur par défaut est "STATUS_UPDATE" si le message n'est pas au format CEF et qu'aucun autre type d'événement spécifique n'est identifié. Définissez cette option sur "NETWORK_HTTP" pour les messages CEF. Si aucun champ "desc" n'est présent, ce champ est renseigné avec la valeur "message_description" extraite du message de journal brut.
protocol-name network.ip_protocol Mappé à partir du journal des modifications
application_name target.application Mappé à partir du journal des modifications
desc sec_result.summary Mappé à partir du journal des modifications
mac-address principal.mac Mappé à partir du journal des modifications

Journal des modifications

Afficher le journal des modifications de ce parseur

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