Collecter les journaux MongoDB

Compatible avec :

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

MongoDB est une base de données de documents NoSQL qui génère des journaux d'audit pour les opérations CRUD, les événements d'authentification, les commandes de base de données et les opérations sur les ensembles de répliques. MongoDB écrit des fichiers journaux JSON structurés en local, que l'agent Bindplane peut collecter directement à partir du système de fichiers.

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 le serveur MongoDB
  • Si vous exécutez l'agent derrière un proxy, assurez-vous que les ports du pare-feu sont ouverts conformément aux exigences de l'agent BindPlane.
  • Accès privilégié au serveur MongoDB (rôle root ou administrateur de base de données)
  • MongoDB Enterprise ou MongoDB Community Edition avec journalisation d'audit activée

Obtenir le fichier d'authentification d'ingestion Google SecOps

  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. 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 du SIEM > Profil.
  3. Copiez et enregistrez le numéro client dans 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 Windows

  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 que l'installation se termine.

  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 sous 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 que l'installation se termine.

  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 et les envoyer à Google SecOps

Localiser le fichier de configuration

  • Linux :

    sudo systemctl status observiq-otel-collector
    
  • 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:
        filelog:
            include:
                - /var/log/mongodb/auditLog.json
            start_at: beginning
    
    exporters:
        chronicle/mongodb:
            compression: gzip
            creds_file_path: '/etc/bindplane-agent/ingestion-auth.json'
            customer_id: '<customer_id>'
            endpoint: malachiteingestion-pa.googleapis.com
            log_type: MONGO_DB
            raw_log_field: body
            ingestion_labels:
                env: production
    
    service:
        pipelines:
            logs/mongodb_to_chronicle:
                receivers:
                    - filelog
                exporters:
                    - chronicle/mongodb
    

Paramètres de configuration

Remplacez les espaces réservés suivants :

  • Configuration du récepteur :

    • filelog : type de récepteur pour la collecte des fichiers journaux à partir du disque
    • include : liste des chemins d'accès aux fichiers à surveiller :
      • Linux : /var/log/mongodb/auditLog.json (chemin d'accès par défaut au journal d'audit MongoDB)
      • Windows : C:\data\log\auditLog.json ou le chemin d'accès au journal d'audit que vous avez configuré
    • start_at : défini sur beginning pour lire les journaux existants ou sur end pour lire uniquement les nouvelles entrées
  • Configuration de l'exportateur :

    • mongodb : nom descriptif 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
    • <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.
    • MONGO_DB : type de journal tel qu'il apparaît dans Chronicle
    • ingestion_labels : étiquettes facultatives au format YAML (par exemple, env: production)
  • Configuration du pipeline :

    • mongodb_to_chronicle : nom descriptif du pipeline.

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 :

  1. Exécutez la commande suivante :

    sudo systemctl restart observiq-otel-collector
    
  2. Vérifiez que le service est en cours d'exécution :

    sudo systemctl status observiq-otel-collector
    
  3. Recherchez les erreurs dans les journaux :

    sudo journalctl -u observiq-otel-collector -f
    

Pour redémarrer l'agent BindPlane sous Windows :

  1. 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. Localisez observIQ OpenTelemetry Collector.
      3. Effectuez un clic droit et sélectionnez Redémarrer.
  2. Vérifiez que le service est en cours d'exécution :

    sc query observiq-otel-collector
    
  3. Recherchez les erreurs dans les journaux :

    type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
    

Configurer MongoDB pour générer des journaux d'audit

  1. Connectez-vous au serveur MongoDB avec des droits d'administrateur ou racine.
  2. Ouvrez le fichier de configuration MongoDB (mongod.conf). Emplacements par défaut :
    • Linux : /etc/mongod.conf
    • Windows : C:\Program Files\MongoDB\Server\<version>\bin\mongod.cfg
  3. Vérifiez que la journalisation d'audit est activée. Dans le fichier mongod.conf, vérifiez les paramètres suivants :

    • La propriété auditLog.destination est définie sur file.
    • La propriété auditLog.format est définie sur JSON.
    • Notez le auditLog.path (par exemple, /var/log/mongodb/auditLog.json).

    • Si la journalisation d'audit n'est pas activée, ajoutez les éléments suivants à mongod.conf :

      auditLog:
        destination: file
        format: JSON
        path: /var/log/mongodb/auditLog.json
      
  4. Redémarrez le service MongoDB pour appliquer la configuration :

    • Linux :

      sudo systemctl restart mongod
      
    • Windows :

      net stop MongoDB && net start MongoDB
      
  5. Vérifiez que le fichier journal d'audit est écrit au chemin d'accès configuré (par exemple, /var/log/mongodb/auditLog.json).

  6. Assurez-vous que le chemin d'accès include de l'agent Bindplane dans config.yaml correspond à auditLog.path configuré dans mongod.conf.

