איסוף יומנים של 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
- נכנסים למסוף Google SecOps.
- עוברים אל הגדרות SIEM > סוכן איסוף.
- לוחצים על Download כדי להוריד את קובץ האימות להטמעת נתונים.
שומרים את הקובץ בצורה מאובטחת במערכת שבה יותקן סוכן Bindplane.
איך מוצאים את מספר הלקוח ב-Google SecOps
- נכנסים למסוף Google SecOps.
- עוברים אל SIEM Settings > Profile (הגדרות SIEM > פרופיל).
מעתיקים את מזהה הלקוח מהקטע פרטי הארגון ושומרים אותו.
התקנת סוכן Bindplane
מתקינים את סוכן Bindplane במערכת ההפעלה Windows או Linux לפי ההוראות הבאות.
התקנה ב-Windows
- פותחים את שורת הפקודה או את PowerShell כאדמין.
מריצים את הפקודה הבאה:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quietמחכים שההתקנה תסתיים.
כדי לוודא שההתקנה בוצעה, מריצים את הפקודה:
sc query observiq-otel-collectorהשירות צריך להופיע עם הערך RUNNING.
התקנה ב-Linux
- פותחים טרמינל עם הרשאות root או sudo.
מריצים את הפקודה הבאה:
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.shמחכים שההתקנה תסתיים.
כדי לוודא שההתקנה בוצעה, מריצים את הפקודה:
sudo systemctl status observiq-otel-collectorהשירות אמור להופיע כ-active (running).
מקורות מידע נוספים להתקנה
לאפשרויות התקנה נוספות ולפתרון בעיות, קראו את מדריך ההתקנה של סוכן Bindplane.
הגדרה של סוכן Bindplane להטמעה של syslog ושליחה אל Google SecOps
איתור קובץ ההגדרות
Linux:
sudo nano /opt/observiq-otel-collector/config.yamlWindows:
notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
עריכת קובץ התצורה
מחליפים את כל התוכן של
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מחליפים את ה-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
- Linux:
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: לוחצים על קובץ > שמירה
- Linux: מקישים על
מפעילים מחדש את סוכן Bindplane כדי להחיל את השינויים
Linux
sudo systemctl restart observiq-otel-collectorמוודאים שהשירות פועל:
sudo systemctl status observiq-otel-collectorבודקים אם יש שגיאות ביומנים:
sudo journalctl -u observiq-otel-collector -f
Windows
בוחרים אחת מהאפשרויות האלה:
באמצעות שורת הפקודה או PowerShell כאדמין:
net stop observiq-otel-collector && net start observiq-otel-collectorשימוש במסוף Services:
- מקישים על
Win+R, מקלידיםservices.mscומקישים על Enter. - מאתרים את observIQ OpenTelemetry Collector.
- לוחצים לחיצה ימנית ובוחרים באפשרות הפעלה מחדש.
מוודאים שהשירות פועל:
sc query observiq-otel-collectorבודקים אם יש שגיאות ביומנים:
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
- מקישים על
הגדרת כלי הביקורת של IBM DB2
מגדירים את כלי הביקורת של DB2 כדי לתעד אירועי אבטחה ולחלץ אותם ל-syslog.
בדיקת ההגדרות הנוכחיות של הביקורת
מתחברים למופע DB2 בתור משתמש עם הרשאת SYSADM ומריצים את הפקודה:
db2audit describeכך מוצגת הגדרת הביקורת הנוכחית, כולל סטטוס הביקורת, הקטגוריות והנתיבים.
הגדרת נתיבי ביקורת
מגדירים את הספריות שבהן יאוחסנו יומני הביקורת:
db2audit configure datapath /db2audit/data db2audit configure archivepath /db2audit/archiveצריך לוודא שהספריות האלה קיימות ושיש להן הרשאות מתאימות לבעלים של המכונה של 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: טיפול סטנדרטי בשגיאות
-
הפעלת כלי הביקורת
להתחיל את הביקורת:
db2audit startמוודאים שהביקורת פעילה:
db2audit describeהפלט אמור להראות
Audit active: "TRUE".
הגדרה של syslog לקבלת יומני ביקורת של DB2
מגדירים את ה-daemon של ה-syslog במערכת כדי לקבל ולאחסן הודעות ביקורת של DB2.
Linux (rsyslog)
עורכים את קובץ ההגדרות של rsyslog:
sudo nano /etc/rsyslog.confמוסיפים את השורה הבאה כדי להפנות הודעות ביקורת של DB2 לקובץ ייעודי:
user.info /var/log/db2/db2audit.logיוצרים את ספריית היומן ואת הקובץ:
sudo mkdir -p /var/log/db2 sudo touch /var/log/db2/db2audit.log sudo chmod 640 /var/log/db2/db2audit.logמפעילים מחדש את rsyslog:
sudo systemctl restart rsyslog
AIX (syslogd)
עורכים את קובץ התצורה של syslog:
sudo vi /etc/syslog.confמוסיפים את השורה הבאה:
user.info /var/log/db2/db2audit.logיוצרים את ספריית היומן ואת הקובץ:
sudo mkdir -p /var/log/db2 sudo touch /var/log/db2/db2audit.log sudo chmod 640 /var/log/db2/db2audit.logמפעילים מחדש את 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.
יוצרים קובץ תצורה חדש של rsyslog:
sudo nano /etc/rsyslog.d/50-db2-forward.confמוסיפים את ההגדרה הבאה כדי להעביר את היומנים לסוכן Bindplane:
# Forward DB2 audit logs to Bindplane agent user.info @@127.0.0.1:1514הקידומת
@@מציינת העברת TCP. אם צריך, משתמשים ב-@עבור UDP.מפעילים מחדש את rsyslog:
sudo systemctl restart rsyslog
חילוץ אוטומטי של יומני ביקורת
יוצרים סקריפט כדי להפוך את תהליך הניקוי, ההעברה לארכיון והחילוץ לאוטומטי.
יצירת סקריפט לחילוץ
יוצרים סקריפט לחילוץ אוטומטי של יומן הביקורת:
sudo nano /usr/local/bin/db2audit-extract.shמוסיפים את התוכן הבא:
#!/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הופכים את הסקריפט לניתן להרצה:
sudo chmod +x /usr/local/bin/db2audit-extract.sh
תזמון באמצעות cron
מתזמנים את הסקריפט כך שיפעל מדי פעם באמצעות cron:
sudo crontab -eכדי להריץ את הסקריפט כל שעה, מוסיפים את השורה הבאה:
בוחרים אחת מהאפשרויות האלה:
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
- נכנסים למסוף Google SecOps.
- עוברים אל חיפוש.
מריצים שאילתת חיפוש כדי לוודא שיומני DB2 נקלטים:
metadata.log_type = "DB2_DB"מוודאים שהיומנים מופיעים עם חותמת הזמן והשדות הנכונים.
טבלת מיפוי 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.