שלטו על מסנני LDAP בפוורשל תוך כדי למידת AD

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

בפוסט הזה, אנו הולכים לחקור עמוק להבנה של כיצד להשתמש בפילטרים של Active Directory. אני מקווה שבסוף הפוסט, לא תנסו עוד להשתמש ב-Where-Object ובסינון נכון!

דרישות קדם

כדי שכל הקוד שאני הולך להציג יעבוד, אני מניח כמה דברים:

ישנם שני לשוני פילטר שאפשר להשתמש בהם כאשר מחפשים אובייקטים באמצעות רוב ה-cmdlets של Active Directory: פילטרים של PowerShell ופילטרים של LDAP.

פילטרים של PowerShell

פילטרים של PowerShell משתמשים בתחביר הביטויים התקני של PowerShell. נקרא לכך בדרך כלל תחביר סינון של Active Directory.

פילטרים אלו נמצאים בשימוש עם פרמטר ה-Filter. תחביר הפרמטר Filter

אופרטורים

בעת בניית מסנן עבור הפרמטר Filter, יהיה עליך להשתמש בפחות כמעט אופרטור אחד. האופרטורים שיש להשתמש בהם כאן הם האופרטורים המוכרים שאתה יכול להשתמש בהם כאשר אתה משתמש בפקודות כמו Where-Object.

בתוך הפרמטר Filter, אתה יכול להשתמש באופרטורים הבאים.

Operator Explanation
-eq Equal to
-le Less than or equal to
-ge Greater than or equal to
-ne Not equal to
-lt Less than
-gt Greater than
-approx Approximately equal to
-bor Bitwise OR
-band Bitwise AND
-recursivematch Recursive match
-like Like
-notlike Not like
-and Boolean AND
-or Boolean OR
-not Boolean NOT

התייחסות למאפייני אובייקט AD

בתוך המסנן, תقارנו בין מאפייני אובייקט AD שונים באמצעות אופרטורים. לדוגמה, פקודת ה-Get-AdUser מחזירה את מאפיין ה-Name. אם תרצה למצוא את כל המשתמשים התואמים לשם מסוים, יש לך להשתמש ב:

PS51> Get-Aduser -Filter "Name -eq 'Adam Bertram'"

שמות המאפיינים יכולים להיות השם או שם המסנן של המאפיין שמוחזר עם פקודת ה-AD.

ערכי המאפיינים מסתובבים בדרך כלל בין גרשיים יחידים או גרשיים כפולים. התו הכוכב (*) הוא התו הכללה היחיד שנקלט.אדם ברטרם מוקף בגרשיים יחידים למרות שהמסנן מוקף בגרשיים כפולים.

יש להפריד בין תווים מסוימים שחייבים להישאר 'מחולקים' כאשר הם בשימוש במסננים. אלו הם:

