איסוף יומנים של BloxOne Threat Defense
גרסת מנתח: 8.0
במאמר הזה מוסבר איך להטמיע יומנים של BloxOne Threat Defense ב-Google Security Operations באמצעות סוכן Bindplane.
Infoblox BloxOne Threat Defense הוא שירות אבטחת DNS שמנוהל בענן ומייצר הודעות syslog בפורמט CEF לשאילתות DNS, לאירועי מודיעין איומי סייבר ולפעולות מדיניות. הכלי לניתוח מחלק את השדות וממפה אותם למודל הנתונים המאוחד (UDM).
לפני שמתחילים
חשוב לוודא שמתקיימות הדרישות המוקדמות הבאות:
- מופע של Google SecOps
- Windows Server 2016 ואילך, או מארח Linux עם
systemd - קישוריות לרשת בין סוכן Bindplane לבין פלטפורמת Infoblox BloxOne
- אם מריצים מאחורי שרת proxy, מוודאים שיציאות חומת האש פתוחות בהתאם לדרישות של סוכן Bindplane
- גישה מורשית ל-Infoblox Portal
קבלת קובץ אימות להטמעת נתונים ב-Google SecOps
- נכנסים למסוף Google SecOps.
- עוברים אל SIEM Settings > Collection Agents.
- הורדה של קובץ אימות להטמעת נתונים
שומרים את הקובץ בצורה מאובטחת במערכת שבה יותקן סוכן 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השירות צריך להופיע כפעיל (פועל).
מקורות מידע נוספים להתקנה
אפשרויות התקנה נוספות ופתרון בעיות מפורטים במדריך להתקנת סוכן Bindplane.
הגדרה של סוכן Bindplane לקליטת syslog ושליחה ל-Google SecOps
איתור קובץ ההגדרות
Linux:
sudo nano /etc/bindplane-agent/config.yamlWindows:
notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
עריכת קובץ ההגדרות
מחליפים את כל התוכן של
config.yamlבהגדרה הבאה:receivers: udplog: listen_address: "0.0.0.0:514" exporters: chronicle/bloxone: compression: gzip creds_file_path: '/etc/bindplane-agent/ingestion-auth.json' customer_id: '<customer_id>' endpoint: malachiteingestion-pa.googleapis.com log_type: BLOXONE raw_log_field: body service: pipelines: logs/bloxone_to_chronicle: receivers: - udplog exporters: - chronicle/bloxone
פרמטרים להגדרה
מחליפים את ה-placeholders הבאים:
הגדרת מקלט:
-
listen_address: כתובת ה-IP והיציאה להאזנה:-
0.0.0.0כדי להאזין בכל הממשקים (מומלץ) - יציאה
514היא יציאת syslog רגילה (נדרשת הרשאת root ב-Linux; אפשר להשתמש ב-1514ללא הרשאת root)
-
-
הגדרת כלי הייצוא:
-
creds_file_path: הנתיב המלא לקובץ האימות להטמעת נתונים:- Linux:
/etc/bindplane-agent/ingestion-auth.json - Windows:
C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json
- Linux:
-
customer_id: מספר הלקוח שהועתק ממסוף Google SecOps -
endpoint: כתובת ה-URL של נקודת הקצה האזורית:- ארה"ב:
malachiteingestion-pa.googleapis.com - אירופה:
europe-malachiteingestion-pa.googleapis.com - אסיה:
asia-southeast1-malachiteingestion-pa.googleapis.com - רשימה מלאה מופיעה במאמר בנושא נקודות קצה אזוריות.
- ארה"ב:
-
שמירת קובץ ההגדרות
- אחרי שמסיימים לערוך, שומרים את הקובץ:
- Linux: מקישים על
Ctrl+O, אחר כך עלEnterואז עלCtrl+X. - Windows: לוחצים על קובץ > שמירה.
- Linux: מקישים על
מפעילים מחדש את סוכן Bindplane כדי להחיל את השינויים.
כדי להפעיל מחדש את סוכן Bindplane ב-Linux, מריצים את הפקודה הבאה:
sudo systemctl restart observiq-otel-collectorמוודאים שהשירות פועל:
sudo systemctl status observiq-otel-collectorבודקים אם יש שגיאות ביומנים:
sudo journalctl -u observiq-otel-collector -f
כדי להפעיל מחדש את סוכן Bindplane ב-Windows, בוחרים באחת מהאפשרויות הבאות:
שורת הפקודה או PowerShell כאדמין:
net stop observiq-otel-collector && net start observiq-otel-collectorמסוף השירותים:
- מקישים על
Win+R, מקלידיםservices.mscומקישים על Enter. - מחפשים את observIQ OpenTelemetry Collector.
- לוחצים לחיצה ימנית ובוחרים באפשרות הפעלה מחדש.
מוודאים שהשירות פועל:
sc query observiq-otel-collectorבודקים אם יש שגיאות ביומנים:
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
- מקישים על
הגדרת syslog ב-Infoblox BloxOne
- נכנסים אל Infoblox Portal.
- עוברים אל הגדרה > ניהול > Data Connector (מחבר נתונים).
- בוחרים בכרטיסייה הגדרת יעד.
- לוחצים על יצירה > Syslog.
- מספקים את פרטי ההגדרה הבאים:
- שם: מציינים שם תיאורי (לדוגמה, Google SecOps collector).
- תיאור: צריך לספק תיאור קצר.
- מצב: בוחרים באפשרות הפעלה.
- תגים: לוחצים על הוספה ומציינים את הפרטים הבאים כדי לשייך מפתח ליעד:
- KEY: מזינים שם תיאורי למפתח.
- VALUE: מזינים את הערך של המפתח.
- פורמט: בוחרים באפשרות CEF.
- פרוטוקול: בוחרים באפשרות UDP או TCP (בהתאם להגדרות של סוכן Bindplane).
- FQDN/IP: מזינים את כתובת ה-IP של סוכן Bindplane.
- יציאה: מזינים את היציאה של סוכן Bindplane (ברירת המחדל היא
514ל-UDP).
- לוחצים על Save & Close (שמירה וסגירה).
טבלת מיפוי UDM
| שדה ביומן | מיפוי UDM | היגיון |
|---|---|---|
additional_list.key |
השדה הזה משמש בלולאה כדי לבצע איטרציה במערך additional_list ולחלץ נתונים על סמך הערך של השדה key. היא לא ממופה ישירות ל-UDM. |
|
additional_list.value |
principal.location.region_latitude, principal.location.region_longitude, target.location.region_latitude, target.location.region_longitude |
השדה הזה משמש בשילוב עם additional_list.key כדי לחלץ ערכים ספציפיים מהמערך additional_list. הלוגיקה לחילוץ ולמיפוי הערך תלויה בkey המתאים. לדוגמה: – אם additional_list.key הוא intel:source:ip:geoIP:location, מחלצים את ערכי קו הרוחב וקו האורך באמצעות grok וממפים אותם ל-principal.location.region_latitude ול-principal.location.region_longitude, בהתאמה. – אם additional_list.key הוא intel:destination:ip:geoIP:location, מחלצים את ערכי קו הרוחב וקו האורך באמצעות grok וממפים אותם ל-target.location.region_latitude ול-target.location.region_longitude, בהתאמה. |
additional_string.key |
בדומה ל-additional_list.key, השדה הזה משמש בלולאה כדי לבצע איטרציה במערך additional_string ולחלץ נתונים על סמך הערך key. היא לא ממופה ישירות ל-UDM. |
|
additional_string.value |
additional.fields.value.string_value, principal.location.country_or_region, target.location.country_or_region, src.ip, src.port, src.hostname, network.ip_protocol |
משמש עם additional_string.key כדי לחלץ ערכים מהמערך additional_string. הלוגיקה למיפוי הערך תלויה בkey המתאים. לדוגמה: – אם additional_string.key הוא intel:source:ip:ip2asn:start_ip, intel:source:ip:ip2asn:finish_ip, intel:destination:ip:ip2asn:start_ip או intel:destination:ip:ip2asn:finish_ip, ממפים את הערך ל-additional.fields.value.string_value עם המפתח המתאים. – אם additional_string.key הוא intel:source:ip:geoIP:country, ממפים את הערך ל-principal.location.country_or_region. – אם additional_string.key הוא intel:destination:ip:geoIP:country, ממפים את הערך ל-target.location.country_or_region. – אם additional_string.key הוא log:source:ip, ממפים את הערך ל-src.ip. – אם additional_string.key הוא log:source:port, ממפים את הערך ל-src.port אחרי שממירים אותו למספר שלם. – אם additional_string.key הוא log:source:hostname, ממפים את הערך ל-src.hostname. – אם הערך של additional_string.key הוא log:cdh:input:protocol, ממפים את הערך ל-network.ip_protocol אחרי שממירים אותו לאותיות רישיות. |
app_category |
security_result.category_details |
ממופים ישירות. |
confidence |
security_result.confidence |
המיפוי מבוסס על הלוגיקה הבאה: – אם confidence הוא LOW, המיפוי הוא LOW_CONFIDENCE.– אם confidence הוא MEDIUM, מיפוי ל-MEDIUM_CONFIDENCE.– אם confidence הוא HIGH, מיפוי ל-HIGH_CONFIDENCE. |
country |
principal.location.name |
ממופה ישירות, אבל רק אם raw.infobloxb1region ריק. |
device |
principal.ip, principal.asset.ip |
ממופה ישירות, אבל רק אם raw.dvc ריק. |
dhcp_fingerprint |
security_result.detection_fields.value |
ממופה ישירות למקש dhcp_fingerprint. |
dns_view |
security_result.detection_fields.value |
ממופה ישירות למקש dns_view. |
endpoint_groups |
security_result.detection_fields.value |
ממופה ישירות למקש endpoint_groups. |
event_time |
metadata.event_timestamp.seconds |
הערך מנותח כחותמת זמן בפורמט ISO8601, וערך השניות מחולץ. השדה הזה משמש רק אם השדה timestamp ריק. |
feed_name |
principal.resource.name |
feed_name ממופה ל-principal.resource.name. |
feed_type |
principal.resource.attribute.labels.value |
ממופה ישירות למקש feed_type. |
mac_address |
principal.mac |
ממופה ישירות אחרי המרה לאותיות קטנות. |
network |
principal.hostname, principal.asset.hostname |
ממופה ישירות, אבל רק אם גם raw.dvchost וגם raw.dvc ריקים. |
os_version |
principal.platform_version |
ממופים ישירות. |
policy_action |
security_result.action_details, security_result.action |
policy_action ממופה ישירות ל-security_result.action_details.הערך של security_result.action נגזר מהלוגיקה הבאה:– אם הערך של policy_action הוא Redirect או Log, המיפוי הוא ל-ALLOW.– אם policy_action הוא BLOCK, ממפים ל-BLOCK. |
policy_name |
security_result.detection_fields.value |
ממופה ישירות למקש policy_name. |
qname |
network.dns.questions.name |
ממופים ישירות. |
qtype |
network.dns.questions.type |
המיפוי מתבצע לפי הלוגיקה הבאה: – אם qtype הוא A, המיפוי הוא ל-1 (הערך מומר למספר שלם לא מסומן).– אם qtype הוא PTR, ממפים ל-12 (מומר למספר שלם לא מסומן). |
raw.act |
security_result.action_details |
ממופים ישירות. |
raw.app |
network.application_protocol |
ממופה ישירות אחרי ההמרה לאותיות רישיות. |
raw.deviceeventclassid |
metadata.product_event_type |
הערך משורשר עם raw.name (מופרד באמצעות -) וממופה אל metadata.product_event_type. |
raw.devicevendor |
metadata.vendor_name |
ממופים ישירות. |
raw.deviceproduct |
metadata.product_name |
ממופים ישירות. |
raw.deviceversion |
metadata.product_version |
ממופים ישירות. |
raw.deviceseverity |
security_result.severity_details, security_result.severity |
raw.deviceseverity ממופה ישירות ל-security_result.severity_details.הערך של security_result.severity נגזר מהלוגיקה הבאה:– אם הערך של raw.deviceseverity הוא אחד מהערכים [0, 1, 2, 3], המיפוי הוא ל-LOW.– אם raw.deviceseverity נמצא ב- [4, 5, 6], המיפוי הוא ל-MEDIUM.– אם raw.deviceseverity נמצא בטווח [7, 8], מפה ל-HIGH.– אם raw.deviceseverity נמצא בטווח [9, 10], מפה ל-CRITICAL. |
raw.dvc |
principal.ip, principal.asset.ip |
ממופים ישירות. |
raw.dvchost |
principal.hostname, principal.asset.hostname |
מיפוי ישיר, אבל רק אם הערך לא שווה ל-raw.dvc. |
raw.infobloxb1connectiontype |
additional.fields.value.string_value |
ממופה ישירות למקש infobloxb1connectiontype. |
raw.infobloxb1ophname |
observer.hostname, observer.asset.hostname |
ממופים ישירות. |
raw.infobloxb1ophipaddress |
observer.ip |
ממופים ישירות. |
raw.infobloxb1policyname |
security_result.detection_fields.value |
ממופה ישירות למקש infobloxb1policyname. |
raw.infobloxdnsqclass |
dns_question.class, dns_answer.class |
השדות האלה משמשים להפקת הערכים dns_question.class ו-dns_answer.class על סמך טבלת מיפוי שמוגדרת בקובץ dns_query_class_mapping.include. |
raw.infobloxdnsqtype |
dns_question.type, dns_answer.type |
השדות האלה משמשים להפקת הערכים dns_question.type ו-dns_answer.type על סמך טבלת מיפוי שמוגדרת בקובץ dns_record_type.include. |
raw.infobloxdnsrcode |
network.dns.response_code |
השדה הזה משמש להפקת הערך network.dns.response_code על סמך טבלת מיפוי שמוגדרת בקובץ dns_response_code.include. |
raw.infobloxpolicyid |
security_result.detection_fields.value |
ממופה ישירות למקש infobloxpolicyid. |
raw.msg |
metadata.description |
raw.msg ממופה ישירות ל-metadata.description אחרי הסרת המירכאות הפותחות והסוגרות. |
raw.name |
metadata.product_event_type |
הערך משורשר עם raw.deviceeventclassid (מופרד באמצעות -) וממופה אל metadata.product_event_type. |
rcode |
security_result.detection_fields.value, network.dns.response_code |
rcode ממופה ישירות ל-security_result.detection_fields.value עם המפתח rcode.אם rcode הוא NXDOMAIN, הערך של network.dns.response_code מוגדר כ-3 (אחרי המרה למספר שלם לא חתום). |
rdata |
network.dns.answers.data |
ממופים ישירות. |
rip |
target.ip, target.asset.ip |
ממופים ישירות. |
severity |
security_result.severity |
מיפוי על סמך הלוגיקה הבאה: – אם severity הוא INFO (לא תלוי באותיות רישיות), המיפוי הוא ל-INFORMATIONAL.– אם severity הוא HIGH, ממפים ל-HIGH. |
tclass |
security_result.detection_fields.value |
ממופה ישירות למקש tclass. |
threat_indicator |
security_result.detection_fields.value |
ממופה ישירות למקש threat_indicator. |
timestamp |
metadata.event_timestamp.seconds |
הערך מנותח כחותמת זמן בפורמט ISO8601, וערך השניות מחולץ. |
user |
principal.user.user_display_name |
ממופים ישירות. |
user_groups |
security_result.detection_fields.value |
ממופה ישירות למקש user_groups. |
| לא רלוונטי | principal.resource.resource_subtype |
הערך הוא Feed אם feed_name לא ריק. |
| לא רלוונטי | metadata.log_type |
הערך שהוגדר הוא BLOXONE. |
| לא רלוונטי | additional.fields.key |
הערך שמוגדר הוא infobloxancount, infobloxarcount, infobloxb1connectiontype, infobloxnscount, intel:destination:ip:ip2asn:finish_ip, intel:destination:ip:ip2asn:start_ip, intel:source:ip:ip2asn:finish_ip או intel:source:ip:ip2asn:start_ip, בהתאם לשדות raw המתאימים. |
| לא רלוונטי | metadata.event_type |
הערך שמוגדר הוא STATUS_UPDATE אם has_principal הוא true, אחרת הערך שמוגדר הוא GENERIC_EVENT. |
| לא רלוונטי | network.dns.questions.type |
הערך מוגדר כ-1 לרשומות A וכ-12 לרשומות PTR, והוא מומר למספר שלם לא מסומן. |
| לא רלוונטי | network.dns.answers.name, network.dns.answers.type, network.dns.answers.class |
המידע חולץ מ-raw.msg על ידי ניתוח מחרוזת התגובה של ה-DNS. |
| לא רלוונטי | intermediary.hostname, intermediary.ip, intermediary.asset.ip |
המידע חולץ מ-raw.msg על ידי ניתוח מחרוזת התגובה של ה-DNS. |
intermediaryhost |
intermediary.hostname |
מופה מיומן השינויים |
app_name |
principal.application |
מופה מיומן השינויים |
endpoint_groups", "user_groups", "dns_view", "dhcp_fingerprint", "policy_name", "tclass", "tproperty", "threat_indicator", "category", and "rcode |
security_result.detection_fields |
מופה מיומן השינויים |
יומן שינויים
צפייה ביומן השינויים של מנתח התוכן הזה
הבעיה עדיין לא נפתרה? קבלת תשובות מחברי הקהילה וממומחי Google SecOps.