Collecter les journaux IBM DB2

Compatible avec :

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

IBM Db2 est un système de gestion de base de données relationnelle qui fournit une fonctionnalité d'audit pour aider à détecter les accès inconnus ou inattendus aux données. La fonctionnalité d'audit Db2 génère et permet la maintenance d'une piste d'audit pour une série d'événements de base de données prédéfinis.

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
  • Connectivité réseau entre l'agent Bindplane et l'instance IBM Db2
  • 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.
  • Instance IBM DB2 (version 11.1 ou ultérieure) avec privilèges SYSADM
  • Espace disque suffisant pour le stockage et l'archivage des journaux d'audit

Obtenir le fichier d'authentification d'ingestion Google SecOps

  1. Connectez-vous à la console Google SecOps.
  2. Accédez à Paramètres du SIEM > Agent de collecte.
  3. Cliquez sur Télécharger pour télécharger le fichier d'authentification pour l'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 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 /opt/observiq-otel-collector/config.yaml
    
  • Windows :

    notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
    

Modifiez le fichier de configuration

  1. Remplacez l'intégralité du contenu de config.yaml par la configuration suivante :

    receivers:
      tcplog:
        listen_address: "0.0.0.0:1514"
    
    exporters:
      chronicle/db2_audit:
        compression: gzip
        creds_file_path: '/opt/observiq-otel-collector/ingestion-auth.json'
        customer_id: 'YOUR_CUSTOMER_ID'
        endpoint: malachiteingestion-pa.googleapis.com
        log_type: DB2_DB
        raw_log_field: body
        ingestion_labels:
          env: production
    
    service:
      pipelines:
        logs/db2_to_chronicle:
          receivers:
            - tcplog
          exporters:
            - chronicle/db2_audit
    
  2. Remplacez les espaces réservés suivants :

    • Configuration du récepteur :

      • listen_address : définissez la valeur sur 0.0.0.0:1514 pour écouter sur toutes les interfaces sur le port 1514 (port non privilégié recommandé pour Linux).
    • Configuration de l'exportateur :

      • creds_file_path : chemin d'accès complet au fichier d'authentification de l'ingestion :

        • Linux : /opt/observiq-otel-collector/ingestion-auth.json
        • Windows : C:\\Program Files\\observIQ OpenTelemetry Collector\\ingestion-auth.json
      • customer_id : ID client de l'étape précédente

      • 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 : définie sur "DB2_DB"

      • ingestion_labels : libellés facultatifs au format YAML (par exemple, env: production)

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.

  • Linux

    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
      
  • Windows

    Choisissez l'une des options suivantes :

    • À l'aide de l'invite de commandes ou de PowerShell en tant qu'administrateur :

      net stop observiq-otel-collector && net start observiq-otel-collector
      
    • Utiliser la 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 l'outil d'audit IBM DB2

Configurez la fonctionnalité d'audit DB2 pour capturer les événements de sécurité et les extraire vers syslog.

Vérifier la configuration d'audit actuelle

  • Connectez-vous à votre instance DB2 en tant qu'utilisateur disposant de l'autorité SYSADM et exécutez la commande suivante :

    db2audit describe
    

    La configuration d'audit actuelle s'affiche, y compris l'état, les catégories et les chemins d'audit.

Configurer les chemins d'audit

  1. Définissez les répertoires dans lesquels les journaux d'audit seront stockés :

    db2audit configure datapath /db2audit/data
    db2audit configure archivepath /db2audit/archive
    
  2. Assurez-vous que ces répertoires existent et qu'ils disposent des autorisations appropriées pour le propriétaire de l'instance DB2 :

    mkdir -p /db2audit/data /db2audit/archive
    chown db2inst1:db2iadm1 /db2audit/data /db2audit/archive
    chmod 750 /db2audit/data /db2audit/archive
    

Configurer le champ d'application et les catégories d'audit

  • Configurez la fonctionnalité d'audit pour capturer tous les événements de sécurité :

    db2audit configure scope all status both errortype normal
    

    Cette configuration permet de définir les éléments suivants :

    • scope all : audite toutes les catégories (audit, checking, objmaint, secmaint, sysadmin, validate, context)
    • status both : capture les événements réussis et ceux ayant échoué
    • errortype normal : gestion standard des erreurs

