איסוף יומנים של IBM DB2

נתמך ב:

במאמר הזה מוסבר איך להטמיע יומנים של IBM DB2 ב-Google Security Operations באמצעות סוכן Bindplane.

‫IBM Db2 היא מערכת ניהול של מסד נתונים (RDBMS) שמספקת כלי ביקורת שעוזר לזהות גישה לא ידועה או לא צפויה לנתונים. הכלי לביקורת של Db2 יוצר ומאפשר תחזוקה של נתיב ביקורת עבור סדרה של אירועים מוגדרים מראש במסד הנתונים.

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

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

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

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

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

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

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

התקנת סוכן Bindplane

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

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

    השירות צריך להופיע עם הערך 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
    

    השירות אמור להופיע כ-active (running).

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

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

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

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

  • ‫Linux:

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

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

עריכת קובץ התצורה

  1. מחליפים את כל התוכן של config.yaml בהגדרה הבאה:

    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_audit
    
  2. מחליפים את ה-placeholders הבאים:

    • הגדרת מקלט:

      • ‫listen_address: צריך להגדיר את הערך 0.0.0.0:1514 כדי להאזין לכל הממשקים ביציאה 1514 (מומלץ להשתמש ביציאה ללא הרשאות ב-Linux).
    • הגדרת כלי הייצוא:

      • ‫creds_file_path: הנתיב המלא לקובץ האימות להטמעת נתונים:

        • Linux: /opt/observiq-otel-collector/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
        • רשימה מלאה מופיעה במאמר בנושא נקודות קצה אזוריות.
      • ‫log_type: מוגדר לערך DB2_DB

      • ‫ingestion_labels: תוויות אופציונליות בפורמט YAML (לדוגמה, env: production)

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

  • אחרי העריכה, שומרים את הקובץ:

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

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

  • Linux

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

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

      sudo journalctl -u observiq-otel-collector -f
      
  • Windows

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

    • באמצעות שורת הפקודה או PowerShell כאדמין:

      net stop observiq-otel-collector && net start observiq-otel-collector
      
    • שימוש במסוף Services:

      1. מקישים על Win+R, מקלידים services.msc ומקישים על Enter.
      2. מאתרים את observIQ OpenTelemetry Collector.
      3. לוחצים לחיצה ימנית ובוחרים באפשרות הפעלה מחדש.
      4. מוודאים שהשירות פועל:

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

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

הגדרת כלי הביקורת של IBM DB2

מגדירים את כלי הביקורת של DB2 כדי לתעד אירועי אבטחה ולחלץ אותם ל-syslog.

בדיקת ההגדרות הנוכחיות של הביקורת

  • מתחברים למופע DB2 בתור משתמש עם הרשאת SYSADM ומריצים את הפקודה:

    db2audit describe
    

    כך מוצגת הגדרת הביקורת הנוכחית, כולל סטטוס הביקורת, הקטגוריות והנתיבים.

הגדרת נתיבי ביקורת

  1. מגדירים את הספריות שבהן יאוחסנו יומני הביקורת:

    db2audit configure datapath /db2audit/data
    db2audit configure archivepath /db2audit/archive
    
  2. צריך לוודא שהספריות האלה קיימות ושיש להן הרשאות מתאימות לבעלים של המכונה של DB2:

    mkdir -p /db2audit/data /db2audit/archive
    chown db2inst1:db2iadm1 /db2audit/data /db2audit/archive
    chmod 750 /db2audit/data /db2audit/archive
    

הגדרת ההיקף והקטגוריות של הביקורת

  • הגדירו את מתקן הביקורת כך שיתעד את כל אירועי האבטחה:

    db2audit configure scope all status both errortype normal
    

    ההגדרה הזו קובעת:

    • ‫scope all: ביקורת על כל הקטגוריות (audit, checking, objmaint, secmaint, sysadmin, validate, context)
    • ‫status both: מתעד גם אירועים שהצליחו וגם אירועים שנכשלו
    • ‫errortype normal: טיפול סטנדרטי בשגיאות

הפעלת כלי הביקורת

  1. להתחיל את הביקורת:

    db2audit start
    
  2. מוודאים שהביקורת פעילה:

    db2audit describe
    

    הפלט אמור להראות Audit active: "TRUE".

הגדרה של syslog לקבלת יומני ביקורת של DB2

מגדירים את ה-daemon של ה-syslog במערכת כדי לקבל ולאחסן הודעות ביקורת של DB2.

