איסוף יומנים של 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, מפעילים את Script Block Logging.
הפעלת רישום ביומן של חסימת סקריפטים באמצעות מדיניות קבוצתית
- פותחים את Local Group Policy Editor (הכלי לעריכת מדיניות קבוצתית מקומית) על ידי הפעלת
gpedit.mscכאדמין. - עוברים אל Computer Configuration > Administrative Templates > Windows Components > Windows PowerShell (הגדרת המחשב > תבניות אדמיניסטרטיביות > רכיבי Windows > Windows PowerShell).
- לוחצים לחיצה כפולה על הפעלה של רישום ביומן של בלוק סקריפט PowerShell.
- בוחרים באפשרות מופעל.
- אופציונלי: מסמנים את התיבה רישום ביומן של אירועי התחלה / הפסקה של הפעלת בלוק סקריפט כדי לתעד אירועי התחלה ואירועי הפסקה של כל בלוק סקריפט. הערה: האפשרות הזו יוצרת נפח גדול של יומנים.
- לוחצים על OK.
- פותחים את שורת הפקודה כאדמין ומריצים את הפקודה
gpupdate /forceכדי להחיל את המדיניות באופן מיידי.
הפעלת רישום ביומן של חסימת סקריפטים באמצעות הרישום
אפשרות אחרת היא להפעיל את רישום החסימה של סקריפטים על ידי הגדרת ערך הרישום הבא:
- פותחים את עורך הרישום על ידי הפעלת
regeditכאדמין. - נווט אל
HKLM\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging. - אם המפתח לא קיים, יוצרים אותו.
- יוצרים ערך DWORD (32-bit) חדש בשם
EnableScriptBlockLoggingומגדירים את הערך שלו ל-1. - כדי שהשינוי ייכנס לתוקף, צריך להפעיל מחדש את סשני PowerShell.
רישום ביומן של בלוק סקריפט ב-PowerShell כותב אירועים לערוץ יומן האירועים Microsoft-Windows-PowerShell/Operational עם מזהה האירוע 4104.
אופציונלי: הפעלת רישום ביומן של מודולים
במודול Logging מתועדים פרטי ההרצה של צינורות עיבוד נתונים עבור מודולים ספציפיים. כדי להפעיל את Module Logging (רישום ביומן של מודולים) לכל המודולים:
- בעורך מדיניות הקבוצה המקומית, עוברים אל הגדרת המחשב > תבניות ניהול > רכיבי Windows > Windows PowerShell.
- לוחצים לחיצה כפולה על הפעלת רישום ביומן של מודול.
- בוחרים באפשרות מופעל.
- לוחצים על הצגה לצד שמות המודולים.
- מזינים
*כדי לרשום את כל המודולים. - לוחצים על אישור בחלון שמות המודולים.
- לוחצים על אישור בחלון Module Logging (רישום ביומן של מודולים).
- מריצים את הפקודה
gpupdate /forceכדי להחיל את המדיניות.
אירועים של רישום ביומן של מודולים נכתבים ביומן האירועים של Windows PowerShell עם מזהה האירוע 4103.
אופציונלי: הפעלת תמלול
התמלול יוצר תיעוד מבוסס-טקסט של כל הקלט והפלט של סשן PowerShell. כדי להפעיל את התמלול:
- בעורך מדיניות הקבוצה המקומית, עוברים אל הגדרת המחשב > תבניות ניהול > רכיבי Windows > Windows PowerShell.
- לוחצים לחיצה כפולה על Turn on PowerShell Transcription (הפעלה של תמלול ב-PowerShell).
- בוחרים באפשרות מופעל.
- אפשר גם לציין ספריית פלט של תמליל. אם לא מציינים תיקייה, התמלילים נשמרים בתיקיית המסמכים של כל משתמש.
- מסמנים את התיבה Include invocation headers (הכללת כותרות של הפעלות) כדי לכלול חותמות זמן ומטא-נתונים.
- לוחצים על OK.
- מריצים את הפקודה
gpupdate /forceכדי להחיל את המדיניות.
תמלילים נכתבים בקובצי טקסט שהשמות שלהם מתחילים ב-PowerShell_transcript.
קבלת קובץ אימות להטמעת נתונים ב-Google SecOps
- נכנסים למסוף Google SecOps.
- עוברים אל SIEM Settings > Collection Agent (הגדרות SIEM > סוכן איסוף).
- לוחצים על הורדה כדי להוריד את קובץ אימות ההעלאה.
שומרים את הקובץ בצורה מאובטחת במארח Windows שבו יותקן סוכן Bindplane.
איך מקבלים את מספר הלקוח ב-Google SecOps
- נכנסים למסוף Google SecOps.
- עוברים אל SIEM Settings > Profile (הגדרות SIEM > פרופיל).
מעתיקים את מזהה הלקוח מהקטע פרטי הארגון ושומרים אותו.
התקנת סוכן 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: 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 service: pipelines: logs/powershell: receivers: - windowseventlog/powershell processors: - batch exporters: - chronicle/powershell
פרמטרים להגדרה
מחליפים את ה-placeholders הבאים:
הגדרת מקלט:
-
channel: הערוץ ביומן האירועים של Windows שממנו ייאספו הנתונים. לרישום ביומן של בלוק סקריפט PowerShell, משתמשים ב-Microsoft-Windows-PowerShell/Operational. לרישום ביומן של מודולים, משתמשים ב-Windows PowerShell. -
raw: מוגדר ל-trueכדי לשלוח XML של יומן אירועים גולמי של Windows אל Google SecOps. -
start_at: מגדירים את הערךendכדי לאסוף רק אירועים חדשים אחרי שהסוכן מתחיל. מגדירים את הערךbeginningכדי לאסוף את כל האירועים הקיימים.
-
הגדרות של הכלי לייצוא:
-
<CUSTOMER_ID>: מחליפים במזהה הלקוח מהשלב הקודם. -
creds_file_path: הנתיב המלא לקובץ האימות להטמעת נתונים. מעתיקים את קובץ האימות שהורד למיקום הזה.
endpoint: כתובת URL של נקודת קצה אזורית. משתמשים בנקודת הקצה של האזור ב-Google SecOps:- ארה"ב:
malachiteingestion-pa.googleapis.com - אירופה:
europe-malachiteingestion-pa.googleapis.com - אסיה:
asia-southeast1-malachiteingestion-pa.googleapis.com - רשימה מלאה מופיעה במאמר נקודות קצה אזוריות.
- ארה"ב:
log_type: אם מגדירים את הערךPOWERSHELL, נעשה שימוש במנתח PowerShell.
-
שמירת קובץ ההגדרות
אחרי שמסיימים לערוך, שומרים את הקובץ בלחיצה על קובץ > שמירה.
מפעילים מחדש את סוכן 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 | סוג האירוע כפי שהוא מוגדר במוצר |
| מחשב, System.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 | הנתיב המלא לקובץ שמשויך לתהליך היעד |
| שם המארח, powershell.שם המארח, ContextInfo_שם המארח | target.hostname | שם המארח של ישות היעד |
| שם המארח, powershell.שם המארח, ContextInfo_שם המארח | 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.