ליצור דוחות התחברות ל-Active Directory עם PowerShell

צור דוחות כניסה ל Active Directory באמצעות PowerShell. כפי שאנו יודעים, בקריאת קבצים בסביבת Active Directory (AD) חיונית למערכת אבטחה. חיוני לגלות מה עשה המשתמש ובאיזו מערכת הוא נכנס. לכן, אחת מהמשימות החיוניות ביותר שצוותי מנהלים רובם נתקלים בהן כיום היא למצוא איפה משתמש נכנס. מאמר זה ילמד כיצד להשתמש בצפיין אירועים המובנה בשרתי התחברות (DC) ברשת, למצוא איפה משתמש נכנס, וליצור דוח כניסה מקיף באמצעות PowerShell.

לכן, בואו נמשיך עם המאמר "צור דוחות כניסה ל Active Directory באמצעות PowerShell".

צור דוחות כניסה ל Active Directory

דרישות מוקדמות

מציג אירועים ומצג את האירועים לימים, עלינו לוודא שגודל יומני האירועים שלנו מספיק. אף על פי שייתכן כי כבר הפעלנו את ההגדרות הללו, נבדוק אותן שוב אם אנשים אחרים צריכים להגדיל את גודל יומני האירועים שלהם.

אם לא שינינו שום הגדרה קודם לכן, הגדרת הגודל המוגדרת כברירת מחדל של יומן האירועים שלנו אמורה להיות בסביבות 64 מגה־בייט. עם זאת, ייתכן שיהיה צורך בהגדלת הגודל, בעיקר אם אנו עוסקים עם מספר רב של DCs בסביבת הפעולה שלנו. לדוגמה, אם נרצה לעקוב אחרי הכניסות ליומן עבור מספר ימים, נצטרך מקום רב יותר במציג האירועים.

יצירת GPO

1. כשלב ראשון בהכנת הסביבה, ניצור אובייקט מדיניות קבוצה (GPO) הכולל את ההגדרות של גודל יומן האירועים. נפתח את קונסולת ניהול מדיניות הקבוצה (GPMC), ניצור GPO. כדי לפתוח את הקונסולה, נחפש מדיניות קבוצה או נכתוב gpmc.msc בחלון Run (Ctrl+R).

2. בלוח הניווט, נרחיב את היער:שם_היער, נרחיב את תחומים, נרחיב את שם_התחום, ואז נלחץ על אובייקטי מדיניות קבוצה. לאחר מכן, נלחץ על פעולה, ואז נלחץ על חדש.

3. מצא את הנתיב הבא בתוך ה־GPO החדש שנוצר:

4. שנה את גודל אירוע ה־אבטחה על פי הסביבות והדרישות שלנו. בנוסף, אם אין חשש לשטח אחסון וביצועים, ניתן להגדיר הגדרות ברמה מרבית של 4 ג'יגה־בייט.

5. השלב הבא אופציונלי אם לשרתי ה־domain אין הגדרות חומת אש. עם זאת, עלינו להיות מסוגלים לשאול רשומות אירוע ממספר שרתי ה־domain ואולי גם ממספר אתרים. כתוצאה, יש לוודא כי רימוט אירוע רישום מעקב מופעל דרך החומה.

לצערנו, ניתן לכסות רק חלק מהפרטים בנושא הגדרת החומה. עם זאת, התמונה למטה תציג את כל ההגדרות הנדרשות להפעלת מעקב ברחוק אחר רישומי אירועים בשרתי ה־domain שלנו.

6. כעת, חבר את GPO שיצרנו ל-OU של שולחנות הבקרה של התחום וחכה לאירועים מסוימים להתמלא. האירוע תלוי בסביבה, ונוכל להתחיל לשאול אודיטים מייד או לחכות כמה ימים. עכשיו שהגדרנו כראוי את הלוגינג שלנו, נוכל לעבור להפעלת סקריפט PowerShell, שיתואר בחלק הבא של המאמר.

השלב הבא ביצירת דוחות התחברות ל-Director הוא החלק העיקרי של כותרת המאמר. נא להמשיך לקרוא.

יצירת דוחות התחברות ל-Director באמצעות PowerShell

