איסוף יומנים של Windows Hyper-V
במאמר הזה מוסבר איך להטמיע יומנים של Windows Hyper-V ב-Google Security Operations באמצעות Bindplane.
Windows Hyper-V הוא hypervisor של מיקרוסופט שיוצר יומני אירועים של מחזור חיים, רשת, אחסון ואבטחה של VM. הסוכן של Bindplane אוסף קובצי יומן אירועים של Hyper-V שיוצאו ישירות ממערכת הקבצים המקומית.
לפני שמתחילים
חשוב לוודא שמתקיימות הדרישות המוקדמות הבאות:
- מכונה של Google SecOps
- Windows Server 2016 ומעלה עם תמיכה בשירות
observiq-otel-collector - אם השרת פועל מאחורי שרת proxy, צריך לוודא שהיציאות של חומת האש פתוחות בהתאם לדרישות של סוכן Bindplane.
- גישה מורשית למארח Windows Hyper-V עם הרשאות אדמין
קבלת פרטי כניסה ל-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.
- מזינים את פרטי ההגדרה הבאים:
- Service account name: מזינים שם לחשבון (לדוגמה,
bindplane-ingest). - Service account description: מזינים תיאור (לדוגמה,
Bindplane agent log ingestion).
- Service account name: מזינים שם לחשבון (לדוגמה,
- לוחצים על 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בספריית ה-collector של Bindplane (/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 > סוכני איסוף.
- מורידים את קובץ האימות להטמעת נתונים.
- שומרים את הקובץ בצורה מאובטחת במערכת שבה יותקן סוכן Bindplane.
איך מקבלים את מספר הלקוח ב-Google SecOps
- נכנסים למסוף Google SecOps.
- עוברים אל SIEM Settings > Profile.
מעתיקים את מזהה הלקוח מהקטע פרטי הארגון ושומרים אותו.
התקנת הסוכן של Bindplane
מתקינים את הסוכן של Bindplane במערכת ההפעלה Windows לפי ההוראות הבאות.
התקנה ב-Windows
- פותחים את שורת הפקודה או את PowerShell כאדמין.
מריצים את הפקודה הבאה:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quietמחכים שההתקנה תסתיים.
מאמתים את ההתקנה על ידי הרצת:
sc query observiq-otel-collector
השירות אמור להופיע כ-RUNNING.
מקורות מידע נוספים להתקנה
לאפשרויות התקנה נוספות ולפתרון בעיות, קראו את מדריך ההתקנה של סוכן Bindplane.
הגדרת סוכן Bindplane להטמעה של יומנים ושליחה שלהם אל Google SecOps
מאתרים את קובץ התצורה
Windows:
notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
עריכת קובץ התצורה
מחליפים את כל התוכן של
config.yamlבהגדרות הבאות:receivers: filelog: include: - C:\HyperVLogs\*.evtx start_at: beginning exporters: chronicle/windows_hyperv: 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: 'C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json' customer_id: '<customer_id>' endpoint: chronicle.googleapis.com log_type: WINDOWS_HYPERV raw_log_field: body ingestion_labels: env: production service: pipelines: logs/hyperv_to_chronicle: receivers: - filelog exporters: - chronicle/windows_hyperv
פרמטרים להגדרה
מחליפים את ה-placeholders הבאים:
הגדרת המקלט:
-
filelog: סוג המקלט לאיסוף קובצי יומן מהדיסק -
include: רשימה של נתיבי קבצים למעקב. מגדירים את המיקום שאליו מייצאים את יומני האירועים של Hyper-V (לדוגמה,C:\HyperVLogs\*.evtx) -
start_at: הערךbeginningמאפשר לקרוא יומנים קיימים, והערךendמאפשר לקרוא רק רשומות חדשות
-
הגדרת הייצוא:
-
windows_hyperv: שם תיאורי של המייצא -
creds_file_path: הנתיב המלא לקובץ המפתח של חשבון השירות בפורמט JSON (אפשרות 1):- Windows:
C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json
- Windows:
-
<customer_id>: מספר הלקוח מהשלב הקודם -
location: מחליפים את<LOCATION>באזור של המכונה של Google SecOps (לדוגמה,us,europeאוasia-southeast1). המייצא מוסיף את הערך הזה בתחילתchronicle.googleapis.com. לרשימה המלאה, ראו נקודות קצה אזוריות. -
project: מחליפים את<PROJECT_NUMBER>במספר הפרויקט מתוך IAM & Admin > Settings. -
endpoint: צריך להשאיר את ההגדרהchronicle.googleapis.com. -
WINDOWS_HYPERV: סוג היומן בדיוק כמו שהוא מופיע ב-Chronicle -
ingestion_labels: תוויות אופציונליות בפורמט YAML (לדוגמה,env: production)
-
הגדרת צינור עיבוד נתונים:
-
hyperv_to_chronicle: שם תיאורי לצינור עיבוד הנתונים
-
כלי לייצוא נתונים מ-Legacy ingestion API
אם אתם משתמשים בקובץ האימות להטמעת נתונים מאפשרות 2, החליפו את הבלוק
exportersבקוד הבא. מגדירים אתcreds_file_pathלנתיב של קובץ האימות להטמעת נתונים. אם המכונה נמצאת מחוץ לארה"ב, מחליפים אתmalachiteingestion-pa.googleapis.comבנקודת הקצה האזורית (לדוגמה,europe-malachiteingestion-pa.googleapis.com).exporters: chronicle/windows_hyperv: compression: gzip creds_file_path: 'C:\Program Files\observIQ OpenTelemetry Collector\ingestion-auth.json' customer_id: '<customer_id>' endpoint: malachiteingestion-pa.googleapis.com log_type: WINDOWS_HYPERV raw_log_field: body ingestion_labels: env: production
שמירת קובץ התצורה
- אחרי שמסיימים לערוך, שומרים את הקובץ:
- Windows: לוחצים על קובץ > שמירה
מפעילים מחדש את הסוכן של Bindplane כדי להחיל את השינויים.
כדי להפעיל מחדש את הסוכן של 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"
הגדרת ייצוא של יומני Windows Hyper-V
יומני Windows Hyper-V נשמרים כרשומות ביומן האירועים של Windows. צריך לייצא את היומנים האלה לקבצים בדיסק כדי שסוכן Bindplane יוכל לאסוף אותם.
יוצרים ספרייה לאחסון קובצי היומן שיוצאו:
mkdir C:\HyperVLogsמייצאים את יומני האירועים של Hyper-V באמצעות
wevtutil:wevtutil epl Microsoft-Windows-Hyper-V-VMMS-Admin C:\HyperVLogs\hyperv-vmms-admin.evtx wevtutil epl Microsoft-Windows-Hyper-V-Worker-Admin C:\HyperVLogs\hyperv-worker-admin.evtxאפשר לייצא עוד ערוצי אירועים של Hyper-V לפי הצורך. הערוצים הזמינים כוללים:
-
Microsoft-Windows-Hyper-V-VMMS-Admin(Virtual Machine Management Service) -
Microsoft-Windows-Hyper-V-Worker-Admin(תהליכי VM Worker) -
Microsoft-Windows-Hyper-V-Hypervisor-Admin(Hypervisor events) Microsoft-Windows-Hyper-V-Config-Admin(אירועי הגדרה)
-
(אופציונלי) תזמון ייצוא קבוע באמצעות PowerShell:
$action = New-ScheduledTaskAction -Execute "cmd.exe" -Argument '/c wevtutil epl Microsoft-Windows-Hyper-V-VMMS-Admin C:\HyperVLogs\hyperv-vmms-admin.evtx /ow:true && wevtutil epl Microsoft-Windows-Hyper-V-Worker-Admin C:\HyperVLogs\hyperv-worker-admin.evtx /ow:true' $trigger = New-ScheduledTaskTrigger -RepetitionInterval (New-TimeSpan -Hours 1) -Once -At (Get-Date) Register-ScheduledTask -Action $action -Trigger $trigger -TaskName "ExportHyperVLogs" -Description "Export Hyper-V logs for Bindplane agent"מוודאים שקובצי היומן המיוצאים נוצרים בתיקייה `C:\HyperVLogs`.
מוודאים שהנתיב של סוכן Bindplane
includeב-config.yamlתואם לספריית הייצוא.
טבלת מיפוי UDM
| שדה ביומן | מיפוי UDM | היגיון |
|---|---|---|
| channel, event_data.data, event_id.id, event_id.qualifiers, keywords, task, SeverityValue, OpcodeValue, EventID, ProviderGuid, ActivityId, Version, RecordNumber, ProcessID, ThreadID, Channel, AccountName, UserID, AccountType, Opcode, SourceModuleName, SourceModuleType | additional.fields | מוזגו עם תוויות שנוצרו מהשדות האלה |
| system_time, EventReceivedTime | metadata.collected_timestamp | מנותח מ-system_time עם פורמטים, או מ-EventReceivedTime כ-UNIX או UNIX_MS |
| הודעה | metadata.description | הערך הועתק ישירות |
| EventTime, EventReceivedTime | metadata.event_timestamp | מנותח מ-EventTime כ-UNIX או UNIX_MS, או מ-EventReceivedTime כ-UNIX או UNIX_MS |
| metadata.event_type | ההגדרה היא PROCESS_LAUNCH אם יש has_principal ו-has_target_process, אחרת ההגדרה היא USER_LOGIN אם יש has_principal ו-has_target ואין has_target_process, אחרת ההגדרה היא STATUS_UPDATE אם יש has_principal ואין has_target, אחרת ההגדרה היא USER_RESOURCE_ACCESS אם יש has_target, אחרת ההגדרה היא GENERIC_EVENT | |
| provider.event_source | metadata.product_event_type | הערך הועתק ישירות |
| record_id, RecordNumber | metadata.product_log_id | הערך מומר למחרוזת מ-record_id אם הוא לא ריק, או מ-RecordNumber אם הוא לא ריק |
| provider.name, SourceName | metadata.product_name | הערך מ-provider.name אם הוא לא ריק, אחרת SourceName אם הוא לא ריק, אחרת 'Microsoft-Windows-Hyper-V' |
| גרסה | metadata.product_version | הומר למחרוזת |
| הודעה | network.session_duration.nanos | הערך חולץ מההודעה באמצעות תבנית grok, והומר למספר שלם |
| דומיין | principal.administrative_domain | הערך הועתק ישירות |
| מחשב | principal.asset.hostname | הערך הועתק ישירות |
| מחשב, שם מארח | principal.hostname | הערך מהמחשב אם הוא לא ריק, ואז משם המארח אם הוא לא ריק |
| AccountName | principal.user.role_description | הערך הועתק ישירות |
| AccountType | principal.user.role_name | הערך הועתק ישירות |
| event_data.name | principal.user.user_display_name | הערך הועתק ישירות |
| security.user_id, UserID | principal.user.userid | הערך מ-security.user_id אם הוא לא ריק, ואז מ-UserID אם הוא לא ריק |
| הודעה | security_result.description | חולץ מההודעה באמצעות תבנית grok |
| message, ActivityId | security_result.detection_fields | מוזג עם תווית מ-nt_status שחולצה מההודעה באמצעות grok, ומ-ActivityId |
| level, Severity | security_result.severity | מוגדרת על סמך ערך הרמה (1-3 INFORMATIONAL, 4 ERROR, 5 CRITICAL, אחרת UNKNOWN_SEVERITY), או על סמך חומרת הבעיה (INFO INFORMATIONAL, WARN MEDIUM, ERROR ERROR) |
| EventType | security_result.severity_details | הערך הועתק ישירות |
| execution.process_id, ProcessID | target.process.pid | הומר למחרוזת מ-execution.process_id אם הוא לא ריק, או מ-ProcessID אם הוא לא ריק |
| execution.thread_id, ThreadID | target.process.product_specific_process_id | צריך להגדיר את הערך "ThreadID: |
| provider.guid, ProviderGuid | target.resource.id | הערך מ-provider.guid אחרי הסרת { }, או מ-ProviderGuid אחרי הסרת { } |
| הודעה | target.resource.product_object_id | חולץ מההודעה באמצעות תבנית grok |
| provider.guid | target.resource.type | אם השדה לא ריק, צריך להגדיר אותו כ-"Hyper-V VmSwitch" |
יומן שינויים
צפייה ביומן השינויים של המנתח הזה
הבעיה עדיין לא נפתרה? קבלת תשובות מחברי הקהילה וממומחי Google SecOps.