Collecter les journaux MongoDB
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
- Connectez-vous à la console Google SecOps.
- Accédez à Paramètres SIEM> Agents de collecte.
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
- Connectez-vous à la console Google SecOps.
- Accédez à Paramètres du SIEM > Profil.
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
- 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 que l'installation se termine.
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
- Ouvrez un terminal avec des droits d'accès racine 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 que l'installation se termine.
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-collectorWindows :
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: 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 disqueinclude: 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.jsonou le chemin d'accès au journal d'audit que vous avez configuré
- Linux :
start_at: défini surbeginningpour lire les journaux existants ou surendpour 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
- 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 :
MONGO_DB: type de journal tel qu'il apparaît dans Chronicleingestion_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 surEnter, puis surCtrl+X. - Windows : cliquez sur Fichier > Enregistrer.
- Linux : appuyez sur
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-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
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 :
- Appuyez sur
Win+R, saisissezservices.msc, puis appuyez sur Entrée. - Localisez observIQ OpenTelemetry Collector.
- Effectuez un clic droit et sélectionnez Redémarrer.
- Appuyez sur
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"
Configurer MongoDB pour générer des journaux d'audit
- Connectez-vous au serveur MongoDB avec des droits d'administrateur ou racine.
- 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
- Linux :
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.destinationest définie surfile. - La propriété
auditLog.formatest définie surJSON. 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
- La propriété
Redémarrez le service MongoDB pour appliquer la configuration :
Linux :
sudo systemctl restart mongodWindows :
net stop MongoDB && net start MongoDB
Vérifiez que le fichier journal d'audit est écrit au chemin d'accès configuré (par exemple,
/var/log/mongodb/auditLog.json).Assurez-vous que le chemin d'accès
includede l'agent Bindplane dansconfig.yamlcorrespond àauditLog.pathconfiguré dansmongod.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.