Character Escaped As Notes
`” Only required if the data is enclosed in double quotes.
\’ Only required if the data is enclosed in single quotes.
NUL \00 This is a standard LDAP escape sequence.
\ \5c This is a standard LDAP escape sequence.
* \2a Automatically escaped. Only in -eq and -ne comparisons. You should use -like and -notlike operators for wildcard comparison.
( /28 Automatically escaped.
) /29 Automatically escaped.
/ /2f Automatically escaped.

מהו LDAP ב-Active Directory?

LDAP, או פְּרוֹטוֹקוֹל גישה לספריה קלה (באנגלית: Lightweight Directory Access Protocol), הוא פרוטוקול ניטרלי ליצרן לגישה ולשינוי נתוני ספרייה. אולי תחשבו על ספר טלפונים כאשר אתם שומעים את המילה "ספרייה", אך בהקשר של Active Directory, זה אומר הרבה יותר. מגוון רחב של סוגי אובייקטים מאוחסנים ונגישים על ידי Active Directory תחת הפרוטוקול LDAP, שפועל כאמצעי לגישה לנתונים אלו.

מאחר ו-Active Directory יכולה לאחסן מגוון רחב של סוגי נתונים, יישומים ומשתמשים צריכים דרך לשאילת אותה ספרייה בקלות. המשך הקריאה כדי ללמוד איך סינוני LDAP עוזרים בסינון של הנתונים האלו!

סינוני LDAP

Active Directory מיישם את LDAP, הפרוטוקול לגישה לספרייה קלה (Lightweight Directory Access Protocol). באמצעות הפרמטר LDAPFilter עם הפקודות האפשרות להשתמש בסינוני LDAP, כמו אלה שנוצרו ב-Active Directory Users and Computers.

התחביר של סינוני LDAP מוגדר ב- RFC מספר 4515.

כל כלל סינון מוקף בסוגריים ( ). כללי סינון יכולים להתקבץ על ידי הקיפוף של הקבוצה בסוגריים והכלול של משווה מהרשימה הבאה:

Operator Function
& and
| or
! not

סינוני LDAP גם מכילים כלל התאמה מיוחדת לזיהויים אובייקטים (OIDs):

OID Purpose
1.2.840.113556.1.4.803 Bitwise AND
1.2.840.113556.1.4.804 Bitwise OR
1.2.840.113556.1.4.1941 Chain matching (for distinguished name attributes)

יש ארבעה סוגי סינון:

Operator Explanation
= Equal to
~= Approximately equal to
>= Greater than or equal to
<= Less than or equal to

יש ארבעה סוגי פריטים:

Type Explanation
= Simple
=* Present
=something* Substring
Extensible varies depending on type

כללי סינון LDAP חייבים להשתמש עם שמות ה- LDAP של התכונות, וערכי תווים מסוימים חייבים להיות 'מוסתרים' אם משמשים בסינון LDAP. אלה הם: assistant:

Character Escaped As
* \2a
( \28
) \29
\ \5c
NUL \00

ערכי הנכסים להשוואה לא צריכים להיות מסובכים בצורת מרכאות.

דוגמאות למסנני LDAP

בניית מסנני LDAP יכולה להיות אתגר. הנה כמה דוגמאות לשימוש במסנני קבוצות של Active Directory כנקודת התחלה ליצירת מסננים משלך.

  • כל הקבוצות עם שם (cn) 'מחלקת שירותים מקצועיים'

    'cn -eq "מחלקת שירותים מקצועיים"' או `'(cn=מחלקת שירותים מקצועיים)'

  • כל הקבוצות עם שם 'מחלקת שירותים מקצועיים' ותיאור 'חי'

    '(cn -eq "מחלקת שירותים מקצועיים") -וגם (description -eq "חי")' או '(&(cn=מחלקת שירותים מקצועיים)(description=חי))'

  • כל הקבוצות עם שם 'מחלקת שירותים מקצועיים' או 'כל המחלקות חולקות גישה'

    '(cn -eq "מחלקת שירותים מקצועיים") -או (cn -eq "כל המחלקות חולקות גישה")' או '(|(cn=מחלקת שירותים מקצועיים)(cn=כל המחלקות חולקות גישה))'

  • כל הקבוצות שאין להם תיאור של 'חי'. כולל אלה שאין להם שדה תיאור בכלל

    '(!(description=חי))'

  • כל הקבוצות שאין להם תיאור של 'חי'. מיילגר אלה שאין להם שדה תיאור בכלל

    'description -ne "חי"'

  • כל הקבוצות עם תיאור של 'חי' אך לא עם שם של 'מחלקת שירותים מקצועיים'

    '(description -eq "חי") -and (cn -ne "מחלקת שירותים מקצועיים")' או '(&(description=חי)(!(cn=מחלקת שירותים מקצועיים)))'

  • כל הקבוצות שהתיאור שלהן הוא '\\fileserver1\fileshare'

    'description -eq "\5c\5cfileserver1\5cfileshare"' או '(description=\5c\5cfileserver1\5cfileshare)'

שימוש ב- RecursiveMatch או ב- Chain Matching

שימוש בחוק התאמה OID, או בפרמטר ה- RecursiveMatch הוא דרך עוצמתית לפתור שאלה שנשאלת לעתים קרובות על ידי שאילתת AD: ‘איך אני יכול לקבוע את כל הקבוצות שבהן המשתמש חבר, לפי ישירות ובאופן עקיף?’ אתה משתמש ב- Active Directory Search Filter memberOf כדי לגלות.

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

