收集 MongoDB 日志

支持:

本文档介绍了如何使用 Bindplane 将 MongoDB 日志注入到 Google Security Operations。

MongoDB 是一种 NoSQL 文档数据库,可为 CRUD 操作、身份验证事件、数据库命令和副本集操作生成审核日志。MongoDB 会在本地写入结构化 JSON 日志文件,Bindplane 代理可以直接从文件系统中收集这些文件。

准备工作

请确保满足以下前提条件:

  • Google SecOps 实例
  • Windows Server 2016 或更高版本,或者具有 systemd 的 Linux 主机
  • Bindplane 代理与 MongoDB 服务器之间的网络连接
  • 如果在代理后面运行,请确保按照 Bindplane 代理要求打开防火墙端口
  • 对 MongoDB 服务器的特权访问权限(根角色或数据库管理员角色)
  • 启用了审核日志记录的 MongoDB 企业版或 MongoDB 社区版

获取 Bindplane 代理的 Google SecOps 凭据

如需向 Google SecOps 验证 Bindplane 代理,请选择以下方法之一:

  • 新部署:使用 Chronicle API(选项 1)。
  • 旧版部署:继续使用提取身份验证文件(方法 2),直到提取 API 于 2027 年 7 月 20 日停用。
  1. 登录 Google Cloud 控制台,然后选择与您的 Google SecOps 实例关联的 Google Cloud 项目。
  2. 前往 IAM 和管理 > 服务账号。
  3. 点击创建服务账号。
  4. 提供以下配置详细信息:
    • 服务账号名称:输入账号的名称(例如 bindplane-ingest)。
    • 服务账号说明:输入说明(例如 Bindplane agent log ingestion)。
  5. 点击创建并继续。
  6. 在向此服务账号授予对项目的访问权限部分,点击选择角色,然后选择 Chronicle Editor。
  7. 点击继续,然后点击完成。
  8. 点击您创建的服务账号,然后前往密钥标签页。
  9. 依次点击添加密钥> 创建新密钥。
  10. 选择 JSON,然后点击创建。密钥文件会下载到您的计算机上。
  11. 将密钥文件另存为 Bindplane 收集器目录(Linux 上的 /opt/observiq-otel-collector/ingestion-auth.json 或 Windows 上的 C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json)中的 ingestion-auth.json,或更新 config.yaml 中的 creds_file_path 以匹配您保存该文件的路径。
  12. 前往 IAM 和管理 > 设置,然后复制项目编号。您在配置导出器时需要用到该名称。

方法 2:下载数据注入身份验证文件(旧版)

  1. 登录 Google SecOps 控制台。
  2. 前往 SIEM 设置> 收集代理。
  3. 下载数据注入身份验证文件。
  4. 将文件安全地保存在将要安装 Bindplane 代理的系统上。

获取 Google SecOps 客户 ID

  1. 登录 Google SecOps 控制台。
  2. 依次前往 SIEM 设置 > 配置文件。
  3. 从组织详细信息部分复制并保存客户 ID。

安装 Bindplane 代理

根据以下说明,在 Windows 或 Linux 操作系统上安装 Bindplane 代理。

Windows 安装

  1. 以管理员身份打开命令提示符或 PowerShell。
  2. 运行以下命令:

    msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
    
  3. 等待安装完成。

  4. 运行以下命令,验证安装是否成功:

    sc query observiq-otel-collector
    

该服务应显示为正在运行。

Linux 安装

  1. 打开具有 root 或 sudo 权限的终端。
  2. 运行以下命令:

    sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
    
  3. 等待安装完成。

  4. 运行以下命令,验证安装是否成功:

    sudo systemctl status observiq-otel-collector
    

该服务应显示为 active (running)。

其他安装资源

如需了解其他安装选项和问题排查,请参阅 Bindplane 代理安装指南。

配置 Bindplane 代理以注入日志并发送到 Google SecOps

找到配置文件

  • Linux:

    sudo nano /opt/observiq-otel-collector/config.yaml
    
  • Windows:

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