להתחיל, הורד והעתק את הסקריפט לתיקייה או ספרייה. בנוסף, אם יש לך git מותקן, נוכל להריץ את הפקודה הבאה.

git clone https://github.com/InfraSOS/Get-UserLastLogon.git

ActiveDirectory מודול, אך לא יהיה עלינו להתקין אותו באופן ידני מאחר והתסריט בודק את המודול במערכת שלנו. לאחר ההורדה, הפעל PowerShell ונווט אל תיקיית התסריט או הדיסק שבו התסריט נורד.

אם נערוך את הקובץ שהורדנו, נראה ארבע פונקציות ראשיות. אלו הן Param, Begin, Process, ו־End.

הסבר על תסריט PowerShell

החלק Param מכיל את הפרמטרים הנדרשים להפעלת התסריט. כפי שמוצג בקטע הקוד למטה, אנו זקוקים לשלושה פרמטרים כדי שהתסריט יעבוד. נסביר פרטים נוספים על הפרמטרים מאוחר יותר.

param (
    [Parameter(Mandatory = $true)]
    [String]$User,

    [Parameter(Mandatory = $false)]
    [Array]$Server = @((Get-ADDomainController -Filter *).Name) ,

    [Parameter(Mandatory = $false)]
    [Array]$Days = 90
)

כפי שפרקטיקה מומלצת, מומלץ לשים משתנים ומידע כללי בחלק Begin כדי למנוע התקפצנות בחלק העיקרי של התסריט.

[Array]$Table         = $null
$DomainControllers    = $Server
$AllDomainControllers = @((Get-ADDomainController -Filter *).Name)
[Array]$ExclusionList = @($User,'krbtgt')
$DCCount              = $DomainControllers.Count
$UPN                  = ((get-addomain).DNSRoot).toUpper()
$DateFilter           = "-"+$days
$DateThen             = (((Get-Date).AddDays($DateFilter)).ToString("yyyy-MM-dd"))+"T20:30:00.000Z"
$DateNow              = (Get-Date -Format yyyy-MM-dd)+"T20:30:00.999Z"
$ForestRoot           = ((Get-ADForest).rootDomain).toUpper()
$Counter              = 0

התסריט Begin גם יוצר מסנן ראשי לשאילתת יומן האירועים. לאחר מכן, התסריט ישלח את המסנן הזה לכל שרת הבקרה (DC) כדי לאסוף מידע. כפי שניתן לראות בשורות אלו, ישנם משתנים שכבר נדונו מראש, כמו $UPN ו־$User.

[xml]$FilterXML = @"


    *[System[(EventID=4769)
	and TimeCreated[@SystemTime>='$DateThen'
	and @SystemTime<='$DateNow']]]
	and*[EventData[Data[@Name='TargetUserName'] and (Data='$User@$UPN')]]


"@

המקטע של תהליך הוא הפונקציה החיונית, שבה הסקריפט שואל את הנתונים ליצירת דוח. הבלוק של הקוד למטה הוא פקודת foreach המבצעת כל פעם שאנו מתחברים ל-DC אחר כדי לשאול את הנתונים.

Foreach($DCName in $DomainControllers){...}

אנו מתחילים באיסוף אירועים ב-DC הראשון שלנו. לאחר מכן, השלב הבא הוא לחלץ מידע יקר מכל אירוע ולשמור אותו באובייקט לפני המשך לאירוע הבא. כאשר סיימנו עם ה-DC הראשון, הסקריפט מעבור ל-DC אחר ומחזיר את התהליך.

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

end{
    $Table = $Table | Where-Object {($_.Location -notin $AllDomainControllers) -and ($_.Location -ne $ForestRoot) -and ($_.Location -notin $ExclusionList)}
    $Table | Sort Time | FT Time,User,Location,Domain,DC -AutoSize
}

הרצת הסקריפט בפוורשל

כדי להתחיל, פתחו פוורשל והקלידו את הפקודה הבאה לטעינת הקמדלט לזכרון. כאשר אנו לוחצים על מקש ה-Enter, יתכן כי יהיה שגיאה המציינת שהרצת הסקריפט מושבתת עקב מדיניות הרצת הפוורשל, או שלא תהיה שגיאה. במקרה של שגיאה, פתחו חלון פוורשל בהרשאות מנהל, הקלידו את הפקודות הבאות למטה כדי לאפשר הרצת סקריפטים, ואז חזרו על הפקודה הקודמת.