Démarrer la fonctionnalité d'audit

  1. Commencer l'audit :

    db2audit start
    
  2. Vérifiez que l'audit est actif :

    db2audit describe
    

    Le résultat doit afficher Audit active: "TRUE".

Configurer syslog pour recevoir les journaux d'audit DB2

Configurez le daemon syslog du système pour recevoir et stocker les messages d'audit DB2.

Linux (rsyslog)

  1. Modifiez le fichier de configuration rsyslog :

    sudo nano /etc/rsyslog.conf
    
  2. Ajoutez la ligne suivante pour rediriger les messages d'audit DB2 vers un fichier dédié :

    user.info /var/log/db2/db2audit.log
    
  3. Créez le répertoire et le fichier journaux :

    sudo mkdir -p /var/log/db2
    sudo touch /var/log/db2/db2audit.log
    sudo chmod 640 /var/log/db2/db2audit.log
    
  4. Redémarrez rsyslog :

    sudo systemctl restart rsyslog
    

AIX (syslogd)

  1. Modifiez le fichier de configuration syslog :

    sudo vi /etc/syslog.conf
    
  2. Ajoutez la ligne suivante :

    user.info /var/log/db2/db2audit.log
    
  3. Créez le répertoire et le fichier journaux :

    sudo mkdir -p /var/log/db2
    sudo touch /var/log/db2/db2audit.log
    sudo chmod 640 /var/log/db2/db2audit.log
    
  4. Redémarrez syslogd :

    sudo refresh -s syslogd
    

Extraire les journaux d'audit DB2 vers syslog

Extrayez les journaux d'audit archivés et envoyez-les au daemon syslog du système.

Vider et archiver les journaux d'audit

  • Avant l'extraction, videz tous les enregistrements d'audit en attente et archivez le journal d'audit actuel :

    db2audit flush
    db2audit archive
    

    La commande d'archivage crée des fichiers horodatés dans le chemin d'archivage (par exemple, db2audit.instance.log.0.20250110123456).

Extraire les journaux d'audit vers syslog

  • Extrayez les journaux d'audit archivés et envoyez-les à syslog en utilisant la fonctionnalité et la priorité user.info :

    db2audit extract syslog user.info from files /db2audit/archive/db2audit.instance.log.0.*
    

    Cette commande :

    • Extrait les enregistrements d'audit des fichiers journaux archivés.
    • les envoie au daemon syslog du système avec la fonctionnalité user et la priorité info.
    • Le daemon syslog achemine les messages selon /etc/syslog.conf ou /etc/rsyslog.conf.

Vérifier que les journaux sont envoyés

  • Vérifiez que les messages d'audit sont écrits dans le fichier syslog :

    tail -f /var/log/db2/db2audit.log
    

    Vous devriez voir des enregistrements d'audit DB2 apparaître dans le fichier journal.

Configurer rsyslog pour transférer les journaux vers l'agent Bindplane

Configurez rsyslog pour transférer les journaux d'audit DB2 à l'agent Bindplane.

  1. Créez un fichier de configuration rsyslog :

    sudo nano /etc/rsyslog.d/50-db2-forward.conf
    
  2. Ajoutez la configuration suivante pour transférer les journaux vers l'agent Bindplane :

    # Forward DB2 audit logs to Bindplane agent
    user.info @@127.0.0.1:1514
    

    Le préfixe @@ indique le transfert TCP. Utilisez @ pour UDP si nécessaire.

  3. Redémarrez rsyslog :

    sudo systemctl restart rsyslog
    

Automatiser l'extraction des journaux d'audit

Créez un script pour automatiser le processus de vidage, d'archivage et d'extraction.