修改配置文件

  • 将 config.yaml 的全部内容替换为以下配置:

    receivers:
      filelog:
        include:
          - /var/log/mongodb/auditLog.json
        start_at: beginning
    
    exporters:
      chronicle/mongodb:
        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: '/opt/observiq-otel-collector/ingestion-auth.json'
        customer_id: '<customer_id>'
        endpoint: chronicle.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
    

配置参数

替换以下占位符:

  • 接收器配置:

    • filelog:用于从磁盘收集日志文件的接收器类型
    • include:要监控的文件路径列表:
      • Linux:/var/log/mongodb/auditLog.json(默认 MongoDB 审核日志路径)
      • Windows:C:\data\log\auditLog.json 或您配置的审核日志路径
    • start_at:设置为 beginning 可读取现有日志,设置为 end 可仅读取新条目
  • 导出器配置:

    • mongodb:导出器的描述性名称
    • creds_file_path:服务账号 JSON 密钥文件的完整路径(选项 1):
      • Linux:/opt/observiq-otel-collector/ingestion-auth.json
      • Windows:C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json
    • <customer_id>:上一步中的客户 ID
    • location:将 <LOCATION> 替换为 Google SecOps 实例所在的区域(例如 us、europe 或 asia-southeast1)。导出工具会在此值前面加上 chronicle.googleapis.com。如需查看完整列表,请参阅区域级端点。
    • project:将 <PROJECT_NUMBER> 替换为 IAM 和管理 > 设置中的项目编号。
    • endpoint:保持设置为 chronicle.googleapis.com。
    • MONGO_DB:日志类型,与 Chronicle 中显示的完全一致
    • ingestion_labels:YAML 格式的可选标签(例如 env: production)
  • 流水线配置:

    • mongodb_to_chronicle:流水线的描述性名称

旧版提取 API 导出工具

  • 如果您使用选项 2 中的提取身份验证文件,请将 exporters 代码块替换为以下内容。将 creds_file_path 设置为数据注入身份验证文件的路径,如果您的实例位于美国境外,请将 malachiteingestion-pa.googleapis.com 替换为您的区域端点(例如 europe-malachiteingestion-pa.googleapis.com)。

    exporters:
      chronicle/mongodb:
        compression: gzip
        creds_file_path: '/opt/observiq-otel-collector/ingestion-auth.json'
        customer_id: '<customer_id>'
        endpoint: malachiteingestion-pa.googleapis.com
        log_type: MONGO_DB
        raw_log_field: body
        ingestion_labels:
          env: production
    

保存配置文件

  • 修改后,保存文件:
    • Linux:依次按 Ctrl+O、Enter 和 Ctrl+X
    • Windows:依次点击文件 > 保存

重启 Bindplane 代理以应用更改

如需在 Linux 中重启 Bindplane 代理,请执行以下操作:

  1. 运行以下命令:

    sudo systemctl restart observiq-otel-collector
    
  2. 验证服务是否正在运行:

    sudo systemctl status observiq-otel-collector
    
  3. 检查日志中的错误:

    sudo journalctl -u observiq-otel-collector -f
    

如需在 Windows 中重启 Bindplane 代理,请执行以下操作:

  1. 请从下列选项中选择一项:

    • 以管理员身份运行命令提示符或 PowerShell:
    net stop observiq-otel-collector && net start observiq-otel-collector
    
    • “服务”控制台:
      1. 按 Win+R,输入 services.msc,然后按 Enter 键。
      2. 找到 observIQ OpenTelemetry 收集器。
      3. 右键点击并选择重启。
  2. 验证服务是否正在运行:

    sc query observiq-otel-collector
    
  3. 检查日志中是否存在错误:

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

