איסוף יומנים של 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, צריך להפעיל את האפשרות 'רישום ביומן של חסימת סקריפטים'.

הפעלת רישום ביומן של חסימת סקריפטים באמצעות מדיניות קבוצתית

  1. פותחים את הכלי לעריכה של מרכז המדיניות לקבוצות על ידי הפעלת gpedit.msc כאדמין.
  2. עוברים אל Computer Configuration > Administrative Templates > Windows Components > Windows PowerShell (הגדרת המחשב > תבניות אדמיניסטרטיביות > רכיבי Windows > Windows PowerShell).
  3. לוחצים לחיצה כפולה על Turn on PowerShell Script Block Logging (הפעלת רישום ביומן של בלוק סקריפט של PowerShell).
  4. לוחצים על הפעלה.
  5. אם רוצים, מסמנים את האפשרות תיעוד אירועי התחלה / עצירה של הפעלת בלוק סקריפט כדי לתעד אירועי התחלה ועצירה של כל בלוק סקריפט. הערה: האפשרות הזו יוצרת נפח גדול של יומנים.
  6. לוחצים על OK.
  7. פותחים את שורת הפקודה כאדמין ומריצים את הפקודה gpupdate /force כדי להחיל את המדיניות באופן מיידי.

הפעלת רישום ביומן של חסימת סקריפטים באמצעות הרישום

אפשרות אחרת היא להפעיל את רישום החסימה של סקריפטים על ידי הגדרת ערך הרישום הבא:

  1. פותחים את עורך הרישום על ידי הפעלת regedit כאדמין.
  2. נווט אל HKLM\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging.
  3. אם המפתח לא קיים, יוצרים אותו.
  4. יוצרים ערך DWORD (32-bit)‎ חדש בשם EnableScriptBlockLogging ומגדירים את הערך שלו כ-1.
  5. מפעילים מחדש את הסשנים של PowerShell כדי שהשינוי ייכנס לתוקף.

התכונה PowerShell Script Block Logging כותבת אירועים בערוץ יומן האירועים Microsoft-Windows-PowerShell/Operational עם מזהה האירוע 4104.

אופציונלי: הפעלת רישום ביומן של מודולים

ב-Module Logging מתועדים פרטי ההרצה של צינור עיבוד הנתונים במודולים שצוינו. כדי להפעיל את Module Logging (רישום ביומן של מודולים) לכל המודולים:

  1. ב-Local Group Policy Editor, עוברים אל Computer Configuration > Administrative Templates > Windows Components > Windows PowerShell.
  2. לוחצים לחיצה כפולה על Turn on Module Logging (הפעלת רישום ביומן של מודולים).
  3. לוחצים על הפעלה.
  4. לוחצים על הצגה לצד שמות המודולים.
  5. מזינים * כדי לתעד את כל המודולים.
  6. לוחצים על אישור בחלון שמות המודולים.
  7. לוחצים על אישור בחלון רישום ביומן של המודול.
  8. מריצים את gpupdate /force כדי להחיל את המדיניות.

אירועי Module Logging נכתבים ביומן האירועים של Windows PowerShell עם מזהה האירוע 4103.

אופציונלי: הפעלת התמלול

התמלול יוצר תיעוד מבוסס-טקסט של כל הקלט והפלט של סשן PowerShell. כדי להפעיל את התמלול:

  1. בעורך מדיניות הקבוצה המקומית, עוברים אל הגדרת המחשב > תבניות ניהול > רכיבי Windows > Windows PowerShell.
  2. לוחצים לחיצה כפולה על Turn on PowerShell Transcription.
  3. לוחצים על הפעלה.
  4. אפשר לציין ספריית פלט לתמליל. אם משאירים את השדה ריק, התמלילים נשמרים בתיקיית המסמכים של כל משתמש.
  5. מסמנים את האפשרות הכללת כותרות של הפעלות כדי לכלול חותמות זמן ומטא-נתונים.
  6. לוחצים על OK.
  7. מריצים את הפקודה gpupdate /force כדי להחיל את המדיניות.