‫Linux (rsyslog)

  1. עורכים את קובץ ההגדרות של rsyslog:

    sudo nano /etc/rsyslog.conf
    
  2. מוסיפים את השורה הבאה כדי להפנות הודעות ביקורת של DB2 לקובץ ייעודי:

    user.info /var/log/db2/db2audit.log
    
  3. יוצרים את ספריית היומן ואת הקובץ:

    sudo mkdir -p /var/log/db2
    sudo touch /var/log/db2/db2audit.log
    sudo chmod 640 /var/log/db2/db2audit.log
    
  4. מפעילים מחדש את rsyslog:

    sudo systemctl restart rsyslog
    

AIX (syslogd)

  1. עורכים את קובץ התצורה של syslog:

    sudo vi /etc/syslog.conf
    
  2. מוסיפים את השורה הבאה:

    user.info /var/log/db2/db2audit.log
    
  3. יוצרים את ספריית היומן ואת הקובץ:

    sudo mkdir -p /var/log/db2
    sudo touch /var/log/db2/db2audit.log
    sudo chmod 640 /var/log/db2/db2audit.log
    
  4. מפעילים מחדש את syslogd:

    sudo refresh -s syslogd
    

חילוץ יומני ביקורת של DB2 ל-syslog

לחלץ יומני ביקורת מארכיון ולשלוח אותם לדימון syslog של המערכת.

ניקוי יומני ביקורת והעברה לארכיון

  • לפני החילוץ, צריך לנקות את כל רשומות הביקורת שממתינות ולהעביר לארכיון את יומן הביקורת הנוכחי:

    db2audit flush
    db2audit archive
    

    הפקודה archive יוצרת קבצים עם חותמות זמן בנתיב הארכיון (לדוגמה, db2audit.instance.log.0.20250110123456).

חילוץ יומני ביקורת ל-syslog

  • מחלקים את יומני הביקורת שהועברו לארכיון ושולחים אותם ל-syslog באמצעות המתקן והעדיפות user.info:

    db2audit extract syslog user.info from files /db2audit/archive/db2audit.instance.log.0.*
    

    הפקודה הזו:

    • חילוץ רשומות ביקורת מקובצי היומן שנשמרו בארכיון
    • הנתונים נשלחים לדמון של syslog במערכת עם מתקן user ועדיפות info
    • הדימון של syslog מנתב את ההודעות בהתאם ל-/etc/syslog.conf או ל-/etc/rsyslog.conf

איך מוודאים שהיומנים נשלחים

  • בודקים שהודעות הביקורת נכתבות בקובץ syslog:

    tail -f /var/log/db2/db2audit.log
    

    רשומות הביקורת של DB2 אמורות להופיע בקובץ היומן.

הגדרת rsyslog להעברת יומנים לסוכן Bindplane

מגדירים את rsyslog להעברת יומני ביקורת של DB2 לסוכן Bindplane.

  1. יוצרים קובץ תצורה חדש של rsyslog:

    sudo nano /etc/rsyslog.d/50-db2-forward.conf
    
  2. מוסיפים את ההגדרה הבאה כדי להעביר את היומנים לסוכן Bindplane:

    # Forward DB2 audit logs to Bindplane agent
    user.info @@127.0.0.1:1514
    

    הקידומת @@ מציינת העברת TCP. אם צריך, משתמשים ב-@ עבור UDP.

  3. מפעילים מחדש את rsyslog:

    sudo systemctl restart rsyslog
    

חילוץ אוטומטי של יומני ביקורת

יוצרים סקריפט כדי להפוך את תהליך הניקוי, ההעברה לארכיון והחילוץ לאוטומטי.

יצירת סקריפט לחילוץ

  1. יוצרים סקריפט לחילוץ אוטומטי של יומן הביקורת:

    sudo nano /usr/local/bin/db2audit-extract.sh
    
  2. מוסיפים את התוכן הבא:

    #!/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 0
    
  3. הופכים את הסקריפט לניתן להרצה:

    sudo chmod +x /usr/local/bin/db2audit-extract.sh
    

תזמון באמצעות cron

  1. מתזמנים את הסקריפט כך שיפעל מדי פעם באמצעות cron:

    sudo crontab -e
    
  2. כדי להריץ את הסקריפט כל שעה, מוסיפים את השורה הבאה:

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

    0 * * * * /usr/local/bin/db2audit-extract.sh >> /var/log/db2/db2audit-extract.log 2>&1
    

    אפשר גם להגדיר הפעלה כל 15 דקות כדי לבצע חילוץ בתדירות גבוהה יותר:

    */15 * * * * /usr/local/bin/db2audit-extract.sh >> /var/log/db2/db2audit-extract.log 2>&1
    

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

  1. נכנסים למסוף Google SecOps.
  2. עוברים אל חיפוש.
  3. מריצים שאילתת חיפוש כדי לוודא שיומני DB2 נקלטים:

    metadata.log_type = "DB2_DB"
    
  4. מוודאים שהיומנים מופיעים עם חותמת הזמן והשדות הנכונים.