. .\Get-UserLastLogon.ps1

כשאנו לוחצים על מקש Enter, ייתכן שיתקבל שגיאה המציינת שהריצה של התסריט מושהת בגלל מדיניות ביצוע פורס וורקס, או שלא יהיו שגיאות. במקרה של שגיאה, פתחו חלון פורס וורקס עם הרשאות מנהל, הקלדו את הפקודות הבאות לאפשר ביצוע תסריטים, ואז חזרו על הפקודה הקודמת.

Set-ExecutionPolicy RemoteSigned
. .\Get-UserLastLogon.ps1

עכשיו שהתסריט עמד על כל הטווח בוא ניקח אותו כדוגמה לגלות אילו משרדים המשתמש התחבר לבין האחרונים 15 יום. קודם כל, הקלד את שם המשתמש עם ה–User פרמטר ואת טווח הזמן עם ה –Days פרמטר ולחץ על Enter

Get-UserLastLogon -User marion -Days 15

כפי שייתכן שתזכרו, יש לנו פרמטר נוסף הנקרא -שרת פרמטר. אם אנו לא מספקים ערך ל-שרת פרמטר, נחשב את כל דומיין מזהים למילוי פרמטר זה. עכשיו, אם יש לנו DC ספציפי במוחנו לייעל חיפוש שאיתו, אנו יכולים לציין אותו כערך של -שרת פרמטר.

לאחר הריצה, התסריט יציג מסך התקדמות המודיע לנו על מצבו ועד כמה זמן ייקח לסיים. עכשיו אנו יכולים לראות דוח שנוצר לאחר הריצת התסריט. הדוח מספר לנו אילו מחשבים המשתמש התחבר אליהם במהלך 15 הימים האחרונים.

Time                  User   Location      Domain  DC
----                  ----   --------      ------  --
11/19/2022 7:31:11 AM marion DESKTOP-IGK57 abc.com MARION-DC01

הבנת התסריט של PowerShell

כשאנו מפעילים את התסריט, בתחילה הוא בודק אם קיים חשבון המשתמש או לא. לכן, ברור שאם השם המשתמש המוזן או המזהה אינם קיימים, אין צורך לרוץ בשאר התסריטים.

בשלב הבא, אנו מחשבים את המשתנים הנדרשים ושולחים אותם ל-DC, יחד עם המסנן הדרוש לשאילתת האירועים עבור המשתמש הנבחר שלנו. לבסוף, התסריט שולח בקשה לממשק השרת הראשון ממשק השרת התחום ברשימה, והאירועים המתועדים הקשורים למשתמש הנבחר נשמרים במשתנה.

הרשימה של האירועים הנשמרים שהתסריט יתחיל איתו, והשלבים הבאים יעסוק באספת מידע בעל ערך מהאירועים. לבסוף, התסריט מקצה את המידע הנשלף למשתנה, כגון התחום, שם ה-DC, זמן התחברות, ועבודת התחברות.

בסוף, התסריט עובר על ה-DC הבא וחוזר על התהליך.

התסריט יציג לנו רשימת מחשבים ברגע שהוא מתקשר עם ה-DC האחרון ואוסף את המידע שלו.

Time                  User   Location      Domain  DC
----                  ----   --------      ------  --
11/19/2022 7:31:11 AM marion DESKTOP-IGK57 abc.com MARION-DC01

תודה שקראת ליצירת דוחות כניסה פעילים ב-Active Directory עם PowerShell. אנו נסיים.

סיום יצירת דוחות כניסה פעילים ב-Active Directory

במדריך זה, למדנו כיצד להשתמש במציג האירועים החיוני ולשלב אותו עם תסריטי PowerShell כדי למצוא רשימת תחנות עבודה בהן משתמש התחבר. התסריט משאיל את כל שרתי ה-DC בדומיין, מוצא את התוצאות ומפרק אותן לתבנית קריאה שנוכל לייצא כ-דוח. זכור להריץ בדיקת דרישות מראש לפני הרצת התסריט המסופק.

Source:
https://infrasos.com/create-active-directory-logon-reports-with-powershell/