תמלילים נכתבים לקובצי טקסט שהשמות שלהם מתחילים ב-PowerShell_transcript.

קבלת פרטי כניסה ל-Google SecOps בשביל סוכן Bindplane

כדי לאמת את סוכן Bindplane ב-Google SecOps, בוחרים אחת מהשיטות הבאות:

  • פריסות חדשות: משתמשים ב-Chronicle API (אפשרות 1).
  • פריסות מדור קודם: אפשר להמשיך להשתמש בקובץ האימות של ה-API להעברת נתונים (אפשרות 2) עד שה-API להעברת נתונים יפסיק לפעול ב-20 ביולי 2027.
  1. נכנסים אל Google Cloud המסוף ובוחרים את Google Cloud הפרויקט שמקושר למופע של Google SecOps.
  2. נכנסים לדף IAM & Admin > Service Accounts.
  3. לוחצים על Create service account.
  4. מזינים את פרטי ההגדרה הבאים:
    • שם חשבון השירות: מזינים שם לחשבון (לדוגמה, bindplane-ingest).
    • תיאור חשבון השירות: מזינים תיאור (לדוגמה, Bindplane agent log ingestion).
  5. לוחצים על Create and continue.
  6. בקטע Grant this service account access to project לוחצים על Select a role ובוחרים באפשרות Chronicle Editor.
  7. לוחצים על המשך ואז על סיום.
  8. לוחצים על חשבון השירות שיצרתם ועוברים לכרטיסייה Keys.
  9. לוחצים על Add key > Create new key.
  10. בוחרים באפשרות JSON ולוחצים על Create. קובץ המפתח יורד למחשב.
  11. שומרים את קובץ המפתח בשם 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 כך שיתאים לנתיב שבו שומרים את הקובץ.
  12. עוברים אל IAM & Admin > Settings ומעתיקים את הערך של Project number. תצטרכו אותו כדי להגדיר את הייצוא.

אפשרות 2: הורדה של קובץ האימות להטמעת נתונים (מדור קודם)

  1. נכנסים למסוף Google SecOps.
  2. עוברים אל SIEM Settings > Collection Agents (הגדרות SIEM > סוכני איסוף).
  3. מורידים את קובץ האימות להטמעת נתונים.
  4. שומרים את הקובץ בצורה מאובטחת במערכת שבה יותקן הסוכן של Bindplane.

איך מקבלים את מספר הלקוח ב-Google SecOps

  1. נכנסים למסוף Google SecOps.
  2. עוברים אל SIEM Settings > Profile.
  3. מעתיקים את מספר הלקוח מהקטע פרטי הארגון ושומרים אותו.

התקנת סוכן Bindplane

מתקינים את סוכן Bindplane במארח Windows לפי ההוראות הבאות.

התקנה ב-Windows

  1. פותחים את שורת הפקודה או את PowerShell כאדמין.
  2. מריצים את הפקודה הבאה:

    msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
    
  3. מחכים שההתקנה תסתיים.

  4. מאמתים את ההתקנה על ידי הרצת:

    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
    
  • או באמצעות מסוף השירותים:

    1. לוחצים על Win+R, מקלידים services.msc ולוחצים על Enter.
    2. מחפשים את observIQ OpenTelemetry Collector.
    3. לוחצים לחיצה ימנית ובוחרים באפשרות הפעלה מחדש.
    4. מוודאים שהשירות פועל:

      sc query observiq-otel-collector
      
    5. בודקים אם יש שגיאות ביומנים:

      type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
      

אימות הטמעת היומנים

אחרי שמגדירים את סוכן Bindplane ומפעילים מחדש את השירות, היומנים של PowerShell אמורים להתחיל לזרום אל Google SecOps.

  1. נכנסים למסוף Google SecOps.
  2. עוברים אל חקירה > חיפוש.
  3. מריצים את החיפוש הבא כדי לוודא שיומני PowerShell נקלטים:

    metadata.log_type = "POWERSHELL"
    
  4. מוודאים שהאירועים מופיעים עם חותמות זמן עדכניות.

אירועים של רישום ביומן של בלוקים של סקריפטים ב-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.