איסוף יומנים של Microsoft PowerShell
במסמך הזה מוסבר איך להטמיע יומני Microsoft PowerShell ב-Google Security Operations באמצעות סוכן Bindplane.
Microsoft PowerShell היא מסגרת של מיקרוסופט לאוטומציה של משימות ולניהול הגדרות, שמורכבת ממעטפת של שורת פקודה ומשפת סקריפטים. ביומני PowerShell מתועדים הפעלת סקריפטים, פעילות של מודולים והפעלת פקודות. כך אפשר לראות את הפעולות ב-PowerShell לצורך ניטור לצורכי אבטחה וניתוח פורנזי.
לפני שמתחילים
חשוב לוודא שיש לכם את הדברים הבאים:
- מופע של Google SecOps
- Windows Server 2016 ואילך
- קישוריות לרשת בין המארח של Windows לבין Google SecOps
- אם השרת פועל מאחורי שרת proxy, צריך לוודא שהיציאות של חומת האש פתוחות בהתאם לדרישות של סוכן Bindplane.
- גישת אדמין למארח Windows כדי להגדיר רישום ביומן של PowerShell ולהתקין את סוכן Bindplane
הגדרת רישום ביומן של PowerShell
כדי לאסוף יומנים, צריך להפעיל רישום ביומן של PowerShell במארחי Windows. כברירת מחדל, הרישום ביומן של PowerShell הוא מינימלי. כדי לתעד פעילות מפורטת של PowerShell, צריך להפעיל את האפשרות 'רישום ביומן של חסימת סקריפטים'.
הפעלת רישום ביומן של חסימת סקריפטים באמצעות מדיניות קבוצתית
- פותחים את הכלי לעריכה של מרכז המדיניות לקבוצות על ידי הפעלת
gpedit.mscכאדמין. - עוברים אל Computer Configuration > Administrative Templates > Windows Components > Windows PowerShell (הגדרת המחשב > תבניות אדמיניסטרטיביות > רכיבי Windows > Windows PowerShell).
- לוחצים לחיצה כפולה על Turn on PowerShell Script Block Logging (הפעלת רישום ביומן של בלוק סקריפט של PowerShell).
- לוחצים על הפעלה.
- אם רוצים, מסמנים את האפשרות תיעוד אירועי התחלה / עצירה של הפעלת בלוק סקריפט כדי לתעד אירועי התחלה ועצירה של כל בלוק סקריפט. הערה: האפשרות הזו יוצרת נפח גדול של יומנים.
- לוחצים על OK.
- פותחים את שורת הפקודה כאדמין ומריצים את הפקודה
gpupdate /forceכדי להחיל את המדיניות באופן מיידי.
הפעלת רישום ביומן של חסימת סקריפטים באמצעות הרישום
אפשרות אחרת היא להפעיל את רישום החסימה של סקריפטים על ידי הגדרת ערך הרישום הבא:
- פותחים את עורך הרישום על ידי הפעלת
regeditכאדמין. - נווט אל
HKLM\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging. - אם המפתח לא קיים, יוצרים אותו.
- יוצרים ערך DWORD (32-bit) חדש בשם
EnableScriptBlockLoggingומגדירים את הערך שלו כ-1. - מפעילים מחדש את הסשנים של PowerShell כדי שהשינוי ייכנס לתוקף.
התכונה PowerShell Script Block Logging כותבת אירועים בערוץ יומן האירועים Microsoft-Windows-PowerShell/Operational עם מזהה האירוע 4104.
אופציונלי: הפעלת רישום ביומן של מודולים
ב-Module Logging מתועדים פרטי ההרצה של צינור עיבוד הנתונים במודולים שצוינו. כדי להפעיל את Module Logging (רישום ביומן של מודולים) לכל המודולים:
- ב-Local Group Policy Editor, עוברים אל Computer Configuration > Administrative Templates > Windows Components > Windows PowerShell.
- לוחצים לחיצה כפולה על Turn on Module Logging (הפעלת רישום ביומן של מודולים).
- לוחצים על הפעלה.
- לוחצים על הצגה לצד שמות המודולים.
- מזינים
*כדי לתעד את כל המודולים. - לוחצים על אישור בחלון שמות המודולים.
- לוחצים על אישור בחלון רישום ביומן של המודול.
- מריצים את
gpupdate /forceכדי להחיל את המדיניות.
אירועי Module Logging נכתבים ביומן האירועים של Windows PowerShell עם מזהה האירוע 4103.
אופציונלי: הפעלת התמלול
התמלול יוצר תיעוד מבוסס-טקסט של כל הקלט והפלט של סשן PowerShell. כדי להפעיל את התמלול:
- בעורך מדיניות הקבוצה המקומית, עוברים אל הגדרת המחשב > תבניות ניהול > רכיבי Windows > Windows PowerShell.
- לוחצים לחיצה כפולה על Turn on PowerShell Transcription.
- לוחצים על הפעלה.
- אפשר לציין ספריית פלט לתמליל. אם משאירים את השדה ריק, התמלילים נשמרים בתיקיית המסמכים של כל משתמש.
- מסמנים את האפשרות הכללת כותרות של הפעלות כדי לכלול חותמות זמן ומטא-נתונים.
- לוחצים על OK.
- מריצים את הפקודה
gpupdate /forceכדי להחיל את המדיניות.
תמלילים נכתבים לקובצי טקסט שהשמות שלהם מתחילים ב-PowerShell_transcript.
קבלת פרטי כניסה ל-Google SecOps בשביל סוכן Bindplane
כדי לאמת את סוכן Bindplane ב-Google SecOps, בוחרים אחת מהשיטות הבאות:
- פריסות חדשות: משתמשים ב-Chronicle API (אפשרות 1).
- פריסות מדור קודם: אפשר להמשיך להשתמש בקובץ האימות של ה-API להעברת נתונים (אפשרות 2) עד שה-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 ומעתיקים את הערך של Project number. תצטרכו אותו כדי להגדיר את הייצוא.
אפשרות 2: הורדה של קובץ האימות להטמעת נתונים (מדור קודם)
- נכנסים למסוף Google SecOps.
- עוברים אל SIEM Settings > Collection Agents (הגדרות 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 לאיסוף יומני PowerShell
איתור קובץ התצורה של Windows
מאתרים את קובץ התצורה של Windows באופן הבא:
notepad "C:\Program Files\observIQ OpenTelemetry Collector\config.yaml"
עריכת קובץ התצורה
מחליפים את כל התוכן של
config.yamlבהגדרה הבאה:receivers: windowseventlog/powershell: channel: Microsoft-Windows-PowerShell/Operational max_reads: 100 poll_interval: 5s raw: true start_at: end processors: batch: exporters: chronicle/powershell: 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: 'POWERSHELL' raw_log_field: body override_log_type: false service: pipelines: logs/powershell: receivers: - windowseventlog/powershell processors: - batch exporters: - chronicle/powershell
פרמטרים להגדרה
מחליפים את ה-placeholders הבאים:
הגדרת מקלט:
-
channel: הערוץ ביומן האירועים של Windows שממנו נאספים הנתונים. ל-PowerShell Script Block Logging, משתמשים ב-Microsoft-Windows-PowerShell/Operational. לרישום ביומן של מודולים, משתמשים ב-Windows PowerShell. -
raw: מגדירים את הערךtrueכדי לשלוח קובץ XML גולמי של יומן האירועים של Windows אל Google SecOps. -
start_at: מגדירים את הערךendכדי לאסוף רק אירועים חדשים אחרי שהסוכן מתחיל. מגדירים את הערךbeginningכדי לאסוף את כל האירועים הקיימים.
-
הגדרת הייצוא:
-
<CUSTOMER_ID>: מחליפים במזהה הלקוח מהשלב הקודם. -
creds_file_path: הנתיב המלא לקובץ המפתח בפורמט JSON של חשבון השירות (אפשרות 1). מעתיקים את הקובץ של פרטי הכניסה למיקום הזה. -
location: מחליפים את<LOCATION>באזור של מופע Google SecOps (לדוגמה,us,europeאוasia-southeast1). ערך זה מתווסף לתחיליתchronicle.googleapis.comשל הכלי לייצוא. רשימה מלאה של נקודות הקצה האזוריות מופיעה במאמר Regional Endpoints. -
project: מחליפים את<PROJECT_NUMBER>במספר הפרויקט שמופיע בקטע IAM & Admin > Settings.
endpoint: משאירים את הערךchronicle.googleapis.com.
log_type: צריך להגדיר את הערךPOWERSHELLכדי להשתמש בכלי לניתוח PowerShell.
-
מייצא API להטמעה מדור קודם
אם משתמשים בקובץ האימות של ההעלאה מאפשרות 2, מחליפים את הבלוק
exportersבבלוק הבא. מגדירים אתcreds_file_pathלנתיב לקובץ האימות של ההעברה, ואם המופע שלכם נמצא מחוץ לארה"ב, מחליפים אתmalachiteingestion-pa.googleapis.comבנקודת הקצה האזורית (לדוגמה,europe-malachiteingestion-pa.googleapis.com).exporters: chronicle/powershell: 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: 'POWERSHELL' raw_log_field: body override_log_type: false
שמירת קובץ התצורה
אחרי העריכה, שומרים את הקובץ בלחיצה על קובץ > שמירה.
מפעילים מחדש את הסוכן של 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"
- לוחצים על
אימות הטמעת היומנים
אחרי שמגדירים את סוכן Bindplane ומפעילים מחדש את השירות, היומנים של PowerShell אמורים להתחיל לזרום אל Google SecOps.
- נכנסים למסוף Google SecOps.
- עוברים אל חקירה > חיפוש.
מריצים את החיפוש הבא כדי לוודא שיומני PowerShell נקלטים:
metadata.log_type = "POWERSHELL"מוודאים שהאירועים מופיעים עם חותמות זמן עדכניות.
אירועים של רישום ביומן של בלוקים של סקריפטים ב-PowerShell (מזהה אירוע 4104) יופיעו עם פרטים של בלוקים של סקריפטים שהופעלו, כולל תוכן הסקריפט, מזהה הבלוק של הסקריפט והקשר ההפעלה.
טבלת מיפוי UDM
| שדה ביומן | מיפוי UDM | היגיון |
|---|---|---|
| HostId | principal.resource.product_object_id | המזהה הייחודי של אובייקט המוצר שמשויך למשאב העיקרי |
| System.Version | metadata.product_version | גרסת המוצר שיצרה את האירוע |
| System.EventId, EventID, winlog.event_id | metadata.product_event_type | סוג האירוע כפי שהוגדר על ידי המוצר |
| Computer, System.Computer, computer, winlog.computer_name | principal.hostname | שם המארח של הישות הראשית |
| מחשב, System.Computer, מחשב, winlog.computer_name | principal.asset.hostname | שם המארח של הנכס שמשויך לחשבון המשתמש |
| System.EventRecordID, RecordNumber, winlog.record_id | metadata.product_log_id | מזהה ייחודי של רשומת היומן במערכת הרישום של המוצר |
| System.Opcode, opcode, winlog.opcode | metadata.description | תיאור האירוע או הקשר נוסף |
| ProviderGuid, winlog.provider_guid | metadata.product_deployment_id | המזהה הייחודי של פריסת המוצר |
| System.ProcessID, ProcessID, ExecutionProcessID, execution.process_id, winlog.process.pid | principal.process.pid | מזהה התהליך של התהליך הראשי |
| SourceModuleName | principal.resource.name | שם המשאב שמשויך לחשבון המשתמש |
| SourceModuleType | principal.resource.resource_subtype | סוג המשנה של המשאב שמשויך לחשבון המשתמש |
| security.user_id, UserID, winlog.user.identifier | principal.user.windows_sid | מזהה האבטחה (SID) של Windows עבור המשתמש הראשי |
| metadata.event_type | סוג האירוע (למשל, USER_LOGIN, NETWORK_CONNECTION) | |
| SourceName, winlog.provider_name | metadata.product_name | שם המוצר שיצר את האירוע |
| AccountName, Username, UserName, winlog.user.name | principal.user.userid | מזהה המשתמש של המשתמש הראשי |
| דומיין, winlog.user.domain | principal.administrative_domain | הדומיין הניהולי של החשבון הראשי |
| Path, target_file, ScriptName, script_name, ContextInfo_Script Name, file_path | target.process.file.full_path | הנתיב המלא לקובץ שמשויך לתהליך היעד |
| HostName, powershell.Host Name, ContextInfo_Host Name | target.hostname | שם המארח של ישות היעד |
| HostName, powershell.Host Name, ContextInfo_Host Name | target.asset.hostname | שם המארח של הנכס שמשויך ליעד |
| מזהה מארח, HostID, ContextInfo_Host ID | target.asset.asset_id | מזהה ייחודי של נכס היעד |
| Nombre_de_comando, ContextInfo_Command Name, CommandName | target.application | שם האפליקציה שמשויכת ליעד |
| HostApplication, ContextInfo_Host Application | target.process.command_line | שורת הפקודה ששימשה להפעלת תהליך היעד |
| ScriptBlockText | target.process.command_line | שורת הפקודה ששימשה להפעלת תהליך היעד |
| MessageSourceAddress | principal.ip | כתובת ה-IP של הגורם המרכזי |
| MessageSourceAddress | principal.asset.ip | כתובת ה-IP של הנכס שמשויך לחשבון המשתמש |
| Nombre_de_host | principal.application | שם האפליקציה שמשויכת לחשבון המשתמש |
| Version_de_host | principal.platform_version | הגרסה של הפלטפורמה שמשויכת לישות הראשית |
| Id_de_host | principal.resource.id | המזהה הייחודי של המשאב הראשי |
| Application_host | principal.process.file.full_path | הנתיב המלא לקובץ שמשויך לתהליך העיקרי |
| HostApplication | principal.process.command_line | שורת הפקודה ששימשה להפעלת התהליך העיקרי |
| Usuario, admin_domain | principal.user.userid | מזהה המשתמש של המשתמש הראשי |
| Usuario, admin_domain | principal.administrative_domain | הדומיין האדמיניסטרטיבי של הגורם |
| CommandLine | principal.process.command_line | שורת הפקודה ששימשה להפעלת התהליך הראשי |
| מכונה, machine_id | principal.asset.asset_id | המזהה הייחודי של הנכס הראשי |
| מכונה, platform_software | principal.asset.platform_software.platform | סוג הפלטפורמה של הנכס (למשל, WINDOWS, LINUX) |
| מכונה, platform_software | principal.asset.platform_software.platform_version | גרסת התוכנה של הפלטפורמה בנכס |
| MessageSourceAddress | intermediary.ip | כתובת ה-IP של הגורם המתווך |
| MessageSourceAddress, Hostname | intermediary.hostname | שם המארח של הישות המתווכת |
| MessageSourceAddress, Hostname | intermediary.asset.hostname | שם המארח של הנכס שמשויך לגורם המתווך |
| MessageSourceAddress | intermediary.port | מספר היציאה שמשמש את הגורם המתווך |
| HostApplication | target.process.command_line | שורת הפקודה ששימשה להפעלת תהליך היעד |
| HostId | target.asset.asset_id | המזהה הייחודי של נכס היעד |
| מספר סידורי, מספר סידורי של פרטי ההקשר, מספר סידורי | security_result.detection_fields | צמדי מפתח/ערך של מידע נוסף על הזיהוי |
| ProviderName | principal.resource.attribute.labels | תוויות או מאפיינים שמשויכים למשאב הראשי |
| NewEngineState | additional.fields | שדות נוספים בהתאמה אישית שלא נכללים בסכימת UDM רגילה |
| PreviousEngineState | additional.fields | שדות נוספים בהתאמה אישית שלא נכללים בסכימת UDM רגילה |
| ScriptName | additional.fields | שדות נוספים בהתאמה אישית שלא נכללים בסכימת UDM רגילה |
| ManagementGroupName | additional.fields | שדות נוספים בהתאמה אישית שלא נכללים בסכימת UDM רגילה |
| מקור | additional.fields | שדות נוספים בהתאמה אישית שלא נכללים בסכימת UDM רגילה |
| RenderedDescription | security_result.description | תיאור של תוצאת האבטחה או הפעולה שבוצעה |
| TenantId | additional.fields | שדות נוספים בהתאמה אישית שלא נכללים בסכימת UDM רגילה |
| שם משתמש | principal.user.userid | מזהה המשתמש של המשתמש הראשי |
| ActivityID | security_result.detection_fields | צמדי מפתח/ערך של מידע נוסף על הזיהוי |
| ExecutionThreadID, execution.thread_id, winlog.process.thread.id | security_result.detection_fields | צמדי מפתח/ערך של מידע נוסף על הזיהוי |
| תשובה | security_result.detection_fields | צמדים של מפתח/ערך של מידע נוסף על זיהוי |
| נתונים | security_result.detection_fields | צמדים של מפתח/ערך של מידע נוסף על זיהוי |
| Data_1 | additional.fields | שדות נוספים בהתאמה אישית שלא נכללים בסכימת UDM רגילה |
| data_1 | security_result.detection_fields | צמדים של מפתח/ערך של מידע נוסף על זיהוי |
| Data_2 | security_result.detection_fields | צמדי מפתח/ערך של מידע נוסף על הזיהוי |
| winlog.activity_id | security_result.detection_fields | צמדי מפתח/ערך של מידע נוסף על הזיהוי |
| winlog.api | additional.fields | שדות נוספים בהתאמה אישית שלא נכללים בסכימת UDM רגילה |
| winlog.channel | principal.resource.attribute.labels | תוויות או מאפיינים שמשויכים למשאב הראשי |
| טווח זמן | additional.fields | שדות נוספים בהתאמה אישית שלא נכללים בסכימת UDM רגילה |
| SeverityValue | security_result.detection_fields | צמדי מפתח/ערך של מידע נוסף על הזיהוי |
| מתווך | מתווך | פרטים על ישויות ביניים שמעורבות באירוע |
| security_result | security_result | תוצאת האבטחה הכוללת, כולל פעולות, רמות חומרה וזיהויים |
| metadata.vendor_name | שם הספק שיצר את האירוע | |
| SourceName | metadata.product_name | שם המוצר שיצר את האירוע |
syslog_host |
event.idm.read_only_udm.intermediary.hostname |
מופה מיומן השינויים |
Computer |
event.idm.read_only_udm.intermediary.hostname |
מופה מיומן השינויים |
Version |
event.idm.read_only_udm.metadata.product_version |
מופה מיומן השינויים |
Task |
event.idm.read_only_udm.security_result.detection_fields |
מופה מיומן השינויים |
OpcodeValue |
event.idm.read_only_udm.security_result.detection_fields |
מופה מיומן השינויים |
ThreadID |
event.idm.read_only_udm.security_result.detection_fields |
מופה מיומן השינויים |
AccountType |
event.idm.read_only_udm.security_result.detection_fields |
מופה מיומן השינויים |
Offset |
event1.idm.read_only_udm.additional.fields |
מופה מיומן השינויים |
SeverityValue |
event1.idm.read_only_udm.additional.fields |
מופה מיומן השינויים |
NewEngineState", "PreviousEngineState", "HostVersion", "RunspaceId", "SequenceNumber", "EngineVersion" and "PipelineId |
additional.fields |
מופה מיומן השינויים |
Payload |
security_result.detection_fields |
מופה מיומן השינויים |
Script Name |
target.file.full_path |
מופה מיומן השינויים |
SystemTime |
metadata.event_timestamp |
מופה מיומן השינויים |
channel", "keywords", "MessageNumber", "MessageTotal", and "ScriptBlockId |
security_result.detection_fields |
מופה מיומן השינויים |
System.ProviderName |
principal.resource.attribute.labels |
מופה מיומן השינויים |
HostVersion", "RunspaceId", "PipelineId", "EngineVersion", "DetailSequence", "DetailTotal", "SequenceNumber", and "ScriptName |
additional.fields |
מופה מיומן השינויים |
System.EventRecordID", "System.Task", "System.Keywords", "System.Opcode", and "System.ThreadID |
security.detection_fields |
מופה מיומן השינויים |
EventLevelName |
security_result.severity |
מופה מיומן השינויים |
ManagementGroupName", "Source", "TenantId |
additional_fields |
מופה מיומן השינויים |
יומן שינויים
צפייה ביומן השינויים של המנתח הזה
הבעיה עדיין לא נפתרה? קבלת תשובות מחברי הקהילה וממומחי Google SecOps.