Collecter les journaux IBM DB2
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
- 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 le système 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 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-collectorLe 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-collectorLe 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.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: 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_auditRemplacez les espaces réservés suivants :
Configuration du récepteur :
listen_address: définissez la valeur sur0.0.0.0:1514pour é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
- Linux :
customer_id: ID client de l'étape précédenteendpoint: 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: 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 surEnter, puis surCtrl+X. - Windows : cliquez sur Fichier > Enregistrer.
- Linux : appuyez sur
Redémarrez l'agent Bindplane pour appliquer les modifications.
Linux
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
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-collectorUtiliser 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
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 describeLa configuration d'audit actuelle s'affiche, y compris l'état, les catégories et les chemins d'audit.
Configurer les chemins d'audit
Définissez les répertoires dans lesquels les journaux d'audit seront stockés :
db2audit configure datapath /db2audit/data db2audit configure archivepath /db2audit/archiveAssurez-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 normalCette 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
Commencer l'audit :
db2audit startVérifiez que l'audit est actif :
db2audit describeLe 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)
Modifiez le fichier de configuration rsyslog :
sudo nano /etc/rsyslog.confAjoutez la ligne suivante pour rediriger les messages d'audit DB2 vers un fichier dédié :
user.info /var/log/db2/db2audit.logCré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.logRedémarrez rsyslog :
sudo systemctl restart rsyslog
AIX (syslogd)
Modifiez le fichier de configuration syslog :
sudo vi /etc/syslog.confAjoutez la ligne suivante :
user.info /var/log/db2/db2audit.logCré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.logRedé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 archiveLa 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é
useret la prioritéinfo. - Le daemon syslog achemine les messages selon
/etc/syslog.confou/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.logVous 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.
Créez un fichier de configuration rsyslog :
sudo nano /etc/rsyslog.d/50-db2-forward.confAjoutez 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:1514Le préfixe
@@indique le transfert TCP. Utilisez@pour UDP si nécessaire.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
Créez un script pour automatiser l'extraction des journaux d'audit :
sudo nano /usr/local/bin/db2audit-extract.shAjoutez 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 0Rendez le script exécutable :
sudo chmod +x /usr/local/bin/db2audit-extract.sh
Planifier avec cron
Planifiez l'exécution périodique du script à l'aide de cron :
sudo crontab -eAjoutez 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>&1Ou 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
- Connectez-vous à la console Google SecOps.
- Accédez à Recherche.
Exécutez une requête de recherche pour vérifier que les journaux DB2 sont ingérés :
metadata.log_type = "DB2_DB"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.