טבלת מיפוי UDM

שדה ביומן מיפוי UDM היגיון
msg event.idm.read_only_udm.additional.fields הערך נלקח מההודעה אם ההודעה שונה מ-""
מערכת event.idm.read_only_udm.additional.fields הערך נלקח מהמערכת אם המערכת != ""
מערכת משנה event.idm.read_only_udm.additional.fields הערך נלקח מ-Subsystem אם Subsystem != ""
auth_mechanism event.idm.read_only_udm.extensions.auth.mechanism הערך שמוגדר הוא USERNAME_PASSWORD לאירועים מסוג USER_LOGIN
CorrelationUser event.idm.read_only_udm.intermediary.user.userid הערך נלקח מ-CorrelationUser אם CorrelationUser != ""
סכום event.idm.read_only_udm.metadata.description הערך נלקח מהסכום
date_time event.idm.read_only_udm.metadata.event_timestamp הערכים הומרו משדות של תאריך ושעה לפורמט ISO8601 אם שניהם != ""
leef_event_id event.idm.read_only_udm.metadata.product_event_type הערך נלקח מ-leef_event_id
event.idm.read_only_udm.metadata.event_type נגזר מ-leef_event_id: אם ב-["102-87", "102-83"] ← USER_LOGIN; אם ב-["102-6", "102-7", "102-8", "102-10", "102-24", "102-143"] ← USER_RESOURCE_ACCESS או USER_RESOURCE_UPDATE_CONTENT על סמך הכוונה; אם "102-319" ← USER_RESOURCE_ACCESS; אחרת GENERIC_EVENT
event.idm.read_only_udm.metadata.product_name ההגדרה היא DB2
event.idm.read_only_udm.metadata.vendor_name ההגדרה היא 'IBM'
SSID event.idm.read_only_udm.network.session_id הערך נלקח מ-SSID אם SSID != ""
עבודה event.idm.read_only_udm.principal.application הערך נלקח מהמשימה אם המשימה != ""
sourceServiceName event.idm.read_only_udm.principal.application הערך נלקח מ-sourceServiceName
sourceHostName event.idm.read_only_udm.principal.asset.hostname הערך נלקח מ-sourceHostName אם sourceHostName != ""
principal_ip event.idm.read_only_udm.principal.asset.ip הערך נלקח מ-principal_ip עבור אירועים 102-319
product_id event.idm.read_only_udm.principal.asset_id הערך שמוגדר לאירועים 102-319 הוא 'מזהה מוצר: %{product_id}‎'
sourceHostName event.idm.read_only_udm.principal.hostname הערך נלקח מ-sourceHostName אם sourceHostName != ""
principal_ip event.idm.read_only_udm.principal.ip הערך נלקח מ-principal_ip לאירועים 102-319
יוצר event.idm.read_only_udm.principal.user.user_display_name הערך נלקח מהיוצר
name event.idm.read_only_udm.principal.user.user_display_name הערך נלקח מהשם אם השם שונה מ-""
AuthenticatedUser event.idm.read_only_udm.principal.user.userid הערך נלקח מ-AuthenticatedUser אם AuthenticatedUser != ""
sourceUserName event.idm.read_only_udm.principal.user.userid הערך נלקח מ-sourceUserName
usrName event.idm.read_only_udm.principal.user.userid הערך נלקח מ-usrName
_action event.idm.read_only_udm.security_result.action נגזר מסכום: אם מכיל 'successful' ‏→ ALLOW; אחרת BLOCK לאירועים מסוג USER_LOGIN
deviceHostName event.idm.read_only_udm.target.asset.hostname הערך נלקח מ-deviceHostName
conn_location3 event.idm.read_only_udm.target.asset.hostname הערך נלקח מ-conn_location3 אם conn_location3 != ""
file_name event.idm.read_only_udm.target.file.full_path הערך נלקח מ-file_name אם file_name != ""
deviceHostName event.idm.read_only_udm.target.hostname הערך נלקח מ-deviceHostName
conn_location3 event.idm.read_only_udm.target.hostname הערך נלקח מ-conn_location3 אם conn_location3 != ""
conn_location, conn_location2 event.idm.read_only_udm.target.location.name הערך הוא שרשור של conn_location ו-conn_location2 אם שניהם שונים מ-""
deviceProcessName event.idm.read_only_udm.target.process.command_line הערך נלקח מ-deviceProcessName
SQL event.idm.read_only_udm.target.process.command_line הערך נלקח מ-SQL אם SQL != ""
Connection_Type event.idm.read_only_udm.target.resource.attribute.labels המפתח Connection Type עם ערך מ-Connection_Type
תוכנית event.idm.read_only_udm.target.resource.attribute.labels מזינים את המילה Plan עם הערך מהתוכנית
DB2_Subsystem event.idm.read_only_udm.target.resource.attribute.labels המפתח "DB2 Subsystem" עם הערך מ-DB2_Subsystem
Priv_Check_Code event.idm.read_only_udm.target.resource.attribute.labels המפתח Priv Check Code עם הערך מ-Priv_Check_Code
Table_Name event.idm.read_only_udm.target.resource.attribute.labels המפתח Table Name עם ערך מ-Table_Name
MessageType event.idm.read_only_udm.target.resource.attribute.labels המפתח Message Type עם ערך מ-MessageType
Check_type event.idm.read_only_udm.target.resource.attribute.labels מפתח "סוג המחאה" עם ערך מ-Check_type
deviceAction event.idm.read_only_udm.target.resource.attribute.labels המפתח 'פעולת המכשיר' עם ערך שמופה מ-deviceAction: ‏ G → GRANT, ‏ R → REVOKE
SSID event.idm.read_only_udm.target.resource.attribute.labels המפתח 'SSID' עם ערך מ-SSID אם הערך != ''
SQL event.idm.read_only_udm.target.resource.attribute.labels המפתח שאילתת SQL עם ערך מ-SQL אם SQL != ""
messageid event.idm.read_only_udm.target.resource.id הערך נלקח מ-messageid
Object_Class_Code event.idm.read_only_udm.target.resource.parent הערך נלקח מ-Object_Class_Code
obj event.idm.read_only_udm.target.resource.name הערך נלקח מאובייקט
resource_name event.idm.read_only_udm.target.resource.name הערך נלקח מ-resource_name שחולץ מ-SQL אם SQL != ""‎ ולא ריק
Database_Name event.idm.read_only_udm.target.resource.name הערך נלקח מ-Database_Name
objtyp event.idm.read_only_udm.target.resource.resource_subtype הערך נלקח מ-objtyp (באותיות רישיות) אם objtyp != ""
סוג event.idm.read_only_udm.target.resource.resource_subtype נגזר מהסוג: T ‏← TABLE, ‏ V ‏← VIEW, ‏ X ‏← AUXILIARY TABLE
event.idm.read_only_udm.target.resource.resource_type צריך להגדיר את הערך "DATABASE"
principal_hostname event.idm.read_only_udm.principal.asset.hostname וגם event.idm.read_only_udm.principal.hostname מופה מיומן השינויים
category event.idm.read_only_udm.security_result.category_details מופה מיומן השינויים
audit event event.idm.read_only_udm.metadata.product_event_type מופה מיומן השינויים
event correlator event.idm.read_only_udm.metadata.product_log_id מופה מיומן השינויים
instance name event.idm.read_only_udm.target.resource.name מופה מיומן השינויים
application name event.idm.read_only_udm.principal.application מופה מיומן השינויים
archive path event.idm.read_only_udm.target.file.full_path מופה מיומן השינויים
execution id event.idm.read_only_udm.principal.resource.attribute.labels מופה מיומן השינויים
application id event.idm.read_only_udm.principal.resource.attribute.labels מופה מיומן השינויים
authid event.idm.read_only_udm.principal.resource.attribute.labels מופה מיומן השינויים
event status event.idm.read_only_udm.security_result.detection_fields מופה מיומן השינויים
access attempted event.idm.read_only_udm.security_result.detection_fields מופה מיומן השינויים
access_approval_reason event.idm.read_only_udm.security_result.detection_fields מופה מיומן השינויים
timestamp_1 event.idm.read_only_udm.additional.fields מופה מיומן השינויים
object type event.idm.read_only_udm.additional.fields מופה מיומן השינויים
plugin name event.idm.read_only_udm.additional.fields מופה מיומן השינויים
auth type event.idm.read_only_udm.additional.fields מופה מיומן השינויים
System" and "Subsystem additional.fields מופה מיומן השינויים
ConnectionType principal.process.pid מופה מיומן השינויים
plan principal.resource.name מופה מיומן השינויים
SQL principal.process.command_line מופה מיומן השינויים

יומן שינויים

צפייה ביומן השינויים של כלי הניתוח הזה

הבעיה עדיין לא נפתרה? קבלת תשובות מחברי הקהילה וממומחי Google SecOps.