איסוף יומנים של Microsoft Network Policy Server (NPS)
במאמר הזה מוסבר איך להטמיע יומנים של Microsoft Network Policy Server (NPS) ב-Google Security Operations באמצעות Google Cloud Storage V2.
Microsoft Network Policy Server (NPS) הוא תפקיד של Windows Server שמספק אימות, הרשאה וניהול חשבונות של RADIUS. שרת NPS מאפשר ניהול מרכזי של מדיניות גישה לרשת עבור מכשירים אלחוטיים, חיבורי VPN, מתגים וגישה מרחוק. ל-NPS אין יכולות ייצוא לענן או ממשקי API מובנים, ולכן צריך לאסוף את היומנים באמצעות כלי העברה של צד שלישי.
לפני שמתחילים
חשוב לוודא שמתקיימות דרישות הסף הבאות:
- מופע של Google SecOps
- פרויקט ב-GCP עם Cloud Storage API מופעל
- הרשאות ליצירה ולניהול של מאגרי GCS
- הרשאות לניהול מדיניות IAM בקטגוריות GCS
- גישה עם הרשאות ל-Windows Server שבו פועל NPS
- גישת אדמין להתקנת NXLog בשרת NPS
הגדרה של רישום ביומן ב-NPS
הפעלת יומני חשבונאות של NPS
- ב-Windows Server שבו פועל NPS, פותחים את Server Manager.
- עוברים אל Tools > Network Policy Server.
- במסוף NPS, מרחיבים את Accounting בחלונית הניווט הימנית.
- לוחצים לחיצה ימנית על הנהלת חשבונות ובוחרים באפשרות הגדרת הנהלת חשבונות.
- באשף הגדרת הנהלת חשבונות, לוחצים על הבא.
- בוחרים באפשרות Log to a text file on the local computer (רישום ביומן לקובץ טקסט במחשב המקומי) ולוחצים על Next (הבא).
- בדף Configure Log File Properties (הגדרת מאפייני קובץ היומן), מגדירים את האפשרויות הבאות:
- ספרייה: משאירים את ברירת המחדל (
%systemroot%\System32\LogFiles) או מציינים נתיב מותאם אישית - פורמט: בוחרים באפשרות DTS Compliant (תואם ל-DTS, מומלץ על ידי מיקרוסופט לפורמט XML מובנה)
- יצירת קובץ יומן חדש: בוחרים באפשרות יומי או שבועי בהתאם לנפח היומן.
- ספרייה: משאירים את ברירת המחדל (
- לוחצים על הבא.
- בודקים את הסיכום ולוחצים על סיום.
הפעלת רישום ביומן ביקורת של NPS
- פותחים את שורת הפקודה כאדמין בשרת NPS.
מריצים את הפקודה הבאה כדי להפעיל את יומן הביקורת של NPS:
auditpol /set /subcategory:"Network Policy Server" /success:enable /failure:enableמוודאים שמדיניות הביקורת מופעלת:
auditpol /get /subcategory:"Network Policy Server"
התקנה והגדרה של NXLog בשרת NPS
הורדה והתקנה של NXLog
- בשרת NPS, מורידים את NXLog Enterprise Edition מהאתר של NXLog.
- מריצים את קובץ ההתקנה ופועלים לפי ההוראות באשף ההתקנה.
- מאשרים את נתיב ההתקנה שמוגדר כברירת מחדל (
C:\Program Files\nxlog) או מציינים נתיב מותאם אישית. - משלימים את ההתקנה.
הגדרה של NXLog לאיסוף יומני NPS
- בשרת NPS, עוברים לספריית ההגדרות של NXLog:
- נתיב ברירת מחדל:
C:\Program Files\nxlog\conf
- נתיב ברירת מחדל:
- פותחים את הקובץ
nxlog.confבכלי לעריכת טקסט (לדוגמה, פנקס הרשימות) עם הרשאות אדמין. מחליפים את כל התוכן של
nxlog.confבהגדרה הבאה:## NXLog configuration for Microsoft NPS log collection ## Collects NPS logs and forwards to Google Cloud Storage define ROOT C:\Program Files\nxlog define LOGDIR C:\Windows\System32\LogFiles define GCS_BUCKET your-gcs-bucket-name define GCS_PREFIX nps-logs define GCS_CREDENTIALS C:\nxlog-credentials\gcs-service-account.json Moduledir %ROOT%\modules CacheDir %ROOT%\data Pidfile %ROOT%\data\nxlog.pid SpoolDir %ROOT%\data LogFile %ROOT%\data\nxlog.log LogLevel INFO <Extension nps> Module xm_nps </Extension> <Extension json> Module xm_json </Extension> <Input nps_logs> Module im_file File '%LOGDIR%\IN*.log' SavePos TRUE ReadFromLast TRUE Recursive FALSE InputType nps <Exec> # Parse NPS logs (DTS Compliant format) # Add hostname for tracking $Hostname = hostname(); # Convert to JSON to_json(); </Exec> </Input> <Output gcs> Module om_file File '%ROOT%\data\gcs-upload\nps-' + strftime(now(), '%Y%m%d-%H%M%S') + '.json' <Exec> # Rotate output file every hour if (file_size(file_name()) > 100000000) file_cycle(); </Exec> </Output> <Route nps_to_gcs> Path nps_logs => gcs </Route>בקובץ התצורה, מחליפים את ה-placeholders הבאים:
-
your-gcs-bucket-name: השם של קטגוריית ה-GCS (שנוצרה בקטע הבא) - מוודאים שנתיב
LOGDIRתואם למיקום של קובץ היומן של NPS
-
שומרים את הקובץ.
יצירת קטגוריה של Google Cloud Storage
- נכנסים אל מסוף Google Cloud.
- בוחרים פרויקט או יוצרים פרויקט חדש.
- בתפריט הניווט, עוברים אל Cloud Storage > Buckets.
- לוחצים על Create bucket.
מספקים את פרטי ההגדרה הבאים:
הגדרה ערך Name your bucket (שם הקטגוריה) מזינים שם ייחודי גלובלית (לדוגמה, nps-logs-chronicle)סוג המיקום בוחרים לפי הצרכים (אזור, שני אזורים, מספר אזורים) Location בוחרים את המיקום (לדוגמה, us-central1).סוג אחסון (storage class) רגיל (מומלץ ליומנים שמתבצעת אליהם גישה לעיתים קרובות) בקרת גישה אחיד (מומלץ) כלים להגנה אופציונלי: הפעלת ניהול גרסאות של אובייקטים או מדיניות שמירת נתונים לוחצים על יצירה.
יצירת חשבון שירות ב-GCS עבור NXLog
יצירת חשבון שירות
- במסוף GCP, עוברים אל IAM & Admin > Service Accounts.
- לוחצים על יצירת חשבון שירות.
- מספקים את פרטי ההגדרה הבאים:
- שם חשבון שירות: מזינים
nxlog-nps-uploader(לדוגמה) - תיאור חשבון השירות: מזינים
Service account for NXLog to upload NPS logs to GCS
- שם חשבון שירות: מזינים
- לוחצים על יצירה והמשך.
- בקטע Grant this service account access to project (הענקת גישה של חשבון השירות הזה לפרויקט), מוסיפים את התפקיד הבא:
- לוחצים על בחירת תפקיד.
- מחפשים את האפשרות יצירת אובייקטים של אחסון ובוחרים אותה.
- לוחצים על Continue.
- לוחצים על סיום.
הורדת מפתח של חשבון שירות
- בדף Service Accounts, לוחצים על חשבון השירות שיצרתם (
nxlog-nps-uploader). - עוברים לכרטיסייה Keys.
- לוחצים על Add Key > Create new key.
- בוחרים באפשרות JSON בתור סוג המפתח.
- לוחצים על יצירה.
- קובץ ה-JSON עם המפתח יירד למחשב.
- מעתיקים את קובץ מפתח ה-JSON לשרת NPS במיקום הבא:
C:\nxlog-credentials\gcs-service-account.json
- יוצרים את הספרייה
C:\nxlog-credentialsאם היא לא קיימת.
הגדרת העלאה אוטומטית ל-GCS
יצירת סקריפט להעלאה ב-PowerShell
- בשרת NPS, יוצרים ספרייה חדשה:
C:\nxlog-scripts
- יוצרים קובץ חדש בשם
upload-to-gcs.ps1בספרייה. פותחים את הקובץ בכלי לעריכת טקסט ומדביקים את סקריפט PowerShell הבא:
# PowerShell script to upload NXLog output files to Google Cloud Storage # Uses gsutil command-line tool $ErrorActionPreference = "Stop" # Configuration $LocalLogDir = "C:\Program Files\nxlog\data\gcs-upload" $GcsBucket = "gs://nps-logs-chronicle/nps-logs/" $ArchiveDir = "C:\Program Files\nxlog\data\archive" $LogFile = "C:\nxlog-scripts\upload.log" # Function to write log messages function Write-Log { param([string]$Message) $Timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" "$Timestamp - $Message" | Out-File -FilePath $LogFile -Append } Write-Log "Starting GCS upload process" # Check if gsutil is available try { $null = gsutil version } catch { Write-Log "ERROR: gsutil not found. Please install Google Cloud SDK." exit 1 } # Activate service account $ServiceAccountKey = "C:\nxlog-credentials\gcs-service-account.json" if (-not (Test-Path $ServiceAccountKey)) { Write-Log "ERROR: Service account key not found at $ServiceAccountKey" exit 1 } try { gcloud auth activate-service-account --key-file=$ServiceAccountKey 2>&1 | Out-Null Write-Log "Service account activated successfully" } catch { Write-Log "ERROR: Failed to activate service account: $_" exit 1 } # Create archive directory if it doesn't exist if (-not (Test-Path $ArchiveDir)) { New-Item -ItemType Directory -Path $ArchiveDir | Out-Null Write-Log "Created archive directory: $ArchiveDir" } # Get all JSON files in the local log directory $Files = Get-ChildItem -Path $LocalLogDir -Filter "*.json" -File if ($Files.Count -eq 0) { Write-Log "No files to upload" exit 0 } Write-Log "Found $($Files.Count) file(s) to upload" # Upload each file to GCS $SuccessCount = 0 $FailCount = 0 foreach ($File in $Files) { try { # Upload to GCS gsutil cp $File.FullName $GcsBucket 2>&1 | Out-Null # Move to archive on success Move-Item -Path $File.FullName -Destination $ArchiveDir -Force Write-Log "Uploaded and archived: $($File.Name)" $SuccessCount++ } catch { Write-Log "ERROR uploading $($File.Name): $_" $FailCount++ } } Write-Log "Upload complete. Success: $SuccessCount, Failed: $FailCount"בתסריט, מחליפים את הערכים הבאים:
-
$GcsBucket: ה-URI של קטגוריית GCS (לדוגמה,gs://nps-logs-chronicle/nps-logs/)
-
שומרים את הקובץ.
התקנת Google Cloud SDK
- בשרת NPS, מורידים את קובץ ההתקנה של Google Cloud SDK מGoogle Cloud SDK.
- מריצים את קובץ ההתקנה ופועלים לפי ההוראות באשף ההתקנה.
- במהלך ההתקנה, בוחרים באפשרות Install bundled Python (התקנת Python שכלולה בחבילה) אם Python עדיין לא מותקן.
- משלימים את ההתקנה.
פותחים שורת פקודה חדשה ומאמתים את ההתקנה:
gsutil version
יצירת משימה מתוזמנת להעלאה אוטומטית
- בשרת NPS, פותחים את Task Scheduler (מתזמן המשימות).
- בחלונית השמאלית, לוחצים על יצירת משימה.
- בכרטיסייה General (כללי), מגדירים את האפשרויות הבאות:
- שם: מזינים
NXLog GCS Upload - תיאור: מזינים
Upload NPS logs to Google Cloud Storage - אפשרויות אבטחה: בוחרים באפשרות הפעלה ללא קשר אם המשתמש מחובר או לא.
- אפשרויות אבטחה: מסמנים את האפשרות הפעלה עם הרשאות הכי גבוהות.
- הגדרות עבור: בוחרים באפשרות Windows Server 2016 או בגרסת השרת שלכם.
- שם: מזינים
- בכרטיסייה טריגרים:
- לוחצים על חדש.
- התחלת המשימה: בוחרים באפשרות לפי לוח זמנים.
- הגדרות: בוחרים באפשרות יומי.
- חוזר כל: מזינים
1ימים. - חזרה על המשימה כל: בוחרים באפשרות 15 דקות.
- למשך: בוחרים באפשרות ללא הגבלה.
- לוחצים על OK.
- בכרטיסייה פעולות:
- לוחצים על חדש.
- פעולה: בוחרים באפשרות הפעלת תוכנית.
- תוכנית/סקריפט: מזינים
powershell.exe. - להוסיף ארגומנטים: מזינים
-ExecutionPolicy Bypass -File "C:\nxlog-scripts\upload-to-gcs.ps1". - לוחצים על OK.
- בכרטיסייה תנאים:
- מבטלים את הסימון של האפשרות הפעלת המשימה רק אם המחשב מחובר לחשמל.
- בכרטיסייה הגדרות:
- מסמנים את התיבה הפעלת המשימה בהקדם האפשרי אחרי שהוחמצה התחלה מתוזמנת.
- בודקים את האפשרות אם המשימה נכשלת, מפעילים מחדש כל: מזינים
5 minutes.
- לוחצים על OK.
- מזינים את פרטי הכניסה לחשבון שיריץ את המשימה (חייבות להיות לו הרשאות אדמין).
- לוחצים על OK.
בדיקת תהליך ההעלאה
- בשרת NPS, פותחים את Task Scheduler (מתזמן המשימות).
- בחלונית שמימין, מרחיבים את Task Scheduler Library (ספריית מתזמן המשימות).
- לוחצים לחיצה ימנית על המשימה NXLog GCS Upload (העלאה של NXLog ל-GCS) ובוחרים באפשרות Run (הפעלה).
- ממתינים כמה שניות עד שהמשימה תושלם.
- כדי לוודא שההעלאה הצליחה, פותחים את קובץ היומן בכתובת
C:\nxlog-scripts\upload.log. - עוברים אל GCP Console > Cloud Storage > Buckets.
- לוחצים על שם הקטגוריה (
nps-logs-chronicle). - עוברים לתיקייה
nps-logs/. - מוודאים שקיימים קובצי JSON עם יומני NPS.
הפעלת שירות NXLog
- בשרת NPS, פותחים את Services (מריצים את
services.msc). - מחפשים את השירות nxlog ברשימה.
- לוחצים לחיצה ימנית על השירות nxlog ובוחרים באפשרות Start (התחלה).
- מוודאים שסטטוס השירות הוא פועל.
- כדי לוודא ש-NXLog אוסף יומנים, בודקים את קובץ היומן של NXLog:
C:\Program Files\nxlog\data\nxlog.log
מחפשים הודעות שמציינות איסוף יומנים מוצלח:
INFO im_file: monitoring file 'C:\Windows\System32\LogFiles\IN250315.log'
אחזור חשבון השירות של Google SecOps
Google SecOps משתמש בחשבון שירות ייחודי כדי לקרוא נתונים מהקטגוריה של GCS. צריך להעניק לחשבון השירות הזה גישה לדלי.
קבלת כתובת האימייל בחשבון השירות
- עוברים אל SIEM Settings > Feeds (הגדרות SIEM > פידים).
- לוחצים על הוספת פיד חדש.
- לוחצים על Configure a single feed (הגדרת פיד יחיד).
- בשדה שם הפיד, מזינים שם לפיד (לדוגמה,
Microsoft NPS Logs). - בוחרים באפשרות Google Cloud Storage V2 בתור סוג המקור.
- בוחרים באפשרות MICROSOFT_NPS בתור סוג היומן.
לוחצים על קבלת חשבון שירות. תוצג כתובת האימייל בחשבון שירות ייחודי, לדוגמה:
```none chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com ```מעתיקים את כתובת האימייל הזו לשימוש בשלב הבא.
לוחצים על הבא.
מציינים ערכים לפרמטרים הבאים של הקלט:
כתובת ה-URL של קטגוריית האחסון: מזינים את ה-URI של קטגוריית GCS עם נתיב הקידומת:
gs://nps-logs-chronicle/nps-logs/- מחליפים את:
-
nps-logs-chronicle: השם של קטגוריית GCS. -
nps-logs/: הקידומת או נתיב התיקייה שבהם מאוחסנים היומנים.
-
- מחליפים את:
- אפשרות מחיקת המקור: בוחרים את אפשרות המחיקה הרצויה:
- אף פעם: לא נמחקים קבצים אחרי ההעברה (מומלץ לבדיקות).
- מחיקת קבצים שהועברו: הקבצים נמחקים אחרי שההעברה מסתיימת.
- מחיקת קבצים שהועברו וספריות ריקות: מחיקת קבצים וספריות ריקות אחרי שההעברה מסתיימת בהצלחה.
- הגיל המקסימלי של הקובץ: כולל קבצים ששונו במספר הימים האחרון (ברירת המחדל היא 180 ימים)
- מרחב השמות של הנכס: מרחב השמות של הנכס
- תוויות להוספה: התווית שתתווסף לאירועים מהפיד הזה
לוחצים על הבא.
בודקים את ההגדרות של הפיד החדש במסך סיום ולוחצים על שליחה.
הענקת הרשאות IAM לחשבון השירות של Google SecOps
- לחשבון השירות של Google SecOps צריך להיות התפקיד צפייה באובייקט אחסון בקטגוריה של GCS.
- עוברים אל Cloud Storage > Buckets (קטגוריות).
- לוחצים על שם הקטגוריה (
nps-logs-chronicle). - עוברים לכרטיסייה Permissions.
- לוחצים על הענקת גישה.
- מספקים את פרטי ההגדרה הבאים:
- Add principals (הוספת ישויות מורשות): מדביקים את כתובת האימייל בחשבון של חשבון השירות של Google SecOps
- הקצאת תפקידים: בוחרים באפשרות צפייה באובייקטים באחסון.
לוחצים על Save.
טבלת מיפוי UDM
| שדה ביומן | מיפוי UDM | היגיון |
|---|---|---|
| גרסה | additional.fields | אם הוא לא ריק, הוא ימוזג עם האובייקטים התואמים |
| ערוץ | additional.fields | |
| מילות מפתח | additional.fields | |
| קוד אופרציה | additional.fields | |
| משימה | additional.fields | |
| ThreadID | additional.fields | |
| EventData.%1 | additional.fields | |
| EventData.%2 | additional.fields | |
| ערוץ | channel.value.string_value | הערך הועתק ישירות |
| EventData.%1 | event_data_p1.value.string_value | הערך הועתק ישירות |
| EventData.%2 | event_data_p2.value.string_value | הערך הועתק ישירות |
| מילות מפתח | keywords.value.string_value | הערך הועתק ישירות |
| TimeCreated | metadata.event_timestamp | בוצעה המרה מ-UNIX_MS לחותמת זמן |
| EventId | metadata.event_type | הערך הוא STATUS_UNCATEGORIZED אם EventId == '4400', STATUS_UPDATE אם EventId == '13', אחרת GENERIC_EVENT |
| EventId | metadata.product_event_type | הערך הועתק ישירות |
| קוד אופרציה | opcode.value.string_value | הערך הועתק ישירות |
| מחשב | principal.asset.hostname | הערך הועתק מ-principal.hostname |
| מחשב | principal.hostname | הערך הועתק ישירות |
| ProcessID | principal.process.pid | הערך הועתק אם הוא לא ריק |
| UserId | principal.user.windows_sid | חילוץ באמצעות ביטוי רגולרי כדי לקבל את מזהה האבטחה (SID) של Windows |
| EventId | security_result.rule_name | ההגדרה היא 'EventID: ' + EventId |
| רמה | security_result.severity | הערכים ששונו: INFO/Informational/Information/Normal/NOTICE ל-INFORMATIONAL, ERROR/Error ל-ERROR, WARNING/Warning ל-INFORMATIONAL, DEBUG ל-INFORMATIONAL, Critical ל-CRITICAL |
| משימה | task.value.string_value | הערך הועתק ישירות |
| ThreadID | thread_id.value.string_value | הערך הועתק ישירות |
| גרסה | version.value.string_value | הערך הועתק ישירות |
| metadata.vendor_name | metadata.vendor_name | הגדרה כ-Microsoft |
| ProviderName | metadata.product_name | הערך הועתק ישירות |
יומן שינויים
צפייה ביומן השינויים של מנתח התוכן הזה
הבעיה עדיין לא נפתרה? קבלת תשובות מחברי הקהילה וממומחי Google SecOps.