איסוף יומנים של LogonBox
במאמר הזה מוסבר איך להטמיע יומנים של LogonBox ב-Google Security Operations באמצעות Bindplane.
LogonBox היא פלטפורמה לניהול סיסמאות ולאימות זהות בשירות עצמי. הוא יוצר יומני ביקורת לאיפוס סיסמאות, לאירועים של אימות זהות ולפעולות של אדמינים. המנתח ממפה את נתוני הביקורת של LogonBox למודל הנתונים המאוחד (UDM), ומתעד את זהות המשתמש, אירועי אימות, שינויים במשאבים ופעולות ניהול קבוצות.
לפני שמתחילים
חשוב לוודא שיש לכם את הדברים הבאים:
- מופע של Google SecOps
- Windows Server 2016 ואילך, או מארח Linux עם
systemd - קישוריות רשת בין סוכן Bindplane לבין שרת LogonBox
- אם מריצים את הסוכן מאחורי שרת proxy, מוודאים שיציאות חומת האש פתוחות בהתאם לדרישות של סוכן Bindplane
- גישת אדמין למסוף הניהול של LogonBox
קבלת פרטי כניסה ל-Google SecOps בשביל סוכן Bindplane
כדי לאמת את סוכן Bindplane ב-Google SecOps, בוחרים אחת מהשיטות הבאות:
- פריסות חדשות: משתמשים ב-Chronicle API (אפשרות 1).
- פריסות קודמות: ממשיכים להשתמש בקובץ האימות להטמעת נתונים (אפשרות 2) עד שה-Ingestion API יופסק ב-20 ביולי 2027.
אפשרות 1: יצירת חשבון שירות ל-Chronicle API (מומלץ)
- נכנסים אל Google Cloud המסוף ובוחרים את Google Cloud הפרויקט שמקושר למופע של Google SecOps.
- נכנסים לדף IAM & Admin > Service Accounts.
- לוחצים על Create service account.
- מזינים את פרטי ההגדרה הבאים:
- שם חשבון השירות: מזינים שם לחשבון (לדוגמה,
bindplane-ingest). - תיאור חשבון השירות: מזינים תיאור (לדוגמה,
Bindplane agent log ingestion).
- שם חשבון השירות: מזינים שם לחשבון (לדוגמה,
- לוחצים על Create and continue.
- בקטע Grant this service account access to project לוחצים על Select a role ובוחרים באפשרות Chronicle Editor.
- לוחצים על המשך ואז על סיום.
- לוחצים על חשבון השירות שיצרתם ואז עוברים לכרטיסייה Keys.
- לוחצים על Add key > Create new key.
- בוחרים באפשרות JSON ולוחצים על Create. קובץ המפתח יורד למחשב.
- שומרים את קובץ המפתח בשם
ingestion-auth.jsonבספריית Bindplane Collector (/opt/observiq-otel-collector/ingestion-auth.jsonב-Linux אוC:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.jsonב-Windows), או מעדכנים אתcreds_file_pathב-config.yamlכך שיתאים לנתיב שבו שומרים את הקובץ. - עוברים אל IAM & Admin > Settings (ניהול הרשאות גישה ואדמין > הגדרות) ומעתיקים את מספר הפרויקט. תצטרכו אותו כדי להגדיר את הייצוא.
אפשרות 2: הורדת קובץ אימות להטמעת נתונים (גרסה מדור קודם)
- נכנסים למסוף Google SecOps.
- עוברים אל SIEM Settings > Collection Agents (הגדרות SIEM > סוכני איסוף).
- מורידים את קובץ האימות להטמעת נתונים.
- שומרים את הקובץ בצורה מאובטחת במערכת שבה יותקן הסוכן של Bindplane.
איך מקבלים את מספר הלקוח ב-Google SecOps
- נכנסים למסוף Google SecOps.
- עוברים אל SIEM Settings > Profile.
מעתיקים את מזהה הלקוח מהקטע פרטי הארגון ושומרים אותו.
התקנת הסוכן של 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: udplog: listen_address: "0.0.0.0:514" exporters: chronicle/logonbox: 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: LOGONBOX raw_log_field: body service: pipelines: logs/logonbox: receivers: - udplog exporters: - chronicle/logonbox
פרמטרים להגדרה
מחליפים את ה-placeholders הבאים:
הגדרת מקלט:
-
udplog: סוג המקלט לפי הפרוטוקול:-
udplogל-UDP syslog -
tcplogfor TCP syslog -
syslogעבור syslog RFC 3164/5424
-
-
0.0.0.0: כתובת ה-IP להאזנה:0.0.0.0כדי להאזין בכל הממשקים (מומלץ)- כתובת IP ספציפית להאזנה בממשק אחד
-
514: מספר היציאה להאזנה (לדוגמה,514, 1514, 6514)
-
הגדרת הייצוא:
-
<customer_id>: מספר הלקוח מהשלב הקודם -
location: מחליפים את<LOCATION>באזור של מופע Google SecOps (לדוגמה,us,europeאוasia-southeast1). ערך זה מתווסף לתחיליתchronicle.googleapis.comשל הכלי לייצוא. רשימה מלאה של נקודות הקצה האזוריות מופיעה במאמר Regional Endpoints. -
project: מחליפים את<PROJECT_NUMBER>במספר הפרויקט שמופיע בקטע IAM & Admin > Settings. -
endpoint: צריך להשאיר את ההגדרהchronicle.googleapis.com. - משנים את
creds_file_pathלנתיב של קובץ המפתח בפורמט JSON של חשבון השירות (אפשרות 1), בהתאם לפלטפורמה:- Linux:
/opt/observiq-otel-collector/ingestion-auth.json - Windows:
C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json
- Linux:
-
מייצא API להטמעה מדור קודם
אם משתמשים בקובץ האימות של ההעלאה מאפשרות 2, מחליפים את הבלוק
exportersבבלוק הבא. מגדירים אתcreds_file_pathלנתיב של קובץ האימות להטמעת נתונים. אם המכונה נמצאת מחוץ לארה"ב, מחליפים אתmalachiteingestion-pa.googleapis.comבנקודת הקצה האזורית (לדוגמה,europe-malachiteingestion-pa.googleapis.com).exporters: chronicle/logonbox: compression: gzip creds_file_path: '/opt/observiq-otel-collector/ingestion-auth.json' customer_id: '<customer_id>' endpoint: malachiteingestion-pa.googleapis.com log_type: LOGONBOX raw_log_field: body
שמירת קובץ התצורה
- אחרי שמסיימים לערוך, שומרים את הקובץ:
- 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 ב-LogonBox
- נכנסים למסוף הניהול של LogonBox כאדמינים.
- עוברים אל דוחות > יומן ביקורת.
- קובעים את הגדרות הייצוא של syslog:
- שרת Syslog: מזינים את כתובת ה-IP של המארח של סוכן Bindplane (לדוגמה,
192.168.1.100). - יציאה: מזינים
514(חייבת להתאים ליציאת המקלט של Bindplane). - Protocol: בוחרים באפשרות UDP (צריך להתאים לסוג המקלט של Bindplane).
- שרת Syslog: מזינים את כתובת ה-IP של המארח של סוכן Bindplane (לדוגמה,
- בוחרים את קטגוריות האירועים להעברה (לדוגמה, איפוס סיסמאות, אימות זהות, ניהול משתמשים וקבוצות).
- לוחצים על Save.
טבלת מיפוי UDM
| שדה ביומן | מיפוי UDM | היגיון |
|---|---|---|
| additional.fields | מוזג מ-attr_associatedPrincipals_label, sAMAccountName_label, attr_local_label, msDS-PrincipalName_label, attr_realmType_label, attr_selfCreated_label, attr_administrative_label על סמך תנאים | |
| attr_principalDesc, desc | metadata.description | הערך מ-attr_principalDesc אם product_event_type תואם ל-changePassword|SessionService, אחרת מ-attr_principalDesc אם הוא לא ריק, אחרת מ-desc |
| event_type | metadata.event_type | הערך מועתק ישירות מ-event_type אחרי שלוגיקה מותנית מגדירה אותו על סמך product_event_type ודגלי נוכחות |
| product_event_type | metadata.product_event_type | הערך הועתק ישירות |
| metadata.product_name | ההגדרה היא LogonBox | |
| metadata.vendor_name | צריך להגדיר את הערך "LOGONBOX" | |
| network.application_protocol | הגדרה ל-"DNS" אם product_event_type תואם ל-AnswerService והתנאים מתקיימים | |
| dns_answer | network.dns.answers | מוזג מ-dns_answer |
| dns_question | network.dns.questions | Merged from dns_question |
| attr_userAgent, attr_userAgentVersion | network.http.parsed_user_agent | הערך משורשר מ-attr_userAgent ומ-attr_userAgentVersion אם שניהם קיימים, אחרת מ-attr_userAgent, ואז מומר ל-parseduseragent ומשנה את השם |
| attr_userAgent, attr_userAgentVersion | network.http.user_agent | משורשר מ-attr_userAgent ומ-attr_userAgentVersion אם שניהם קיימים, אחרת מ-attr_userAgent |
| שם המארח | principal.asset.hostname | הערך הועתק ישירות |
| attr_ipAddress | principal.asset.ip | הערך הועתק ישירות |
| שם המארח | principal.hostname | הערך הועתק ישירות |
| attr_ipAddress | principal.ip | הערך הועתק ישירות |
| attr_os | principal.platform | מוגדר באותיות רישיות אם יש התאמה ל-(?i)LINUX|MAC|WINDOWS |
| attr_osVersion | principal.platform_version | הערך מועתק ישירות אם הוא לא תואם ל-unknown (?i) |
| attr_principalRealm_label, attr_unassignedRoles_label, attr_assignedRoles_label, attr_oldResourceName_label, attr_roles_label, attr_resumedPrincipalName_label, attr_resumedPrincipalRealm_label, attr_resumedPrincipal_label, attr_module_label, reconcile_map_label, users_map_label, groups_map_label, createUser_map_label, user_map_label, mobile_map_label | principal.resource.attribute.labels | מוזגו מתוויות שונות שנוצרו מ-attr_principalRealm, attr_unassignedRoles, attr_assignedRoles, attr_oldResourceName, attr_roles, attr_resumedPrincipalName, attr_resumedPrincipalRealm, attr_resumedPrincipal, attr_module וממיפויים מ-reconcile, users, groups, createUser, user, mobile על סמך תנאים |
| attr_resourceName | principal.resource.name | הערך הועתק ישירות |
| attr_resourceId | principal.resource.product_object_id | הערך הועתק ישירות |
| כתובת אימייל | principal.user.email_addresses | מיזוג אם כתובת האימייל תקינה |
| ImmutableID, attr_uuid | principal.user.product_object_id | ערך מ-ImmutableID אם product_event_type תואם ל-changePassword|userUpdated|userCreated|setPassword|answer|accountUnlockNoSuspension, אחרת מ-attr_uuid |
| attr_scheme | principal.user.role_name | הערך הועתק ישירות |
| attr_principalDesc | principal.user.user_display_name | הערך מועתק ישירות אם product_event_type תואם ל-changePassword|SessionService |
| attr_principalName | principal.user.userid | הערך הועתק ישירות |
| authy_code_length_label, authy_window_length_label, authy_step_size_label, msauthenticator_code_length_label, msauthenticator_window_length_label, msauthenticator_step_size_label, googleUser_code_length_label, googleUser_window_length_label, googleUser_step_size_label | security_result.detection_fields | מוזג מתוויות שנוצרו מ-authy.code.length, authy.window.length, authy.step.size, msauthenticator.code.length, msauthenticator.window.length, msauthenticator.step.size, googleUser.code.length, googleUser.window.length, googleUser.step.size, אם קיימות |
| cn | target.resource.attribute.labels | מוזג מ-full_name_label שנוצר מ-cn, ומ-attr_disabledRealm_label מ-attr_disabledRealm |
| attr_lastModified | target.resource.attribute.last_update_time | תאריך שנותח מ-attr_lastModified באמצעות ISO8601 או d MMM yyyy HH:mm:ss |
| attr_created | target.resource.attribute.creation_time | תאריך שנותח מ-attr_created באמצעות ISO8601 או d MMM yyyy HH:mm:ss |
| givenName | target.user.first_name | הערך הועתק ישירות |
| ou | target.user.group_identifiers | מוזג מ-ou אם product_event_type תואם ל-userUpdated|userCreated|changePassword|setPassword|answer|accountUnlockNoSuspension |
| sn | target.user.last_name | הערך הועתק ישירות |
| attr_uuid, attr_disabledPrincipal | target.user.product_object_id | ערך מ-attr_uuid אם product_event_type תואם ל-userUpdated|userCreated|changePassword|setPassword|answer|accountUnlockNoSuspension או ל-groupCreated|groupUpdated או ל-attr_group או ל-group, אחרת מ-attr_disabledPrincipal אם accountDisabled |
| displayName, description | target.user.user_display_name | הערך מ-displayName אם הוא לא ריק, אחרת מ-description אם product_event_type תואם ל-userUpdated|userCreated|changePassword|setPassword|answer|accountUnlockNoSuspension |
| userPrincipalName, attr_user, attr_associatedPrincipals, attr_disabledPrincipalName | target.user.userid | הערך מ-userPrincipalName אם product_event_type תואם ל-userUpdated|userCreated|changePassword|setPassword|answer|accountUnlockNoSuspension, אחרת attr_user אם לא הוגדר, אחרת attr_associatedPrincipals אם groupCreated|groupUpdated או attr_group, אחרת attr_user אם group, אחרת attr_disabledPrincipalName אם accountDisabled |
| attr_group | target.group.group_display_name | הערך מועתק ישירות אם product_event_type תואם ל-groupCreated|groupUpdated או אם attr_group קיים |
| attr_uuid | target.group.product_object_id | הערך מועתק ישירות אם הערך של product_event_type תואם ל-groupCreated|groupUpdated או אם קיים attr_group |
יומן שינויים
צפייה ביומן השינויים של המנתח הזה
הבעיה עדיין לא נפתרה? קבלת תשובות מחברי הקהילה וממומחי Google SecOps.