איסוף יומנים של MongoDB

נתמך ב:

במאמר הזה מוסבר איך להטמיע יומני MongoDB ב-Google Security Operations באמצעות Bindplane.

‫MongoDB הוא מסד נתונים מסוג NoSQL לאחסון מסמכים שיוצר יומני ביקורת לפעולות CRUD, לאירועי אימות, לפקודות של מסד הנתונים ולפעולות של קבוצת העתקים. ‫MongoDB כותב קובצי יומן מובְנים בפורמט JSON באופן מקומי, וסוכן Bindplane יכול לאסוף אותם ישירות ממערכת הקבצים.

לפני שמתחילים

חשוב לוודא שמתקיימות הדרישות המוקדמות הבאות:

  • מופע של Google SecOps
  • ‫Windows Server 2016 ואילך, או מארח Linux עם systemd
  • קישוריות רשת בין סוכן Bindplane לבין שרת MongoDB
  • אם השרת פועל מאחורי שרת proxy, צריך לוודא שהיציאות של חומת האש פתוחות בהתאם לדרישות של סוכן Bindplane.
  • גישה עם הרשאות לשרת MongoDB (תפקיד אדמין של מסד נתונים או הרשאות בסיס)
  • ‫MongoDB Enterprise או MongoDB Community Edition עם רישום ביומן ביקורת מופעל

קבלת קובץ אימות להטמעת נתונים ב-Google SecOps

  1. נכנסים למסוף Google SecOps.
  2. עוברים אל הגדרות SIEM > סוכני איסוף.
  3. מורידים את קובץ האימות להטמעת נתונים. שומרים את הקובץ באופן מאובטח במערכת שבה יותקן Bindplane.

איך מוצאים את מספר הלקוח ב-Google SecOps

  1. נכנסים למסוף Google SecOps.
  2. עוברים אל SIEM Settings > Profile.
  3. מעתיקים את מזהה הלקוח מהקטע פרטי הארגון ושומרים אותו.

התקנת הסוכן של Bindplane

מתקינים את סוכן Bindplane במערכת ההפעלה Windows או Linux לפי ההוראות הבאות.

התקנת חלונות

  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
    

השירות צריך להופיע עם הערך RUNNING.

התקנה ב-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
    

השירות צריך להופיע כפעיל (פועל).

מקורות מידע נוספים להתקנה

אפשרויות התקנה נוספות ופתרון בעיות מפורטים במדריך להתקנת סוכן Bindplane.

הגדרה של סוכן Bindplane להטמעה של יומנים ושליחה שלהם אל Google SecOps

איתור קובץ ההגדרות

  • ‫Linux:

    sudo systemctl status observiq-otel-collector
    
  • ‫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:
            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
    

פרמטרים להגדרה

מחליפים את ה-placeholders הבאים:

  • הגדרת מקלט:

    • filelog: סוג המקלט לאיסוף קובצי יומן מהדיסק
    • ‫include: רשימת נתיבי קבצים למעקב:
      • ‫Linux: ‏ /var/log/mongodb/auditLog.json (נתיב ברירת המחדל של יומן הביקורת של MongoDB)
      • ‫Windows: ‏ C:\data\log\auditLog.json או הנתיב שהגדרתם ליומן הביקורת
    • ‫start_at: מגדירים את הערך beginning כדי לקרוא יומנים קיימים, או את הערך end כדי לקרוא רק רשומות חדשות
  • הגדרת כלי הייצוא:

    • ‫mongodb: שם תיאורי של הכלי לייצוא
    • ‫creds_file_path: הנתיב המלא לקובץ האימות להטמעת נתונים:
      • ‫Linux: /etc/bindplane-agent/ingestion-auth.json
      • Windows: C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json
    • ‫<customer_id>: מספר הלקוח מהשלב הקודם
    • ‫endpoint: כתובת ה-URL של נקודת הקצה האזורית:
      • ארה"ב: malachiteingestion-pa.googleapis.com
      • אירופה: europe-malachiteingestion-pa.googleapis.com
      • אסיה: asia-southeast1-malachiteingestion-pa.googleapis.com
      • רשימה מלאה מופיעה במאמר בנושא נקודות קצה אזוריות.
    • ‫MONGO_DB: סוג היומן בדיוק כמו שהוא מופיע ב-Chronicle
    • ‫ingestion_labels: תוויות אופציונליות בפורמט YAML (לדוגמה, env: production)
  • הגדרת צינור עיבוד הנתונים:

    • ‫mongodb_to_chronicle: שם תיאורי לצינור עיבוד הנתונים

שמירת קובץ התצורה

  • אחרי שמסיימים לערוך, שומרים את הקובץ:
    • ‫Linux: מקישים על Ctrl+O, אחר כך על Enter ואז על Ctrl+X.
    • Windows: לוחצים על קובץ > שמירה

מפעילים מחדש את הסוכן של Bindplane כדי להחיל את השינויים.

כדי להפעיל מחדש את סוכן Bindplane ב-Linux:

  1. מריצים את הפקודה הבאה:

    sudo systemctl restart observiq-otel-collector
    
  2. מוודאים שהשירות פועל:

    sudo systemctl status observiq-otel-collector
    
  3. בודקים אם יש שגיאות ביומנים:

    sudo journalctl -u observiq-otel-collector -f
    

כדי להפעיל מחדש את סוכן Bindplane ב-Windows:

  1. בוחרים אחת מהאפשרויות האלה:

    • שורת הפקודה או PowerShell כאדמין:
    net stop observiq-otel-collector && net start observiq-otel-collector
    
    • מסוף השירותים:
      1. מקישים על Win+R, מקלידים services.msc ומקישים על Enter.
      2. מאתרים את observIQ OpenTelemetry Collector.
      3. לוחצים לחיצה ימנית ובוחרים באפשרות הפעלה מחדש.
  2. מוודאים שהשירות פועל:

    sc query observiq-otel-collector
    
  3. בודקים אם יש שגיאות ביומנים:

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

הגדרת MongoDB ליצירת יומני ביקורת

  1. נכנסים לשרת MongoDB עם הרשאות אדמין או הרשאות root.
  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. מוודאים שהנתיב של סוכן Bindplane include ב-config.yaml תואם ל-auditLog.path שהוגדר ב-mongod.conf.

טבלת מיפוי 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 אם הוא לא ריק, אחרת 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 אם הוא לא ריק, אחרת 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 אם הוא לא ריק, אחרת הערך הוא category
id, type, traceId metadata.product_log_id הערך מ-id אם הוא לא ריק, אחרת uuid.$binary אם type == "04", אחרת 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,‏ MAC אם התוצאה תואמת ל-OSX או ל-Mac,‏ LINUX אם התוצאה תואמת ל-Linux
os_name, param.clientMetadata.os.name principal.platform_patch_level הערך מ-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 הערך מ-param.reason אם msg_atype == "logout"; מ-param.indexBuildState אם msg_atype in ["createIndex", "dropIndex"]
severity, level security_result.severity הערך INFORMATIONAL אם חומרת הבעיה היא [i, I] או הרמה היא [INFO, DEBUG]; הערך ERROR אם חומרת הבעיה היא [e, E] או הרמה היא ERROR; הערך MEDIUM אם חומרת הבעיה היא [w, W, f, F]
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 Database' לאירועים של מסד נתונים או משתמש, את הערך 'MongoDB Collection' לאירועים של אוסף ואת הערך 'MongoDB Index' לאירועים של אינדקס
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.