Créer un script d'extraction

  1. Créez un script pour automatiser l'extraction des journaux d'audit :

    sudo nano /usr/local/bin/db2audit-extract.sh
    
  2. Ajoutez le contenu suivant :

    #!/bin/bash
    # DB2 Audit Log Extraction Script
    
    # Set DB2 environment
    export DB2INSTANCE=db2inst1
    . /home/db2inst1/sqllib/db2profile
    
    # Flush pending audit records
    db2audit flush
    
    # Archive current audit log
    db2audit archive
    
    # Extract archived logs to syslog
    db2audit extract syslog user.info from files /db2audit/archive/db2audit.instance.log.0.*
    
    # Optional: Clean up old archived logs (older than 30 days)
    find /db2audit/archive -name "db2audit.instance.log.0.*" -mtime +30 -delete
    
    exit 0
    
  3. Rendez le script exécutable :

    sudo chmod +x /usr/local/bin/db2audit-extract.sh
    

Planifier avec cron

  1. Planifiez l'exécution périodique du script à l'aide de cron :

    sudo crontab -e
    
  2. Ajoutez la ligne suivante pour exécuter le script toutes les heures :

    Choisissez l'une des options suivantes :

    0 * * * * /usr/local/bin/db2audit-extract.sh >> /var/log/db2/db2audit-extract.log 2>&1
    

    Ou exécutez-le toutes les 15 minutes pour une extraction plus fréquente :

    */15 * * * * /usr/local/bin/db2audit-extract.sh >> /var/log/db2/db2audit-extract.log 2>&1
    

Vérifier l'ingestion des journaux dans Google SecOps

  1. Connectez-vous à la console Google SecOps.
  2. Accédez à Recherche.
  3. Exécutez une requête de recherche pour vérifier que les journaux DB2 sont ingérés :

    metadata.log_type = "DB2_DB"
    
  4. Vérifiez que les journaux s'affichent avec le code temporel et les champs corrects.

Table de mappage UDM