配置 MongoDB 以生成审核日志

  1. 使用管理员或 root 权限登录 MongoDB 服务器。
  2. 打开 MongoDB 配置文件 (mongod.conf)。默认位置:
    • Linux:/etc/mongod.conf
    • Windows:C:\Program Files\MongoDB\Server\<version>\bin\mongod.cfg
  3. 验证是否已启用审核日志记录。在 mongod.conf 文件中,确认以下设置:

    • auditLog.destination 设置为 file。
    • auditLog.format 设置为 JSON。
    • 请注意 auditLog.path(例如 /var/log/mongodb/auditLog.json)。

    • 如果未启用审核日志记录,请将以下内容添加到 mongod.conf:

    auditLog:
      destination: file
      format: JSON
      path: /var/log/mongodb/auditLog.json
    
  4. 重启 MongoDB 服务以应用配置:

    • Linux:

      sudo systemctl restart mongod
      
    • Windows:

      net stop MongoDB && net start MongoDB
      
  5. 验证审核日志文件是否已写入配置的路径(例如 /var/log/mongodb/auditLog.json)。

  6. 确保 config.yaml 中的 Bindplane 代理 include 路径与 mongod.conf 中配置的 auditLog.path 一致。

UDM 映射表

日志字段 UDM 映射 逻辑
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 根据条件从各个字段合并
db_mechanism, param.mechanism extensions.auth.auth_details 如果 db_mechanism 不为空,则为 db_mechanism 中的值;否则为 param.mechanism
extensions.auth.mechanism 设置为“MECHANISM_OTHER”
extensions.auth.type 设置为“AUTHTYPE_UNSPECIFIED”
lb_hostname, src_hostname intermediary.hostname lb_hostname 中的值(如果不为空),否则为 src_hostname
lb_port、src_port intermediary.port 如果 lb_port 不为空,则使用 lb_port 中的值;否则使用 src_port(转换为整数)
msg metadata.description 直接复制的值
metadata.event_type 根据 msg_atype、category、param_passwordChanged、param_command、remote_ip 条件设置
msg_atype, category metadata.product_event_type msg_atype 的值(如果不为空),否则为类别
id、type、traceId metadata.product_log_id 如果 id 不为空,则为 id 的值;如果 type == "04",则为 uuid.$binary;否则为 traceId
metadata.product_name 设为“MongoDB Enterprise”
metadata.vendor_name 设置为“MongoDB”
application_name principal.application 直接复制的值
accessLog.hostname principal.asset.hostname 直接复制的值
remote_ip principal.asset.ip 直接复制值
software_label principal.asset.software 从 software_label 合并
accessLog.hostname principal.hostname 直接复制的值
remote_ip principal.ip 直接复制值
os_type principal.platform 如果匹配 Windows,则设置为 WINDOWS;如果匹配 osx 或 mac,则设置为 MAC;如果匹配 Linux,则设置为 LINUX
os_name, param.clientMetadata.os.name principal.platform_patch_level 如果 os_name 不为空,则使用 os_name 中的值;否则使用 param.clientMetadata.os.name
os_version, param.clientMetadata.os.version principal.platform_version os_version 的值(如果不为空),否则为 param.clientMetadata.os.version
remote_port principal.port 已转换为整数
principal_userid principal.user.userid 直接复制的值
sr_action security_result.action 直接复制值
param.reason, param.indexBuildState security_result.description 如果 msg_atype == "logout",则值为 param.reason;如果 msg_atype 为 ["createIndex", "dropIndex"] 之一,则值为 param.indexBuildState
severity, level security_result.severity 如果严重级别为 ["i", "I"] 或级别为 ["INFO", "DEBUG"],则设置为 INFORMATIONAL;如果严重级别为 ["e", "E"] 或级别为 "ERROR",则设置为 ERROR;如果严重级别为 ["w", "W", "f", "F"],则设置为 MEDIUM
msg_result, attr.error, attr.planSummary, reason, attr.msg_data security_result.summary 根据 msg_result、attr.error、attr.planSummary、reason、attr.msg_data 条件进行设置
db_value target.administrative_domain 直接复制值
application_name target.application 直接复制的值
local_ip target.asset.ip 直接复制值
host_group target.group.group_display_name 直接复制值
local_ip target.ip 直接复制值
local_port target.port 已转换为整数
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 合并自各种标签字段
param_ns、db_value、param_new、param.args.find target.resource.name 根据 msg_atype 和 param_command 条件设置
target.resource.resource_subtype 对于数据库/用户事件,设置为“MongoDB 数据库”;对于集合事件,设置为“MongoDB 集合”;对于索引事件,设置为“MongoDB 索引”
target.resource.resource_type 对于数据库/用户事件,请设置为“DATABASE”;对于集合/索引事件,请设置为“TABLE”
db_user, param.user target.user.userid db_user 中的值(如果不为空),否则为 param.user
service.name event.idm.read_only_udm.target.application 从更新日志映射
host.name event.idm.read_only_udm.principal.hostname 从更新日志映射
host.name event.idm.read_only_udm.principal.asset.hostname 从更新日志映射
mongodb.group.id event.idm.read_only_udm.principal.group.product_object_id 从更新日志映射
mongodb.cluster.name event.idm.read_only_udm.target.resource.attribute.labels 从更新日志映射
mongodb.customer.cluster.name event.idm.read_only_udm.target.resource.attribute.labels 从更新日志映射
timestamp event.idm.read_only_udm.metadata.event_timestamp 从更新日志映射
ts.date event.idm.read_only_udm.metadata.event_timestamp 从更新日志映射
uuid.binary event.idm.read_only_udm.metadata.product_log_id 从更新日志映射
users.1.user event.idm.read_only_udm.principal.user.userid 从更新日志映射
remote.ip event.idm.read_only_udm.principal.ip和event.idm.read_only_udm.principal.asset.ip之间 从更新日志映射
remote.port event.idm.read_only_udm.principal.port 从更新日志映射
local.ip event.idm.read_only_udm.target.ip和event.idm.read_only_udm.target.asset.ip之间 从更新日志映射
local.port event.idm.read_only_udm.target.port 从更新日志映射
roles.role event.idm.read_only_udm.principal.user.attribute.roles 从更新日志映射
param.args.client.application.name event.idm.read_only_udm.principal.application 从更新日志映射
param.args.client.os.type event.idm.read_only_udm.principal.asset.platform_software.platform 从更新日志映射
param.args.client.os.version event.idm.read_only_udm.principal.platform_version 从更新日志映射
param.args.client.os.architecture event.idm.read_only_udm.principal.asset.hardware 从更新日志映射
atype event.idm.read_only_udm.metadata.product_event_type 从更新日志映射
param.command event.idm.read_only_udm.metadata.product_event_type 从更新日志映射
param.ns event.idm.read_only_udm.target.resource.name 从更新日志映射
result event.idm.read_only_udm.security_result.action 从更新日志映射
mongodb.log.type event.idm.read_only_udm.additional.fields 从更新日志映射
param.args.db event.idm.read_only_udm.additional.fields 从更新日志映射
uuid.type event.idm.read_only_udm.additional.fields 从更新日志映射
param.args.clientOperationKey.type event.idm.read_only_udm.additional.fields 从更新日志映射
param.args.clientOperationKey.binary event.idm.read_only_udm.additional.fields 从更新日志映射
param.args.aggregate event.idm.read_only_udm.additional.fields 从更新日志映射
param.args.mayBypassWriteBlocking event.idm.read_only_udm.additional.fields 从更新日志映射
param.args.configTime.timestamp.t event.idm.read_only_udm.additional.fields 从更新日志映射
param.args.topologyTime.timestamp.t event.idm.read_only_udm.additional.fields 从更新日志映射
param.args.audit event.idm.read_only_udm.additional.fields 从更新日志映射
param.args.cursor.batchSize.numberLong event.idm.read_only_udm.additional.fields 从更新日志映射
param.args.includeQueryStatsMetrics event.idm.read_only_udm.additional.fields 从更新日志映射
param.args.fromMongos event.idm.read_only_udm.additional.fields 从更新日志映射
param.args.readConcern.provenance event.idm.read_only_udm.additional.fields 从更新日志映射
param.args.readConcern.level event.idm.read_only_udm.additional.fields 从更新日志映射
param.args.writeConcern.provenance event.idm.read_only_udm.additional.fields 从更新日志映射
param.args.writeConcern.level event.idm.read_only_udm.additional.fields 从更新日志映射
param.args.client.platform event.idm.read_only_udm.additional.fields 从更新日志映射
param.args.client.driver.name event.idm.read_only_udm.additional.fields 从更新日志映射
param.args.client.driver.version event.idm.read_only_udm.additional.fields 从更新日志映射
param.args.client.os.name event.idm.read_only_udm.additional.fields 从更新日志映射
param.args.clusterTime event.idm.read_only_udm.additional.fields 从更新日志映射
param.args.lsid.id.type event.idm.read_only_udm.additional.fields 从更新日志映射
param.args.lsid.uid.binary event.idm.read_only_udm.additional.fields 从更新日志映射
param.args.users.1.db event.idm.read_only_udm.additional.fields 从更新日志映射
param.args.client.mongos.version event.idm.read_only_udm.additional.fields 从更新日志映射
param.args.writeConcern.w event.idm.read_only_udm.additional.fields 从更新日志映射
param.args.writeConcern.wtimeout event.idm.read_only_udm.additional.fields 从更新日志映射
param.args.lsid.uid.type event.idm.read_only_udm.additional.fields 从更新日志映射
param.args.pipeline.1.match.managedClusterType event.idm.read_only_udm.additional.fields 从更新日志映射
param.args.pipeline.2.group.n.sum.const event.idm.read_only_udm.additional.fields 从更新日志映射
param.args.pipeline.2.group._id.const event.idm.read_only_udm.additional.fields 从更新日志映射
param.args.client.mongos.client.port event.idm.read_only_udm.additional.fields 从更新日志映射
param.args.audit.impersonatedRoles event.idm.read_only_udm.principal.user.attribute.roles 从更新日志映射
param.args.audit.impersonatedUser event.idm.read_only_udm.principal.user.attribute.labels 从更新日志映射
param.args.client.mongos.client event.idm.read_only_udm.principal.ip和event.idm.read_only_udm.principal.asset.ip之间 从更新日志映射
param.args.client.mongos.host event.idm.read_only_udm.intermediary.ip 从更新日志映射
param.args.client.mongos.host event.idm.read_only_udm.intermediary.port 从更新日志映射
accessLog.authResult additional.fields 从更新日志映射
accessLog.authSource additional.fields 从更新日志映射
accessLog.failureReason additional.fields 从更新日志映射
accessLog.groupId target.resource.product_object_id 从更新日志映射
accessLog.ipAddress intermediary.ip 从更新日志映射
accessLog.logLine.t.$date additional.fields 从更新日志映射
accessLog.logLine.s additional.fields 从更新日志映射
accessLog.logLine.c additional.fields 从更新日志映射
accessLog.logLine.id additional.fields 从更新日志映射
accessLog.logLine.ctx additional.fields 从更新日志映射
accessLog.logLine.msg additional.fields 从更新日志映射
accessLog.logLine.attr.client additional.fields 从更新日志映射
accessLog.logLine.attr.isSpeculative additional.fields 从更新日志映射
accessLog.logLine.attr.isClusterMember additional.fields 从更新日志映射
accessLog.logLine.attr.mechanism additional.fields 从更新日志映射
accessLog.logLine.attr.user additional.fields 从更新日志映射
accessLog.logLine.attr.db additional.fields 从更新日志映射
accessLog.logLine.attr.result additional.fields 从更新日志映射
accessLog.logLine.attr.metrics.conversation_duration.micros additional.fields 从更新日志映射
accessLog.logLine.attr.metrics.conversation_duration.summary.step additional.fields 从更新日志映射
accessLog.logLine.attr.metrics.conversation_duration.summary.step_total additional.fields 从更新日志映射
accessLog.logLine.attr.metrics.conversation_duration.summary.duration_micros additional.fields 从更新日志映射
accessLog.username target.user.user_display_name 从更新日志映射
accessLog.timestamp additional.fields 从更新日志映射
roles.db principal.user.attribute.roles 从更新日志映射
roles.db target.user.attribute.roles 从更新日志映射

更新日志

查看此解析器的更新日志

需要更多帮助?获得社区成员和 Google SecOps 专业人士的解答。