Table de mappage UDM

Champ de journal Mappage UDM Logique
ctx, connectionId, connectionCount, attr.protocol, attr.storage.data.bytesRead, attr.storage.data.timeReadingMicros, attr.command.$readPreference.mode, attr.queryHash, param_old, cluster_node, param.indexName, temp_db_value additional.fields Fusionné à partir de différents champs en fonction de conditions
db_mechanism, param.mechanism extensions.auth.auth_details Valeur de db_mechanism si elle n'est pas vide, sinon param.mechanism
extensions.auth.mechanism Défini sur "MECHANISM_OTHER"
extensions.auth.type Défini sur "AUTHTYPE_UNSPECIFIED"
lb_hostname, src_hostname intermediary.hostname Valeur de lb_hostname si elle n'est pas vide, sinon src_hostname
lb_port, src_port intermediary.port Valeur de lb_port si elle n'est pas vide, sinon src_port (convertie en entier)
Message metadata.description Valeur copiée directement
metadata.event_type Définir en fonction des conditions msg_atype, category, param_passwordChanged, param_command et remote_ip
msg_atype, category metadata.product_event_type Valeur de msg_atype si elle n'est pas vide, sinon catégorie
id, type, traceId metadata.product_log_id Valeur de l'ID si elle n'est pas vide, sinon uuid.$binary si type == "04", sinon traceId
metadata.product_name Définissez cette option sur "MongoDB Enterprise".
metadata.vendor_name Défini sur "MongoDB"
application_name principal.application Valeur copiée directement
accessLog.hostname principal.asset.hostname Valeur copiée directement
remote_ip principal.asset.ip Valeur copiée directement
software_label principal.asset.software Fusionné à partir de software_label
accessLog.hostname principal.hostname Valeur copiée directement
remote_ip principal.ip Valeur copiée directement
os_type principal.platform Définissez la valeur sur WINDOWS si elle correspond à Windows, sur MAC si elle correspond à osx ou mac, et sur LINUX si elle correspond à Linux.
os_name, param.clientMetadata.os.name principal.platform_patch_level Valeur de os_name si elle n'est pas vide, sinon param.clientMetadata.os.name
os_version, param.clientMetadata.os.version principal.platform_version Valeur de os_version si elle n'est pas vide, sinon param.clientMetadata.os.version
remote_port principal.port Converti en entier
principal_userid principal.user.userid Valeur copiée directement
sr_action security_result.action Valeur copiée directement
param.reason, param.indexBuildState security_result.description Valeur de param.reason si msg_atype == "logout" ; de param.indexBuildState si msg_atype est dans ["createIndex", "dropIndex"]
severity, level security_result.severity Définissez sur INFORMATIONAL si la gravité est ["i", "I"] ou si le niveau est ["INFO", "DEBUG"]; sur ERROR si la gravité est ["e", "E"] ou si le niveau est "ERROR" ; sur MEDIUM si la gravité est ["w", "W", "f", "F"]
msg_result, attr.error, attr.planSummary, reason, attr.msg_data security_result.summary Ensemble basé sur les conditions msg_result, attr.error, attr.planSummary, reason et attr.msg_data
db_value target.administrative_domain Valeur copiée directement
application_name target.application Valeur copiée directement
local_ip target.asset.ip Valeur copiée directement
host_group target.group.group_display_name Valeur copiée directement
local_ip target.ip Valeur copiée directement
local_port target.port Converti en entier
old_name_label, cluster_node_label, mode_label, query_hash_label, bytes_read_label, time_reading_micro_label, environment_label, area_label target.resource.attribute.labels Fusionné à partir de différents champs de libellé
param_ns, db_value, param_new, param.args.find target.resource.name Définir en fonction des conditions msg_atype et param_command
target.resource.resource_subtype Définissez cette option sur "Base de données MongoDB" pour les événements de base de données/utilisateur, sur "Collection MongoDB" pour les événements de collection et sur "Index MongoDB" pour les événements d'index.
target.resource.resource_type Définissez la valeur sur "DATABASE" pour les événements de base de données/utilisateur, ou sur "TABLE" pour les événements de collecte/index.
db_user, param.user target.user.userid Valeur de db_user si elle n'est pas vide, sinon param.user
service.name event.idm.read_only_udm.target.application Mappé à partir du journal des modifications
host.name event.idm.read_only_udm.principal.hostname Mappé à partir du journal des modifications
host.name event.idm.read_only_udm.principal.asset.hostname Mappé à partir du journal des modifications
mongodb.group.id event.idm.read_only_udm.principal.group.product_object_id Mappé à partir du journal des modifications
mongodb.cluster.name event.idm.read_only_udm.target.resource.attribute.labels Mappé à partir du journal des modifications
mongodb.customer.cluster.name event.idm.read_only_udm.target.resource.attribute.labels Mappé à partir du journal des modifications
timestamp event.idm.read_only_udm.metadata.event_timestamp Mappé à partir du journal des modifications
ts.date event.idm.read_only_udm.metadata.event_timestamp Mappé à partir du journal des modifications
uuid.binary event.idm.read_only_udm.metadata.product_log_id Mappé à partir du journal des modifications
users.1.user event.idm.read_only_udm.principal.user.userid Mappé à partir du journal des modifications
remote.ip event.idm.read_only_udm.principal.ip et event.idm.read_only_udm.principal.asset.ip Mappé à partir du journal des modifications
remote.port event.idm.read_only_udm.principal.port Mappé à partir du journal des modifications
local.ip event.idm.read_only_udm.target.ip et event.idm.read_only_udm.target.asset.ip Mappé à partir du journal des modifications
local.port event.idm.read_only_udm.target.port Mappé à partir du journal des modifications
roles.role event.idm.read_only_udm.principal.user.attribute.roles Mappé à partir du journal des modifications
param.args.client.application.name event.idm.read_only_udm.principal.application Mappé à partir du journal des modifications
param.args.client.os.type event.idm.read_only_udm.principal.asset.platform_software.platform Mappé à partir du journal des modifications
param.args.client.os.version event.idm.read_only_udm.principal.platform_version Mappé à partir du journal des modifications
param.args.client.os.architecture event.idm.read_only_udm.principal.asset.hardware Mappé à partir du journal des modifications
atype event.idm.read_only_udm.metadata.product_event_type Mappé à partir du journal des modifications
param.command event.idm.read_only_udm.metadata.product_event_type Mappé à partir du journal des modifications
param.ns event.idm.read_only_udm.target.resource.name Mappé à partir du journal des modifications
result event.idm.read_only_udm.security_result.action Mappé à partir du journal des modifications
mongodb.log.type event.idm.read_only_udm.additional.fields Mappé à partir du journal des modifications
param.args.db event.idm.read_only_udm.additional.fields Mappé à partir du journal des modifications
uuid.type event.idm.read_only_udm.additional.fields Mappé à partir du journal des modifications
param.args.clientOperationKey.type event.idm.read_only_udm.additional.fields Mappé à partir du journal des modifications
param.args.clientOperationKey.binary event.idm.read_only_udm.additional.fields Mappé à partir du journal des modifications
param.args.aggregate event.idm.read_only_udm.additional.fields Mappé à partir du journal des modifications
param.args.mayBypassWriteBlocking event.idm.read_only_udm.additional.fields Mappé à partir du journal des modifications
param.args.configTime.timestamp.t event.idm.read_only_udm.additional.fields Mappé à partir du journal des modifications
param.args.topologyTime.timestamp.t event.idm.read_only_udm.additional.fields Mappé à partir du journal des modifications
param.args.audit event.idm.read_only_udm.additional.fields Mappé à partir du journal des modifications
param.args.cursor.batchSize.numberLong event.idm.read_only_udm.additional.fields Mappé à partir du journal des modifications
param.args.includeQueryStatsMetrics event.idm.read_only_udm.additional.fields Mappé à partir du journal des modifications
param.args.fromMongos event.idm.read_only_udm.additional.fields Mappé à partir du journal des modifications
param.args.readConcern.provenance event.idm.read_only_udm.additional.fields Mappé à partir du journal des modifications
param.args.readConcern.level event.idm.read_only_udm.additional.fields Mappé à partir du journal des modifications
param.args.writeConcern.provenance event.idm.read_only_udm.additional.fields Mappé à partir du journal des modifications
param.args.writeConcern.level event.idm.read_only_udm.additional.fields Mappé à partir du journal des modifications
param.args.client.platform event.idm.read_only_udm.additional.fields Mappé à partir du journal des modifications
param.args.client.driver.name event.idm.read_only_udm.additional.fields Mappé à partir du journal des modifications
param.args.client.driver.version event.idm.read_only_udm.additional.fields Mappé à partir du journal des modifications
param.args.client.os.name event.idm.read_only_udm.additional.fields Mappé à partir du journal des modifications
param.args.clusterTime event.idm.read_only_udm.additional.fields Mappé à partir du journal des modifications
param.args.lsid.id.type event.idm.read_only_udm.additional.fields Mappé à partir du journal des modifications
param.args.lsid.uid.binary event.idm.read_only_udm.additional.fields Mappé à partir du journal des modifications
param.args.users.1.db event.idm.read_only_udm.additional.fields Mappé à partir du journal des modifications
param.args.client.mongos.version event.idm.read_only_udm.additional.fields Mappé à partir du journal des modifications
param.args.writeConcern.w event.idm.read_only_udm.additional.fields Mappé à partir du journal des modifications
param.args.writeConcern.wtimeout event.idm.read_only_udm.additional.fields Mappé à partir du journal des modifications
param.args.lsid.uid.type event.idm.read_only_udm.additional.fields Mappé à partir du journal des modifications
param.args.pipeline.1.match.managedClusterType event.idm.read_only_udm.additional.fields Mappé à partir du journal des modifications
param.args.pipeline.2.group.n.sum.const event.idm.read_only_udm.additional.fields Mappé à partir du journal des modifications
param.args.pipeline.2.group._id.const event.idm.read_only_udm.additional.fields Mappé à partir du journal des modifications
param.args.client.mongos.client.port event.idm.read_only_udm.additional.fields Mappé à partir du journal des modifications
param.args.audit.impersonatedRoles event.idm.read_only_udm.principal.user.attribute.roles Mappé à partir du journal des modifications
param.args.audit.impersonatedUser event.idm.read_only_udm.principal.user.attribute.labels Mappé à partir du journal des modifications
param.args.client.mongos.client event.idm.read_only_udm.principal.ip et event.idm.read_only_udm.principal.asset.ip Mappé à partir du journal des modifications
param.args.client.mongos.host event.idm.read_only_udm.intermediary.ip Mappé à partir du journal des modifications
param.args.client.mongos.host event.idm.read_only_udm.intermediary.port Mappé à partir du journal des modifications
accessLog.authResult additional.fields Mappé à partir du journal des modifications
accessLog.authSource additional.fields Mappé à partir du journal des modifications
accessLog.failureReason additional.fields Mappé à partir du journal des modifications
accessLog.groupId target.resource.product_object_id Mappé à partir du journal des modifications
accessLog.ipAddress intermediary.ip Mappé à partir du journal des modifications
accessLog.logLine.t.$date additional.fields Mappé à partir du journal des modifications
accessLog.logLine.s additional.fields Mappé à partir du journal des modifications
accessLog.logLine.c additional.fields Mappé à partir du journal des modifications
accessLog.logLine.id additional.fields Mappé à partir du journal des modifications
accessLog.logLine.ctx additional.fields Mappé à partir du journal des modifications
accessLog.logLine.msg additional.fields Mappé à partir du journal des modifications
accessLog.logLine.attr.client additional.fields Mappé à partir du journal des modifications
accessLog.logLine.attr.isSpeculative additional.fields Mappé à partir du journal des modifications
accessLog.logLine.attr.isClusterMember additional.fields Mappé à partir du journal des modifications
accessLog.logLine.attr.mechanism additional.fields Mappé à partir du journal des modifications
accessLog.logLine.attr.user additional.fields Mappé à partir du journal des modifications
accessLog.logLine.attr.db additional.fields Mappé à partir du journal des modifications
accessLog.logLine.attr.result additional.fields Mappé à partir du journal des modifications
accessLog.logLine.attr.metrics.conversation_duration.micros additional.fields Mappé à partir du journal des modifications
accessLog.logLine.attr.metrics.conversation_duration.summary.step additional.fields Mappé à partir du journal des modifications
accessLog.logLine.attr.metrics.conversation_duration.summary.step_total additional.fields Mappé à partir du journal des modifications
accessLog.logLine.attr.metrics.conversation_duration.summary.duration_micros additional.fields Mappé à partir du journal des modifications
accessLog.username target.user.user_display_name Mappé à partir du journal des modifications
accessLog.timestamp additional.fields Mappé à partir du journal des modifications
roles.db principal.user.attribute.roles Mappé à partir du journal des modifications
roles.db target.user.attribute.roles 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.