Champ de journal Mappage UDM Logique
msg event.idm.read_only_udm.additional.fields Valeur extraite du message si msg != ""
Système event.idm.read_only_udm.additional.fields Valeur extraite du système si le système est différent de ""
Sous-système event.idm.read_only_udm.additional.fields Valeur extraite du sous-système si Sous-système != ""
auth_mechanism event.idm.read_only_udm.extensions.auth.mechanism Définissez la valeur sur "USERNAME_PASSWORD" pour les événements USER_LOGIN.
CorrelationUser event.idm.read_only_udm.intermediary.user.userid Valeur extraite de CorrelationUser si CorrelationUser != ""
pondérée event.idm.read_only_udm.metadata.description Valeur extraite de la somme
date_time event.idm.read_only_udm.metadata.event_timestamp Converti des champs de date et d'heure au format ISO8601 si les deux sont différents de ""
leef_event_id event.idm.read_only_udm.metadata.product_event_type Valeur extraite de leef_event_id
event.idm.read_only_udm.metadata.event_type Dérivé de leef_event_id : si la valeur est dans ["102-87", "102-83"] → USER_LOGIN ; si la valeur est dans ["102-6", "102-7", "102-8", "102-10", "102-24", "102-143"] → USER_RESOURCE_ACCESS ou USER_RESOURCE_UPDATE_CONTENT en fonction de l'intention ; si la valeur est "102-319" → USER_RESOURCE_ACCESS ; sinon GENERIC_EVENT
event.idm.read_only_udm.metadata.product_name Défini sur "DB2"
event.idm.read_only_udm.metadata.vendor_name Défini sur "IBM"
SSID event.idm.read_only_udm.network.session_id Valeur extraite du SSID si SSID != ""
job event.idm.read_only_udm.principal.application Valeur extraite de l'offre d'emploi si job != ""
sourceServiceName event.idm.read_only_udm.principal.application Valeur extraite de sourceServiceName
sourceHostName event.idm.read_only_udm.principal.asset.hostname Valeur extraite de sourceHostName si sourceHostName != ""
principal_ip event.idm.read_only_udm.principal.asset.ip Valeur extraite de principal_ip pour les événements 102 à 319
product_id event.idm.read_only_udm.principal.asset_id Définissez le champ sur "ID du produit : %{product_id}" pour les événements 102 à 319.
sourceHostName event.idm.read_only_udm.principal.hostname Valeur extraite de sourceHostName si sourceHostName != ""
principal_ip event.idm.read_only_udm.principal.ip Valeur extraite de principal_ip pour les événements 102 à 319
Créateur event.idm.read_only_udm.principal.user.user_display_name Valeur extraite du créateur
nom event.idm.read_only_udm.principal.user.user_display_name Valeur extraite du nom si le nom est différent de ""
AuthenticatedUser event.idm.read_only_udm.principal.user.userid Valeur extraite de AuthenticatedUser si AuthenticatedUser != ""
sourceUserName event.idm.read_only_udm.principal.user.userid Valeur extraite de sourceUserName
usrName event.idm.read_only_udm.principal.user.userid Valeur extraite de usrName
_action event.idm.read_only_udm.security_result.action Dérivé de la somme : si la somme contient "successful" (réussie), AUTORISER ; sinon, BLOQUER pour les événements USER_LOGIN
deviceHostName event.idm.read_only_udm.target.asset.hostname Valeur extraite de deviceHostName
conn_location3 event.idm.read_only_udm.target.asset.hostname Valeur extraite de conn_location3 si conn_location3 != ""
file_name event.idm.read_only_udm.target.file.full_path Valeur extraite de file_name si file_name != ""
deviceHostName event.idm.read_only_udm.target.hostname Valeur extraite de deviceHostName
conn_location3 event.idm.read_only_udm.target.hostname Valeur extraite de conn_location3 si conn_location3 != ""
conn_location, conn_location2 event.idm.read_only_udm.target.location.name Concaténation de conn_location et conn_location2 si les deux sont différents de ""
deviceProcessName event.idm.read_only_udm.target.process.command_line Valeur extraite de deviceProcessName
SQL event.idm.read_only_udm.target.process.command_line Valeur extraite de SQL si SQL != ""
Connection_Type event.idm.read_only_udm.target.resource.attribute.labels Clé "Type de connexion" avec la valeur de Connection_Type
Plan event.idm.read_only_udm.target.resource.attribute.labels Clé "Plan" avec la valeur du plan
DB2_Subsystem event.idm.read_only_udm.target.resource.attribute.labels Clé "DB2 Subsystem" avec la valeur de DB2_Subsystem
Priv_Check_Code event.idm.read_only_udm.target.resource.attribute.labels Clé "Priv Check Code" avec la valeur de Priv_Check_Code
Table_Name event.idm.read_only_udm.target.resource.attribute.labels Clé "Table Name" (Nom de la table) avec la valeur de Table_Name
MessageType event.idm.read_only_udm.target.resource.attribute.labels Clé "Message Type" avec une valeur issue de MessageType
Check_type event.idm.read_only_udm.target.resource.attribute.labels Clé "Check Type" avec la valeur de Check_type
deviceAction event.idm.read_only_udm.target.resource.attribute.labels Clé "Device Action" (Action sur l'appareil) avec une valeur mappée à partir de deviceAction : G → GRANT (ACCORDER), R → REVOKE (RÉVOQUER)
SSID event.idm.read_only_udm.target.resource.attribute.labels Clé "SSID" avec la valeur SSID si la valeur est différente de ""
SQL event.idm.read_only_udm.target.resource.attribute.labels Clé "Requête SQL" avec la valeur de SQL si SQL != ""
messageid event.idm.read_only_udm.target.resource.id Valeur extraite de messageid
Object_Class_Code event.idm.read_only_udm.target.resource.parent Valeur extraite de Object_Class_Code
obj event.idm.read_only_udm.target.resource.name Valeur extraite de l'objet
resource_name event.idm.read_only_udm.target.resource.name Valeur extraite de resource_name à partir de SQL si SQL != "" et n'est pas vide
Database_Name event.idm.read_only_udm.target.resource.name Valeur extraite de Database_Name
objtyp event.idm.read_only_udm.target.resource.resource_subtype Valeur extraite de objtyp (en majuscules) si objtyp != ""
Type event.idm.read_only_udm.target.resource.resource_subtype Dérivé du type : T → TABLE, V → VIEW, X → AUXILIARY TABLE
event.idm.read_only_udm.target.resource.resource_type Défini sur "DATABASE"

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