PS51> Get-ADUser -Identity Kristin.Diaz -Property memberOf

DistinguishedName : CN=Diaz Kristin,OU=Professional Services,OU=All User Accounts,DC=domain,DC=local
Enabled           : True
GivenName         : Kristin
MemberOf          : {CN=Professional Services Department,OU=All Groups,DC=domain,DC=local}
Name              : Diaz Kristin
ObjectClass       : user
ObjectGUID        : 04fe6336-c541-4e71-b7ed-6fee7db23482
SamAccountName    : Kristin.Diaz
SID               : S-1-5-21-447422785-3715515833-3878445295-1186
Surname           : Diaz
UserPrincipalName :

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

PS51> Get-ADGroup -LDAPFilter '(member:1.2.840.113556.1.4.1941:=CN=Diaz Kristin,OU=Professional Services,OU=All User Accounts,DC=domain,DC=local)'
PS51> Get-ADGroup -Filter 'member -RecursiveMatch "CN=Diaz Kristin,OU=Professional Services,OU=All User Accounts,DC=domain,DC=local"'

שניהם מחזירים את הבא:

DistinguishedName : CN=All Departments Share Access,OU=All Groups,DC=domain,DC=local
GroupCategory     : Security
GroupScope        : Universal
Name              : All Departments Share Access
ObjectClass       : group
ObjectGUID        : 8ac0e0b7-9225-40a4-b168-a0330960e182
SamAccountName    : All Departments Share Access
SID               : S-1-5-21-447422785-3715515833-3878445295-1254

DistinguishedName : CN=Professional Services Department,OU=All Groups,DC=domain,DC=local
GroupCategory     : Security
GroupScope        : Universal
Name              : Professional Services Department
ObjectClass       : group
ObjectGUID        : a8432583-7cac-4e8e-8d94-51e1c5bb1989
SamAccountName    : Professional Services Department
SID               : S-1-5-21-447422785-3715515833-3878445295-1255

הפרמטרים SearchBase ו־SearchScope

בסביבות גדולות, ב־AD יכול להכיל אלפי עצמים. דרך לשפר את הביצועים ולהפחית את מספר העצמים המוחזרים לשאילתה כלשהי היא להגדיר את החיפוש.

הפרמטר SearchBase מקבע איפה בהיררכיית ה־AD מתחיל כל חיפוש. בעת השימוש ב־cmdlets, זהו מיוצג מחרוזת של שם מסובך (וכברירת מחדל הוא ה'ראש' של התחום). יש שלושה רמות של SearchScope:

  1. Base – העצם שצוין כ־SearchBase.
  2. OneLevel – מחפש עצמים המוכלים מיידית על ידי ה־SearchBase אך לא בכלי אחסון משניים.
  3. SubTree – מחפש עצמים המוכלים ב־SearchBase ובכלי אחסון משניים, באופן רקורסיבי בהיררכיית ה־AD.
Example OU Structure

בדוגמה שלמעלה, כאשר ה-SearchBase מוגדר ל-OU=כל החשבונות של המשתמש,DC=domain,DC=local, עם SearchScope של בסיס ינסה לשאול את אובייקט ה-OU עצמו, SearchScope של OneLevel יחפש את OU של כל החשבונות של המשתמש בלבד, ו-SearchScope של SubTree יחפש בשני ה-OUים, גם ב-כל החשבונות של המשתמש וגם ב-שירותים מקצועיים.

סיכום

כעת אמור לך להיות ברור איך לסנן באמצעות כלי כגון Active Directory PowerShell. ניתן לראות שיש הרבה בניית תחביר הסינון המושלמת הזו. זה קשה יותר לבנות את הסינון המתאים מאשר להשתמש ב-cmdlet של Where-Object.

אך שווה להשקיע זמן בלמידה של הדרך 'נכונה' לסנן את אובייקטי ה-AD ולקבור את התמורות של ביצוע ויעילות מעולה!

קריאה נוספת

Source:
https://adamtheautomator.com/ldap-filter/