NTLM מול Kerberos בהדגמה — למה האימות "נופל" ל-NTLM
· עודכן בתאריך: · Go Komura · NTLM, Kerberos, Windows, Active Directory, אבטחה, אימות, מערכות מידע
גם ברשת ארגונית שמתוארת כ”סביבת Kerberos”, איסוף audit logs תמיד מעלה NTLM. ומה שעולה בדרך כלל הוא אפליקציה שאמורה לתמוך ב-Kerberos.
“נפילה ל-NTLM” כאן אינה אומרת שהאימות נעצר בשגיאה; היא אומרת מעבר ל-NTLM מפני שאי אפשר להשתמש ב-Kerberos. מערכת עסקית יכולה לעבוד מצוין ובכל זאת לא להשתמש בשיטת האימות שציפיתם לה.
המאמר הזה משווה תחילה, עם דיאגרמות, במה NTLM ו-Kerberos משתמשים כחומר האימות, ושל מי כל אחד מהם מאמת את הזהות. ברגע שההבדל הזה ברור, אותו מנגנון מסביר גם למה האימות עובר ל-NTLM בהתאם לשם היעד או לסוג החשבון, וגם למה מתקפת relay ו-Pass-the-Hash עובדות.
סדר הקריאה הוא איך המנגנונים שונים → התנאים שגורמים למעבר → ההחלטות לגבי הגנה והגירה. אם המטרה שלכם היא חקירת תקלה, הפרידו קודם בין “זה עובד על NTLM” לבין “האימות עצמו נעצר”, ואחר כך השתמשו במדריך לפי מטרה בסעיף 1 כדי לעבור לסעיף 6.
הנוהל לתיעוד המצב של המערכות שלכם (הגדרת audit policies, מעקב אחרי האירועים, הסדר שבו מתקנים) מופיע במאמר הנלווה “האם ביטול NTLM יעצור את האפליקציות העסקיות שלכם?”.
1. קודם המסקנה
יש שלושה דברים לתפוס קודם: החומר שבו כל פרוטוקול מאמת, התנאים שמעבירים את האימות ל-NTLM, והמדיניות לאבטחה ולהגירה.
להבין איך המנגנונים שונים
NTLM בונה response מתוך hash; Kerberos משתמש בכרטיס שנושא את שם היעד. ה-credentials של NTLM הם שם domain, שם משתמש ו-hash חד-כיווני של הסיסמה.1 ב-NTLMv2 משתמשים במפתח שנגזר מה-hash הזה כדי לחשב HMAC על ה-challenge של השרת, חתימת זמן, challenge מצד הלקוח ומידע על היעד (סעיף 2.2).2
Kerberos, לעומת זאת, מנפיק service ticket לפי ה-SPN — שם השירות של היעד — ובכך קובע “מי, לאיזה שירות”.3 מכאן נובעים שלושה הבדלים: mutual authentication, הפנייה ל-DC בזמן אימות חשבון domain, ו-delegation לשירותים אחרים (סעיף 5).4
להפריד בין נפילה לבין שגיאת אימות
“זה עובד על NTLM” ו”זה נעצר בשגיאת Kerberos” מתחילים במקומות שונים בחקירה. הסיבות העיקריות למעבר ל-NTLM הן כתובות IP מוקשחות בקוד, SPNs לא רשומים, workgroups ונתיבים שאינם מגיעים ל-DC. השאלה אם אפשר להפיק SPN משם היעד היא החשובה מכולן (סעיף 6).56
בעיות שמתעוררות אחרי ש-Kerberos נבחר, כמו הפרש שעון, הן עניין אחר: האימות עצמו נעצר. אל תניחו שכשל מנוסה תמיד שוב עם NTLM (סעיף 6.5).7
לתפוס את המדיניות של אבטחה והגירה
גם עם NTLMv2 נשארות מתקפת relay ו-Pass-the-Hash. ה-relay נובע מכך שחילוף האימות אינו כובל יעד; Pass-the-Hash נובע מכך שה-hash עצמו הוא חומר האימות. סעיף 7 מכסה את התנאים שבהם כל אחד מהם עובד, כולל השאלה אם היעד דורש SMB signing או channel binding.81
NTLMv1 כבר הוסר ב-Windows 11 גרסה 24H2 וב-Windows Server 2025. NTLMv2 עדיין עובד, אבל הוא deprecated (סעיף 8).9 אפליקציות לא אמורות לקרוא ל-NTLM ישירות: הן צריכות להשתמש ב-Negotiate, שמעדיף Kerberos, ואחר כך לסדר את השמות, ה-SPN ואת נתיבי הרשת שמאפשרים ל-Kerberos לעבוד.1
לקרוא לפי מטרה או לפי סימפטום
| מה רוצים לדעת, או מה שנתקע | איפה לקרוא קודם | מה לתפוס |
|---|---|---|
| רוצים לדעת איך NTLM ו-Kerberos שונים | סעיף 2: NTLM, סעיף 4: Kerberos, סעיף 5: טבלת ההשוואה | להפריד בין response מבוסס hash לבין כרטיס שנושא את שם היעד |
| אפליקציה שתומכת ב-Kerberos בכל זאת עובדת על NTLM | סעיף 6: התנאים לנפילה | להסתכל על שם היעד, ה-SPN, החשבון והנתיב ל-KDC |
| האימות עצמו נכשל בשגיאה | סעיף 6.5: איך זה שונה מכשל | לא להתבלבל עם מעבר ל-NTLM; לבדוק הפרש שעון ודברים דומים |
| רוצים לחקור NTLM שלא מופיע ביומנים של ה-DC | סעיף 2.3: חשבונות מקומיים | אימות עם חשבון מקומי מסתיים אצל השרת עצמו |
| רוצים לדעת אם NTLMv2 עדיין מסוכן | סעיף 7: relay ו-Pass-the-Hash, סעיף 8: deprecation ו-removal | להפריד בין התנאים שבהם התקיפות עובדות לבין היחס לכל גרסה |
| רוצים לדעת איך להגר אפליקציות והתקנים | סעיף 9: לאן זה הולך והמאמר המעשי הנלווה | למיין תלויות בין מה שהתכונות החדשות אולי יכסו לבין מה שחייבים לתקן בעצמכם |
המאמר הזה מסביר את המנגנונים ואת ההחלטות. לנוהל של הגדרת audit והרצת inventory, עברו למאמר המעשי הנלווה שמוצג למעלה.
ב-diagram, solid line מציינת relation שתמיד מתקיים ו-dashed line מציינת relation מותנה (התנאים מופיעים בהסבר של כל relation ב-detail page). הרשימה המלאה של ה-relations (סה”כ 35, כולל evidence ו-certainty) וההגדרות של ה-concepts המרכזיים נמצאות ב-detail page של ה-knowledge map (ביפנית). Data: JSON-LD / Turtle
2. מה NTLM בעצם עושה
הסעיף הזה מתחיל בהפרדה בין הצד שבונה את ה-response לבין הצד שמאמת אותו. אחרי שנסתכל על חילופי הדברים בין שלושה צדדים בחשבון domain, נבדוק מה NTLMv2 באמת מחשב ואיך חשבון מקומי שונה.
NTLM (Windows Challenge/Response) הוא, כפי ששמו אומר, פרוטוקול אימות מבוסס challenge/response. סיכום התיאור של Microsoft: ה-credentials מורכבים משם domain, שם משתמש ו-hash חד-כיווני של הסיסמה שהתקבל ב-logon אינטראקטיבי (רק הסיסמה עוברת hash), וכדי לאמת בלי לשלוח את הסיסמה ברשת, הצד שמבקש אימות מבצע חישוב שמוכיח שהוא “יכול לגשת ל-credentials של NTLM המאוחסנים באופן מאובטח”.1
הנקודה החשובה כאן היא שחומר האימות אינו הסיסמה עצמה אלא ה-hash שלה. העובדה הזאת לבדה היא מה שמאפשר Pass-the-Hash, כפי שנראה בהמשך.
2.1. בחשבון domain משתתפים שלושה צדדים
נסתכל על משתמש שכבר מחובר וניגש למשאב בשרת עם חשבון domain. זהו אימות לא אינטראקטיבי, ומשתתפים בו שלושת הצדדים האלה.1
| צד | על מה הוא אחראי |
|---|---|
| לקוח | בונה את ה-response בעזרת ה-hash של הסיסמה |
| שרת המשאב | מנפיק את ה-challenge ומבקש מה-DC לאמת את ה-response שהוא קיבל |
| Domain controller (DC) | מחשב עם ה-hash ממסד החשבונות ומשווה אותו ל-response |
נקודת המפתח היא ששרת המשאב אינו מאמת בעצמו את ה-response של משתמש domain: הוא מבקש מה-DC לעשות את החישוב.
איור 1 ושבעת השלבים שלאחריו הם הנוהל המושגי שמופיע בעמוד ה-overview של Microsoft. החישוב המדויק של ה-response ב-NTLMv2 נמצא בסעיף 2.2. קראו את איור 1 בשביל “מי מבקש ממי לאמת” ואת איור 2 בשביל “איך זה מחושב”, וכך השניים לא יתערבבו.1
sequenceDiagram
autonumber
participant C as Client
participant S as Server
participant DC as Domain controller
Note over C: ב-logon מחשב hash של<br/>הסיסמה וזורק את הסיסמה עצמה
C->>S: שם משתמש (בטקסט גלוי)
S->>C: מספר אקראי של 8 בתים (challenge)
Note over C: מצפין את ה-challenge<br/>עם ה-hash של הסיסמה
C->>S: Response
S->>DC: שם משתמש / challenge / response
Note over DC: שולף את ה-hash מה-SAM<br/>ומבצע את אותו חישוב
DC-->>S: האימות מצליח אם הם זהים
S-->>C: מעניק גישה
איור 1: אימות NTLM לא אינטראקטיבי (עם חשבון domain)
אם קוראים את איור 1 כנוהל, הוא הופך לשבעת השלבים האלה. החישוב של ה-response ב-NTLMv2 עצמו מוצג שוב בסעיף 2.2 שלהלן.
- (רק באימות אינטראקטיבי) המשתמש מזין שם domain, שם משתמש וסיסמה. הלקוח מחשב hash קריפטוגרפי של הסיסמה וזורק את הסיסמה עצמה.
- הלקוח שולח לשרת את שם המשתמש בטקסט גלוי.
- השרת מייצר מספר אקראי של 8 בתים (ה-challenge, nonce) ושולח אותו ללקוח.
- הלקוח מצפין את ה-challenge הזה עם ה-hash של סיסמת המשתמש ומחזיר את התוצאה (ה-response).
- השרת שולח שלושה דברים ל-domain controller: את שם המשתמש, את ה-challenge ששלח ללקוח, ואת ה-response שקיבל.
- ה-domain controller משתמש בשם המשתמש כדי לשלוף את ה-hash של הסיסמה ממסד הנתונים SAM ומצפין איתו את ה-challenge.
- הוא משווה את התוצאה שחישב ל-response של הלקוח; אם הם זהים, האימות מצליח.
2.2. החישוב בפועל — NTLMv2 קצת יותר מורכב
שבעת השלבים למעלה הם הצורה הבסיסית שמתוארת בעמוד ה-overview של Microsoft. NTLMv2, שבו Windows של ימינו באמת משתמש, הולך צעד אחד מעבר ל”הצפנת ה-challenge עם ה-hash של הסיסמה”. ה-spec ([MS-NLMP]) מגדיר אותו כך.2
לגזור response key ואז לחשב HMAC על ה-challenge ועוד
- ה-response key הוא
NTOWFv2 = HMAC_MD5( MD4(UNICODE(password)), uppercased user name + domain name ) - הלקוח בונה
temp, שרשור של גרסת ה-response, חתימת זמן, challenge של 8 בתים שנוצר בצד הלקוח, ומידע על היעד (AV pairs) - הליבה של ה-response היא
NTProofStr = HMAC_MD5( response key, server challenge + temp )
אם מצמצמים את זה לקלט ולזרימת העיבוד בלבד, זה נכנס לעמוד אחד.
flowchart TD
PW["Password"] --> MD4["MD4(UNICODE(password))<br/>= NT hash"]
UD["שם משתמש באותיות גדולות<br/>+ שם domain"] --> H1["HMAC_MD5"]
MD4 -->|"used as the key"| H1
H1 --> KEY["Response key NTOWFv2"]
MAT["גרסת ה-response / חתימת זמן /<br/>challenge של 8 בתים מצד הלקוח /<br/>מידע על היעד (AV pairs)"] --> TEMP["temp"]
SC["Server challenge"] --> H2["HMAC_MD5"]
TEMP --> H2
KEY -->|"used as the key"| H2
H2 --> PROOF["NTProofStr"]
PROOF --> RESP["NtChallengeResponse<br/>= NTProofStr + temp"]
TEMP --> RESP
איור 2: איך נוצר response של NTLMv2 (סיסמה → NT hash → response key → HMAC)
אז מה שמחושב בפועל הוא HMAC שמערבב לא רק את ה-challenge של השרת אלא גם מספר אקראי מצד הלקוח, חתימת זמן ומידע על היעד. הצד המאמת משחזר את אותו חישוב. אם החשבון נמצא ב-Active Directory, צמד ה-challenge/response נשלח ל-domain controller לאימות; אם החשבון מקומי בשרת, השרת מחשב את הערך המצופה מה-OWF שהוא עצמו מאחסן.2
שני דברים שלא משתנים, כמה שהחישוב נעשה מורכב
מה שחשוב לטיעון של המאמר הזה הוא ששני הדברים הבאים לא משתנים בגלל המורכבות שנוספה.
- החומר של המפתח הוא עדיין ה-hash של הסיסמה. נקודת המוצא של
NTOWFv2היאMD4(UNICODE(password)), שהוא ה-NT hash עצמו.2 זו הסיבה ש-Pass-the-Hash עובד (סעיף 7.2). - הלקוח לא מאמת שהשרת אמיתי. הקביעה של Microsoft של-NTLM אין mutual authentication נכונה גם ל-NTLMv2.4
כל מה שבא בהמשך נשען על שתי הנקודות האלה.
2.3. בחשבון מקומי שני צדדים מספיקים
בחשבון מקומי, הצד הימני של איור 1 — ה-domain controller — נעלם.
שרת משאב פונה לשירות האימות ב-domain controller של אותו domain כשהחשבון הוא חשבון domain, אבל הוא מתייעץ עם מסד החשבונות המקומי כשהחשבון מקומי.10
לכן במחשב ב-workgroup, או כשניגשים ל-share עם חשבון מקומי בשרת קבצים, שום domain controller לא מופיע: זהו חילוף בין שני צדדים, שבו השרת מסתכל על ה-SAM שלו ומחליט בעצמו.
ההבדל הזה זורם ישירות ל-inventory של תלויות מסוג “אי אפשר להשתמש ב-Kerberos כי זה חשבון מקומי” שמכוסה בסעיף 6.3. NTLM שנוקט בנתיב הזה לא מופיע ב-audit logs של domain controller.
2.4. שלוש תוצאות של התכנון הזה
אפשר להסיק מחילופי הדברים שתוארו עד כאן שלוש תכונות שמובילות לכשלים ולתקיפות בהמשך.
| תכונה | למה היא מובילה בהמשך |
|---|---|
| אין שלב שבו השרת מוכיח ללקוח שהוא אמיתי | ההבדל ב-mutual authentication (סעיף 5), והתנאים שבהם מתקפת relay עובדת (סעיף 7.1) |
| האימות דורש את ה-hash של החשבון | פונים ל-DC בחשבון domain, או למסד החשבונות של השרת עצמו בחשבון מקומי (סעיף 3) |
| ה-response קשור ל-challenge הזה אבל לא ליעד | ניגון חוזר של response ישן והעברת חילוף חי הם שני דברים שונים (סעיף 7.1) |
הפנייה בשורה השנייה נדרשת בכל פעם ששרת המשאב צריך access token חדש. בחשבון domain הוא בודק את שירות האימות ב-DC; בחשבון מקומי הוא בודק את מסד החשבונות המקומי.10
כמו כן, מכיוון שה-challenge משתנה בכל פעם, אי אפשר פשוט להשתמש שוב באותו response. אבל זה לבדו לא מונע העברה של ה-challenge וה-response של חילוף חי לשרת אחר. סעיף 7 עוסק בהבדל הזה.
3. למה השרת שואל domain controller
NTLM מבקש אימות ממי שמחזיק ב-hash
ה-hash של סיסמת משתמש domain נמצא במסד החשבונות ב-DC. שרת המשאב לא מכיר את ה-hash של אותו משתמש, ולכן אינו יכול לאמת בעצמו את ה-response שקיבל.
Pass-through authentication הוא אפוא מסירת שם המשתמש, ה-challenge וה-response ל-DC ובקשה שיחליט. חלוקת העבודה הזאת היא הסיבה שאימות NTLM עם חשבון domain דורש פנייה ל-DC.101
בחשבון מקומי, ה-hash נבדק מול ה-SAM של השרת עצמו. הקביעה “NTLM שואל את ה-DC” נכונה רק לחשבונות domain.
Kerberos מחליף את הפנייה בכרטיס
Kerberos מחליף את ה-pass-through authentication הזה בכרטיסי session שמתחדשים. Microsoft מסבירה שב-NTLM שרת אפליקציה היה חייב להתחבר ל-DC בכל פעם שאימת, ואילו ב-Kerberos הפנייה הזאת נעשית מיותרת.4
עם זאת יש חריג: כשנדרש אימות של ה-PAC (privilege attribute certificate). זה לא אומר שב-Kerberos אין בכלל תעבורה מהשרת ל-DC.
המעבר ל-Kerberos נושא אפוא גם תועלת תפעולית — הפחתת התלות ב-DC בכל אימות — מעבר לשיפור האבטחה שבאפשרות לאמת את הצד שמולכם. הסעיף הבא בודק איך כרטיס ממלא את התפקיד הזה.
4. מה Kerberos בעצם עושה
היכן של-NTLM יש response שמאומת בכל אימות, Kerberos מוכיח את הזהות מראש, מקבל כרטיס, ומשתמש בכרטיס הזה לאימות הבא. איור 3 מציג את כל הזרימה, מהוכחת הזהות הראשונית ועד ההתחברות לשירות.
ה-KDC (Key Distribution Center) פועל על domain controller ומשתמש במסד הנתונים של Active Directory Domain Services כמסד החשבונות האבטחתי שלו.4
לפני קריאת הדיאגרמה: להפריד בין שמות לכרטיסים
| מונח | התפקיד שלו בסעיף הזה |
|---|---|
| KDC (Key Distribution Center) | פועל על domain controller, מוכיח זהות ומנפיק כרטיסים |
| SPN (service principal name) | השם שמזהה את השירות שאליו הלקוח רוצה להתחבר |
| TGT (ticket-granting ticket) | הכרטיס שמוצג ל-KDC כשמבקשים service ticket |
| Service ticket | הכרטיס שמוצג לשירות היעד, ושהונפק עבור אותו יעד |
לאיור 3 יש שלושה שלבים: להוכיח זהות ולקבל TGT → לציין SPN ולקבל service ticket → להציג אותו לשירות. המפתח הוא לא לקרוא את ה-TGT ואת ה-service ticket כאותו דבר.
sequenceDiagram
autonumber
participant C as Client
participant KDC as KDC (domain controller)
participant S as שירות (מזוהה לפי SPN)
Note over C,KDC: חילוף AS — הוכחת זהות וקבלת TGT
C->>KDC: KRB_AS_REQ<br/>(שם משתמש + חתימת זמן מוצפנת עם המפתח ארוך הטווח)
Note over KDC: אמיתי אם זה מפוענח עם המפתח ארוך הטווח
KDC-->>C: KRB_AS_REP<br/>TGT (מוצפן עם מפתח krbtgt) + session key
Note over C,KDC: חילוף TGS — קבלת service ticket
C->>KDC: KRB_TGS_REQ<br/>(TGT + SPN של היעד + authenticator)
Note over KDC: מאתר את חשבון השירות לפי ה-SPN<br/>ומצפין את הכרטיס עם המפתח ארוך הטווח שלו
KDC-->>C: KRB_TGS_REP<br/>Service ticket + session key
Note over C,S: חילוף AP — הצגה לשירות
C->>S: KRB_AP_REQ<br/>(service ticket + authenticator)
Note over S: ניתן לפענוח עם המפתח ארוך הטווח שלו<br/>= הכרטיס מיועד אליו
S-->>C: KRB_AP_REP (כשנתבקש mutual authentication)
איור 3: שלושת חילופי Kerberos (AS / TGS / AP)
מקרא — AS = Authentication Service, TGS = Ticket Granting Service, AP = Application. בשמות ההודעות, _REQ הוא בקשה ו-_REP הוא תשובה. לדוגמה, KRB_TGS_REQ פירושו “בקשה ל-Ticket Granting Service”.
4.1. חילוף AS — הוכחת זהות פעם אחת
מה נשלח: חתימת זמן מוצפנת עם המפתח ארוך הטווח
הלקוח שולח ל-KDC את שם המשתמש ושם ה-domain שלו יחד עם חתימת זמן מוצפנת עם המפתח ארוך הטווח שלו, המפתח שנגזר מהסיסמה. זהו pre-authentication. אם ה-KDC מצליח לפענח אותה עם המפתח ארוך הטווח הזה וחתימת הזמן תקפה, הוא מסיק שזהו המשתמש האמיתי.3
מה מתקבל: TGT ו-session key
ה-KDC מחזיר שני דברים עם תפקידים שונים. שניהם “דברים שהלקוח מקבל”, אבל הם שונים בשאלה אם הלקוח יכול לקרוא את מה שבתוכם.3
| מה מתקבל | איזה מפתח מצפין אותו | איך הלקוח מתייחס אליו |
|---|---|---|
| TGT (ticket-granting ticket) | המפתח ארוך הטווח של ה-KDC עצמו (המפתח של חשבון krbtgt) | אי אפשר לקרוא את התוכן. הוא מוצג ל-KDC בחילוף ה-TGS הבא |
| ה-session key שמשמש בין הלקוח ל-KDC | המפתח ארוך הטווח של הלקוח | הוא מפוענח ומשמש לחילוף עם ה-KDC |
להחזיק TGT ולהיות מסוגל לקרוא את מה שבתוכו הם שני דברים שונים. ההבחנה הזאת מובילה לשלב הבא, “לשלוח את הבקשה עם ה-TGT וה-authenticator”.
אם השעונים סוטים, Kerberos עצמו נכשל
הנקודה שצריך לתפוס כאן היא שחתימת הזמן היא חלק מהאימות. זו הסיבה ש-Kerberos מקפיד על סנכרון שעון: הפרש הזמן המותר הוא חמש דקות כברירת מחדל.7 מחוץ לחלון הזה ה-pre-authentication לא עובר, ואימות Kerberos עצמו נכשל בשגיאה (סנכרון זמן ב-Windows מכוסה ב”מדריך לסנכרון זמן ב-Windows (w32time)”). “Kerberos נכשל” ו”נופל ל-NTLM” הם שני דברים שונים. סעיף 6.5 מכסה את ההבחנה.
4.2. חילוף TGS — להצהיר לאיזה שירות מתחברים
ברגע שללקוח יש TGT, הוא מבקש כרטיס לשירות היעד. רק בנקודה הזאת השם שאומר לאיזה שירות אתם מתחברים, ה-SPN, עולה למרכז הבמה.3
הלקוח שולח ל-KDC את ה-SPN של היעד, את ה-TGT ואת ה-authenticator. ה-KDC מאתר את חשבון השירות שמתאים ל-SPN, מצפין service ticket עם המפתח ארוך הטווח של אותו חשבון ומחזיר אותו.3
קריאה של הזרימה הזאת בכיוון ההפוך חושפת את הבעיות שמכוסות בסעיף 6.
- אם אי אפשר להפיק את ה-SPN, אי אפשר להנפיק כרטיס. אם לא רשום SPN על חשבון השירות, ה-KDC לא יכול לקבוע באיזה מפתח להשתמש. גם התחברות לפי כתובת IP היא תנאי שבו Kerberos לא מנוסה כברירת מחדל (סעיף 6.1).
- כרטיס נוצר עבור היעד שלו. מכיוון שהוא מוצפן עם המפתח ארוך הטווח של אותו שירות, שירות שמחזיק מפתח ארוך טווח אחר לא יכול לפענח אותו. זו הסיבה שאי אפשר להשתמש שוב בכרטיס מול יעד אחר.
4.3. חילוף AP — הצגה לשירות ו-mutual authentication
החילוף האחרון הוא עם שירות היעד ולא עם ה-KDC. גם כאן, קראו בנפרד את הבדיקה בצד השירות ואת הבדיקה בצד הלקוח.
בצד השירות: לפתוח כרטיס שמיועד אליו
הלקוח מציג את ה-service ticket ואת ה-authenticator. השירות מפענח את הכרטיס עם המפתח ארוך הטווח שלו ומחלץ ממנו את ה-session key ואת נתוני ההרשאה. היכולת לפענח אותו עם המפתח שלו היא מה שמאשר שהכרטיס מיועד אליו.3
בצד הלקוח: לאמת את הצד שמולך כשנתבקש mutual authentication
אם הלקוח ביקש mutual authentication, השירות מצפין את חתימת הזמן שקיבל עם ה-session key ומחזיר אותה. הלקוח מאמת את התשובה הזאת ומאשר שהצד שמולו הוא השירות האמיתי.3
לא רק שהשירות מאמת את הלקוח — הלקוח יכול גם לאמת את השירות. זהו ה-mutual authentication שחסר ל-NTLM.
5. ההבדלים המכריעים
הסעיף הזה משווה את המנגנונים של סעיפים 2 עד 4 מהזוויות שחשובות לתפעול ולתכנון. הפנייה ל-DC שונה בין חשבון domain לחשבון מקומי, ול-Kerberos יש חריג משלו באימות PAC. קראו את התנאים יחד עם השורות.
| היבט | NTLM | Kerberos |
|---|---|---|
| אימות הצד שמולך | לקוח לא יכול לאמת שרת, ושרת אחד לא יכול לאמת שרת אחר. התכנון מניח שהשרתים אמיתיים4 | כל אחד משני הקצוות של חיבור יכול לאמת שהצד שמולו הוא מי שהוא מצהיר4 |
| פנייה ל-DC בכל אימות | נדרשת בחשבון domain. שרת המשאב פונה ל-DC בכל פעם שהוא צריך access token חדש (בחשבון מקומי הוא מתייעץ עם מסד החשבונות שלו)10 | לא נדרשת, אלא כשצריך אימות PAC. כרטיסי session שמתחדשים תופסים את מקומה4 |
| כבילה ליעד | אין. response לא מוכיח עבור מי הוא נוצר | יש. service ticket מוצפן עם המפתח ארוך הטווח של שירות היעד3 |
| Delegation | מספק רק את נתוני ההרשאה שדרושים כדי להתחזות ללקוח באופן מקומי4 | תומך ב-delegation, שבו שירות מתחבר לשירות אחר בשם הלקוח4 |
| סנכרון שעון | לא תלוי בו | תלוי בו (חמש דקות סבילות כברירת מחדל)7 |
| Name resolution | אדיש לשם של הצד שמולך (עובד עם כתובת IP) | דורש שאפשר יהיה להפיק SPN3 |
| שימוש מחוץ ל-domain | עדיין נדרש ב-workgroup וב-logon מקומי10 | דורש Active Directory4 |
לתכנון שמשתמש ב-delegation יש עוד בחירה של סוג
Delegation הוא המנגנון שבו, למשל, אפליקציית web front-end מתחברת ל-SQL Server ב-back-end בשם המשתמש. התחזות למשתמש בתוך שרת אחד והעברת זהות המשתמש הלאה לשירות אחר הם שני דברים נפרדים.4
Kerberos delegation מגיע ב-unconstrained delegation, בconstrained delegation ובresource-based constrained delegation (RBCD). ההחלטה “להשתמש ב-Kerberos” אינה סוף הסיפור; איזה סוג delegation להשתמש בו הוא שאלת תכנון בפני עצמה.
המאמר הזה לא נכנס להגדרה של כל סוג. שמרו את שלושת השמות האלה כמונחי החיפוש הבאים שלכם כשאתם חוקרים הגדרה שדורשת delegation.
תנאי השם וה-domain מובילים לחקירה הבאה
שתי השורות התחתונות בטבלה הזאת הן בדיוק הסיבות לכך שהאימות נופל ל-NTLM. החוזקות של Kerberos — כבילה ליעד ואימות הצד שמולך — נשענות על כך שהשמות נפתרים נכון.
6. למה האימות “נופל” ל-NTLM
הסעיף הזה חוקר למה “המערכת העסקית עובדת, אבל האימות הוא על NTLM”. בדקו את שם היעד, את רישום ה-SPN, את החשבון ואת הנתיב ל-KDC, בסדר הזה. אם האימות עצמו נכשל בשגיאה, בדקו קודם את סעיף 6.5 כדי לראות אם צריך קו חקירה אחר.
משתמשים ב-NTLM גם כשהאפליקציה לא קוראת ל-NTLM ישירות, כי כך מתנהג Negotiate. Microsoft מתארת את Negotiate כמי שבוחר בין Kerberos ל-NTLM, ובוחר ב-Kerberos אלא אם אחת המערכות שמעורבות באימות לא יכולה להשתמש בו.1
לכן גם כשמשתמשים ב-Negotiate, NTLM נבחר אם לא כל התנאים ל-Kerberos מתקיימים. אפליקציה שתומכת ב-Kerberos וכך ש-Kerberos באמת נמצא בשימוש בחיבור נתון הם שני דברים שונים.
הדיאגרמה והטבלה שלהלן מציגות את ההסתעפויות האופייניות בהגדרה שבה NTLM זמין. הן לא אומרות שהאימות תמיד מצליח במקום שבו NTLM עצמו מוגבל. חקרו קודם את הסיבה למעבר, ואחר כך בדקו את ההגבלות על שיטות האימות יחד עם סעיפים 8 ו-9.
flowchart TD
START["האימות מתחיל עם Negotiate"]
Q1{"חשבון<br/>domain?"}
Q2{"אפשר לבנות SPN<br/>משם היעד?"}
Q3{"ה-SPN הזה<br/>רשום?"}
Q4{"ה-KDC<br/>נגיש?"}
KRB["לאמת עם Kerberos"]
NTLM["ליפול ל-NTLM"]
START --> Q1
Q1 -->|"לא<br/>(workgroup / חשבון מקומי)"| NTLM
Q1 -->|כן| Q2
Q2 -->|"לא<br/>(כתובת IP מוקשחת בקוד)"| NTLM
Q2 -->|כן| Q3
Q3 -->|"לא<br/>(SPN לא רשום / גישה דרך alias)"| NTLM
Q3 -->|כן| Q4
Q4 -->|"לא<br/>(אתר סניף / VPN / firewall)"| NTLM
Q4 -->|כן| KRB
איור 4: ההסתעפויות שבהן Negotiate נופל ל-NTLM
ארבעת הגורמים העיקריים מוצגים תחילה בשלוש עמודות: התנאי, למה הוא גורם לנפילה, ואיך לתקן. הפרטים בהמשך, מסעיף 6.1 ואילך.
| תנאי שגורם לנפילה | למה נופל | איך לתקן |
|---|---|---|
| היעד מצוין בכתובת IP (סעיף 6.1) | כברירת מחדל, Windows לא מנסה אימות Kerberos כששם המארח הוא כתובת IP11 | לשנות את הגדרת היעד ל-FQDN. רק אצל הצדדים שבהם זה באמת בלתי אפשרי, להגדיר TryIPSPN ל-1 בלקוח ולרשום ידנית SPN לכתובת ה-IP (מוצא אחרון)11 |
| לא רשום SPN, או שהגישה משתמשת ב-DNS alias (סעיף 6.2) | ה-KDC לא יכול לאתר את חשבון השירות לפי ה-SPN, ולכן לא יכול להצפין כרטיס עם המפתח ארוך הטווח של אותו חשבון3 | לרשום SPN עבור סוג השירות המבוקש תחת השם שבאמת משמש לגישה. אם משתמשים ב-CNAME, נדרש גם SPN לשם הזה5 |
| גישה ממחשב ב-workgroup או עם חשבון מקומי (סעיף 6.3) | זה מחוץ ל-Active Directory, ולכן אין KDC מלכתחילה10 | להצטרף ל-domain, או לעבור לגישה עם חשבון domain. ה-local KDC בשלב 2 ממלא את הפער הזה רק בין גרסאות Windows שתומכות בו6 |
| אי אפשר להגיע ל-domain controller (סעיף 6.4) | הלקוח לא יכול לדבר עם ה-KDC, ולכן לא יכול לקבל כרטיס6 | לבדוק את ה-routing ואת ה-firewalls כך שהתעבורה ש-Kerberos צריך תגיע ל-KDC |
6.1. החיבור משתמש בכתובת IP
התנהגות ברירת המחדל: לא מנסים Kerberos עם כתובת IP
זו הסיבה הנפוצה ביותר. Microsoft מציינת במפורש שכברירת מחדל, כששם המארח הוא כתובת IP, Windows לא מנסה אימות Kerberos מול אותו מארח ונופל לפרוטוקול אימות תקף אחר, כמו NTLM.11 גם הנחיות ה-audit אומרות אותו דבר מצדן: Kerberos לא נכנס לשימוש אם “Target Server” באירוע 8001 אינו בצורת NetBIOS ואינו בצורת FQDN.5
הסיבה לכך מופיעה גם היא: אפליקציות שמשתמשות בכתובת IP ולא בשם DNS בגלל הגדרה שגויה או תיעוד של הספק.5 בפועל נפוץ מאוד למצוא הגדרה שמישהו שינה לכתובת IP לפני שנים “כי ה-name resolution לא היה אמין”, ומאז היא נשארה כך.
החריג: להגדיר TryIPSPN ואת ה-SPN שבאמת מתבקש
לא לנסות Kerberos עם כתובת IP הוא התנהגות ברירת מחדל, לא מגבלה מוחלטת. מ-Windows 10 גרסה 1507 ומ-Windows Server 2016 ואילך יש מנגנון שמאפשר כתובת IP כשם מארח ב-SPN.11
שני הדברים הבאים נדרשים כאחד.
- להגדיר את ערך הרישיות
TryIPSPNל-1 בלקוח. - לרשום ידנית SPN שמשתמש בכתובת ה-IP, בצורה
Setspn -s <service class>/<IP address> <account>.
ה-SPN שאתם רושמים חייב להתאים לסוג השירות שהלקוח באמת מבקש. גם לאותה כתובת IP של יעד, השם הנדרש שונה משירות לשירות.
| דוגמה ליעד | דוגמה ל-SPN ונקודות לתשומת לב |
|---|---|
שירותים שממופים ל-HOST, כמו share של קבצים |
host/192.168.1.1 מספיק |
| Web | HTTP/192.168.1.1 |
| SQL Server | לכלול את הפורט, כמו MSSQLSvc/192.168.1.1:1433 |
רישום של host/ בלבד לא יגרום ל-Kerberos לעבוד אם הוא לא מתאים ל-SPN שמתבקש. Microsoft מציגה את התכונה הזאת כדרך לצמצם את השפעת התאימות של השבתת NTLM.11
לתקן ל-FQDN קודם, ולשמור את החריג כמוצא אחרון
עם זאת, זו אינה הבחירה הראשונה. Microsoft עצמה אומרת שכתובות IP הן זמניות ועלולות לגרום להתנגשויות ולכשלי אימות כשהחכירות מסתיימות ומתחדשות, ולכן בדרך כלל לא משתמשים בהן במקום שמות מארח, ושהרישום SPN לפי כתובת IP הוא עבודה ידנית שצריך להשתמש בה רק כשאי אפשר לעבור לשם מארח מבוסס DNS.11 לכל כתובת IP מוקשחת ש-audit מעלה, חשבו קודם לשנות אותה ל-FQDN. TryIPSPN הוא מוצא אחרון לצדדים שבהם זה באמת לא אפשרי.
6.2. לא רשום SPN
הדבר הבא לבדוק הוא אם השם שבאמת משמש לגישה רשום כ-SPN. Microsoft מפרטת אפליקציות שה-SPN שלהן לא הוגדר נכון כקטגוריה של אפליקציות שמשתמשות ב-NTLM למרות שהן תומכות ב-Kerberos.5
בחילוף ה-TGS באיור 3, ה-KDC מאתר את חשבון השירות לפי ה-SPN ומצפין את הכרטיס עם המפתח ארוך הטווח שלו. בלי SPN, אי אפשר לזהות את “המפתח של השירות הזה”.
אותו דבר קורה כשהחיבור משתמש ב-DNS alias (CNAME) או בשם מארח מותאם, ולא רשום SPN לשם הזה. היכולת להגיע לשרת לפי שם והיכולת לקבל כרטיס Kerberos לאותו שם הם שני דברים שונים.
מה שצריך לבדוק הוא השם שכתוב בהגדרת החיבור של האפליקציה, וה-SPN עבור סוג השירות שמתבקש מול אותו שם. האפליקציה יכולה לעבוד מצוין, בעוד שרק השם שהיא משתמשת בו חסר ברישום.
6.3. אתם מחוץ ל-Active Directory מלכתחילה
למצוא את הנתיבים שבאמת צריכים NTLM היום
מחשבים ב-workgroup, וגישת share עם חשבון מקומי, אינם על מגרש המשחקים של Kerberos בכלל. Microsoft אומרת שב-NTLM משתמשים, וחייבים להשתמש, לאימות Windows במערכות שמוגדרות כחברות ב-workgroup ולאימות logon מקומי במחשבים שאינם domain controllers.10
להפריד בין מה שה-local KDC יכסה לבין מה שלא
זו הסיבה שאי אפשר פשוט לאסור את NTLM. ה-local KDC המתוכנן לשלב 2 הוא בדיוק התכונה שנועדה למלא את הפער הזה.6
עם זאת, הניחו שהוא ממלא את הפער רק בין גרסאות Windows שתומכות בו. אימות עם חשבון מקומי מול Windows ישן יותר, או מול התקני צד שלישי כמו מכשירי NAS ומדפסות משולבות, לא יהפוך אוטומטית ל-Kerberos כשהש-local KDC יגיע. סעיפים 5 ו-6 במאמר המעשי הנלווה מכסים את המיון הזה.
6.4. אי אפשר להגיע ל-KDC
אתר סניף או VPN שמהם אי אפשר להגיע ל-DC, או firewall שחוסם את התעבורה ש-Kerberos צריך, הם גם סיבה למעבר ל-NTLM.6 הסיבה היא שכשאי אפשר לקבל מה-KDC את הכרטיס הנדרש, אי אפשר להניח את התשתית לשימוש ב-Kerberos.
כאן, פִתחו את “האם אפשר להגיע ל-DC” לפי מי שמייצר את התעבורה.
| שיטת אימות | הנתיב שנדרש כאן | למה הנתיב חשוב |
|---|---|---|
| Kerberos | לקוח → KDC | כדי לקבל TGT ו-service tickets |
| NTLM עם חשבון domain | שרת המשאב → DC | כדי לבקש אימות של ה-response שהתקבל |
“הלקוח לא יכול להגיע ל-KDC” ו”ל-NTLM לא צריך DC” הם לא אותו משפט. כפי שסעיף 3 הראה, NTLM עם חשבון domain דורש פנייה מהשרת ל-DC.10 גם כשנבחר NTLM, האימות לא יכול להסתיים אם גם נתיב האימות הזה אבד.
6.5. לא להתבלבל בין כשל של Kerberos לבין נפילה ל-NTLM
Kerberos שלא התחיל בכלל, לעומת Kerberos שנכשל אחרי שנבחר
לסיום, נפריד משהו שקל להתבלבל בו אבל הוא שונה באמת. סעיפים 6.1 עד 6.4 הם כולם מקרים שבהם אי אפשר היה להתחיל את Kerberos. מכיוון שאי אפשר להתחיל אותו, Negotiate בוחר ב-NTLM.
בעיות שבהן Kerberos נכשל אחרי שנבחר נחקרות בנפרד. הדוגמה הקלאסית היא הפרש השעון שהוזכר בסעיף 4.1.
אם ה-SPN נפתר וה-KDC נגיש, Negotiate בוחר תחילה ב-Kerberos. אבל אם הפרש הזמן עולה על הסבילות, חמש דקות כברירת מחדל, ה-pre-authentication לא עובר וזה נכשל כשגיאת Kerberos.7
“לבחור ב-NTLM כי Kerberos לא זמין” ו”לנסות שוב עם NTLM כי ה-Kerberos שנבחר נכשל” הם לא אותו דבר. Negotiate לא בהכרח הולך עד לשם, ומקרה שבו האפליקציה מנסה שוב במפורש עם שיטה אחרת צריך להיבחן בנפרד.
להפריד את הסימפטומים לפני שבוחרים יומנים ופקודות
המשמעות המעשית פשוטה. לא תמצאו כשל של הפרש שעון בחיפוש אחרי אירוע 8001. גם הסימפטומים שונים.
| סימפטום | מה לחשוד | איפה להסתכל |
|---|---|---|
| זה עובד, אבל האימות הוא על NTLM | סעיפים 6.1 עד 6.4 (Kerberos לא התחיל) | אירוע 8001 ב-NTLM/Operational |
| האימות עצמו נכשל בשגיאה | הפרש שעון, רישום SPN כפול, אי-התאמה ב-encryption type וכדומה | אירועי Kerberos ב-System log, klist, w32tm /query /status |
הפרידו בין “האם זה נפל ל-NTLM” לבין “האם Kerberos שבור” לפני שאתם חוקרים. הסימפטום “זה עובד, אבל על NTLM” שמתואר כאן מניח הגדרה שבה NTLM זמין. הגבלות על NTLM וחסימת NTLM נבדקות בנפרד, בסעיף 8 ובסעיף 9.
7. ההבדל מנקודת המבט של התוקף — relay ו-Pass-the-Hash
relay ו-Pass-the-Hash נדונים שניהם כבעיות של NTLM, אבל מה שכל אחד מהם משתמש בו שונה.
| תקיפה | במה התוקף משתמש | הבעיה שמאחוריה |
|---|---|---|
| Relay | חילוף challenge/response שמתרחש ממש עכשיו | אי אפשר לאמת את היעד של response, ולכן נשארים תנאים שמאפשרים relay |
| Pass-the-Hash | hash של סיסמה שנגנב ממחשב או ממקום אחר | אפשר להשתמש בו כחומר האימות בלי לפצח את הסיסמה בטקסט גלוי |
סעיף 7.1 בודק תחילה את התנאים שבהם relay עובר, ואחר כך סעיף 7.2 את הבעיה שמתעוררת כשגונבים hash.
Microsoft מציינת במפורש בתיעוד של הגדרת המדיניות שאימות NTLM ו-NTLMv2 פגיע למגוון תקיפות זדוניות, כולל SMB relay, מתקפות man-in-the-middle ומתקפות brute force.8 איור 1 מסביר למה.
7.1. מתקפות relay — התוצאה של אי-כבילה ליעד
sequenceDiagram
autonumber
participant V as המחשב של הקורבן
participant A as השרת של התוקף
participant T as השרת האמיתי
Note over V,A: הקורבן מנותב לשרת של התוקף
V->>A: מתחיל אימות (שם משתמש)
A->>T: מתחיל אימות כאותו משתמש
T-->>A: Challenge
A-->>V: מעביר את ה-challenge הזה כמו שהוא
Note over V: לא יכול לדעת אם זה בא<br/>מהשרת האמיתי
V->>A: Response (מחושב עם מפתח שנגזר מה-hash)
A->>T: מעביר את ה-response הזה כמו שהוא
Note over T: כשגם signing וגם channel<br/>binding אינם נדרשים
T-->>A: האימות מצליח → נוצר חיבור כקורבן
איור 5: איך עובד NTLM relay (מול צד שלא דורש signing ולא channel binding)
relay עובד בלי לגנוב סיסמה או hash
התוקף לא צריך לדעת לא את הסיסמה ולא את ה-hash. כל מה שהוא עושה הוא להעביר את ה-challenge ואת ה-response מצד אחד לשני. זה עובד כי ללקוח אין דרך לבדוק אם ה-response שלו באמת הולך לצד שהתכוון אליו.
אם זה עובד תלוי בהגנות של היעד
עם זאת, relay לא עובר לכל צד. האם חילוף שעבר relay הופך ל-session שמיש תלוי בהגנות של היעד.
- זה לא עובר לצד שדורש SMB signing. Microsoft מציינת שה-signature שמצורף לכל הודעת SMB מכיל hash של כל ההודעה ומאשר את הזהויות של השולח ושל המקבל, וכך מונע מתקפות relay.12 שימו לב ש-domain controllers דורשים SMB signing כברירת מחדל מכל מי שמתחבר אליהם.12
- זה גם לא עובר לשירות שאוכף Extended Protection for Authentication (channel binding). מכיוון שזה כובל את האימות לערוץ ה-TLS שמתחתיו, אימות שעבר relay לערוץ אחר לא עובר יותר.
איור 5 מניח צד שמקבל NTLM ולא דורש לא signing ולא channel binding. אל תקראו בו ש-relay הזה עובר ללא תנאי בכל חיבור שמשתמש ב-NTLM.
מה שצריך לבדוק כאן הוא לא רק אם תכונות ההגנה “נתמכות” אלא אם הן באמת נדרשות ונאכפות. לצד ה-inventory של NTLM, כדאי לבדוק אם ההגדרה דורשת SMB signing.
לשקול מעבר ל-Kerberos יחד עם ההגנות בצד SMB
ב-Kerberos, relay באותה צורה אינו אפשרי מלכתחילה. service ticket מוצפן עם המפתח ארוך הטווח של שירות היעד, ולכן העברה שלו לשירות אחר משאירה אותו בלתי ניתן לפענוח.3 מעבר לכך, mutual authentication מאפשר ללקוח לבדוק אם הצד שמולו אמיתי.4
זו בדיוק הסיבה ש-Microsoft סיפקה חסימת NTLM בצד לקוח SMB. המטרה המוצהרת היא למנוע טכניקות שגורמות לשליחת בקשות NTLM לשרת זדוני.13
בין ההמלצות שלה סביב SMB signing, Microsoft גם מפרטת להשתמש ב-Kerberos ולא ב-NTLMv2 כדי שה-session key יתחיל חזק, ולא להתחבר ל-shares לפי כתובת IP או רשומת CNAME, כי זה גורם לשימוש ב-NTLM במקום ב-Kerberos.12 זו אותה נקודה כמו סעיפים 6.1 ו-6.2.
7.2. Pass-the-Hash — ה-hash שקול לסיסמה
flowchart LR
P["Password"] -->|"hash חד-כיווני"| H["Password hash"]
H -->|"לגזור את ה-response key<br/>ולחשב HMAC"| R["Response"]
R --> AUTH["האימות מצליח"]
STEAL["ה-hash נגנב<br/>ממחשב"] --> H
NOTE["הסיסמה בטקסט גלוי<br/>אינה נדרשת"] -.-> STEAL
איור 6: מה שהאימות צריך הוא ה-hash, לא הסיסמה בטקסט גלוי
הבעיה היא שאפשר לבנות response מתוך ה-hash
החומר של ה-credentials של NTLM הוא hash חד-כיווני של הסיסמה.1 גם ב-NTLMv2 ה-response key נגזר כשמשתמשים ב-MD4(UNICODE(password)) כמפתח, וה-response נבנה בחישוב HMAC עם המפתח הזה.2
לכן נקודת המוצא לא משתנה, כמה שהחישוב נעשה מורכב. תוקף שמשיג את ה-hash יכול לבצע את החישוב שדרוש כדי לאמת כאותו משתמש בלי לפצח את הסיסמה בטקסט גלוי.
מורכבות סיסמה לבדה לא סוגרת את הנתיב הזה
לעשות סיסמאות ארוכות ומורכבות הוא עניין אחר מלמנוע שימוש ב-hash גנוב. סיסמאות מורכבות עדיין משאירות פתוח את הנתיב של גניבת ה-hash והשימוש בו. Microsoft מפרטת את Pass-the-Hash, לצד brute force ו-cracking, בין התקיפות שחסימת NTLM ב-SMB מתמודדת איתן.13
ל-Kerberos גם יש מפתחות ארוכי טווח. אבל מה שמוחלף באימות היומיומי הוא כרטיסים ו-session keys שפגים.3 ההשוואה חייבת להתרחב עד כמה רחוק מה שנגנב באמת מקדם את התוקף.
8. NTLMv1, NTLMv2 ו”הסרה”
NTLM אינו פרוטוקול אחד אלא משפחה של פרוטוקולי אימות שכוללת את LAN Manager גרסאות 1 ו-2 ואת NTLM גרסאות 1 ו-2.10
ההבחנה שצריך לעשות כאן היא בין deprecation ל-removal. Deprecated פירושו מחוץ לפיתוח פעיל של תכונות; removed פירושו בלתי שמיש בגרסאות המדוברות.
הטבלה שלהלן מציבה את הודעת ה-deprecation מיוני 2024 לצד ההסרה שלאחריה של NTLMv1. אל תקראו את הניסוח “עדיין עובד” בשורה הראשונה כאילו NTLMv1 שמיש במערכות ההפעלה שבשורה השנייה. ל-NTLMv1 חלה ההסרה המאוחרת.9
| גרסה | מצב | מה זה אומר |
|---|---|---|
| LANMAN / NTLMv1 / NTLMv2 | כולם deprecated (יוני 2024)9 | מחוץ לפיתוח פעיל של תכונות, אבל עדיין עובדים בגרסה הבאה של Windows Server ובשחרור השנתי הבא של Windows |
| NTLMv1 | הוסר (Windows 11 24H2 / Windows Server 2025)9 | בלתי שמיש בגרסאות האלה |
למצוא קודם את הצדדים שיודעים רק NTLMv1
לכן “אנחנו על NTLMv2, אז אפשר להשאיר את זה לעכשיו” לא מחזיק. סדר העדיפויות ברור, עם זאת: התקנים ומארחים שיודעים לדבר רק NTLMv1 באים קודם. מארח שנרשם כ-NTLM V1 ב-audit יפסיק לאמת ברגע שיעבירו אותו ל-Windows חדש יותר במצבו הנוכחי. איך להבדיל בין הגרסאות, לפי “Package Name (NTLM only)” ב-Security log, מכוסה בסעיף 4.4 של המאמר המעשי הנלווה.5
מדיניות ההגבלה חלה על v1 ועל v2 כאחד
שימו לב שמדיניות ה-audit ומדיניות החסימה שמגבילות את NTLM משפיעות באותה מידה על NTLMv1 ועל NTLMv2.5 ההתנהגות לא משתנה לפי גרסה כשאתם מחילים הגבלה.
9. לאן זה הולך
כיוון ההגירה הכי קל לתפוס בסדר הזה: לשנות את מה שהאפליקציות קוראות לו → לצמצם את המצבים שצריכים NTLM → לשנות את ברירת המחדל של אימות רשת.
זמני האספקה של IAKerb ושל ה-local KDC שלהלן, והשינוי בברירת המחדל, מתוארים כתוכניות במפת הדרכים של Microsoft שמצוטטת כאן. אין להתייחס אליהם כתכונות ששוחררו, או כתכונות שיעבדו אוטומטית בכל התקן.6
ראשית: להשתמש ב-Negotiate בצד האפליקציה
החלפת קריאות ל-NTLM בקריאות ל-Negotiate היא הוראה שנמצאת בהודעת ה-deprecation עצמה.9 נאמר במפורש גם שאפליקציות לא אמורות לגשת ישירות לחבילת האבטחה NTLM.1
שנית: לצמצם את המצבים שצריכים NTLM בכלל
IAKerb וה-local KDC המתוכננים לשלב 2 (המחצית השנייה של 2026) נכנסים לכאן.6 הם ניסיון למלא, ברמת הפרוטוקול, את שני הפערים שראינו בסעיף 6.3: “אי אפשר להשתמש ב-Kerberos כי זה חשבון מקומי” ו”אי אפשר להשתמש ב-Kerberos כי אי אפשר להגיע ל-domain controller”.
אבל מה שהם ממלאים מוגבל. מה ש-IAKerb פותר הוא נגישות ל-domain controller, ולא אם הצד שמולך תומך בפרוטוקול. גם ה-local KDC עובד רק בין גרסאות Windows שתומכות בו.
כשהצד שמולך הוא NAS של צד שלישי או מדפסת משולבת, ההמתנה לשלב 2 לא משנה דבר, ולכן עליכם לבחור בעצמכם בין החלפת ההתקן, הצטרפות שלו ל-domain, מעבר לפרוטוקול אחר, וניהול שלו כחריג.
שלישית: לשנות את ברירת המחדל של אימות NTLM ברשת
בשלב 3, אימות NTLM ברשת מתוכנן להיות מושבת כברירת מחדל בשחרור המרכזי הבא.6 נאמר גם שאפשר להפעיל אותו מחדש דרך policy.
מה לעשות עכשיו: למיין תלות בין מה שהתכונות החדשות אולי יכסו לבין מה שחייבים לתקן בעצמכם
התוכנית הולכת בסדר של “להסיר את הסיבות להשתמש ב-NTLM, ואז לשנות את ברירת המחדל”. מיון התלויות שלכם באותו אופן משאיר בנפרד את מה שכדאי לחכות לו ואת מה שצריך לתקן קודם.
| תלות שנותרה | איך להחליט |
|---|---|
| אימות עם חשבון מקומי בין גרסאות Windows תומכות, ונגישות ל-DC מהלקוחות | בתוך הטווח שאפשר לצפות מה-local KDC ומ-IAKerb לכסות. עם זאת, בדקו אם הצד שמולך תומך בהם |
| כתובות IP מוקשחות בקוד, SPNs לא רשומים | לתקנן את היעדים על FQDNs ולהסדיר את ה-SPNs. אל תדחו את אלה בגלל התכונות החדשות |
| אימות עם חשבון מקומי מול Windows ישן יותר או מול NAS ומדפסות משולבות של צד שלישי | לבחור בין החלפת ההתקן, הצטרפות ל-domain, מעבר לפרוטוקול אחר, וניהול כחריג |
הדבר החשוב הוא לא לגרוף את האימות מול Windows ישן יותר ומול התקני צד שלישי לדלי אחד של “מחכים לשלב 2”. זה לא יהפוך ל-Kerberos מעצמו, ואם משאירים את זה כך זה יצוף ככשל כשהברירת מחדל תושבת.
הנוהל הקונקרטי של inventory ומיון מופיע במאמר המעשי הנלווה.
10. סיכום
ולסיום, תזכורת לפי סדר ההחלטות.
מנגנון: response מבוסס hash, או כרטיס ליעד
NTLM בונה response ל-challenge מתוך ה-hash של הסיסמה. מה שמאמת אותו הוא DC בחשבון domain, או ה-SAM של השרת עצמו בחשבון מקומי.110
Kerberos משתמש בכרטיס שמוצפן עם המפתח ארוך הטווח של שירות היעד.3 תפיסה של ההבדלים בmutual authentication, בפנייה ל-DC בכל אימות וב-delegation חושפת את ההנחות לבחירה בין שתי השיטות.4
מיון: זה עובד על NTLM, או שהאימות נעצר?
אם האימות עבר ל-NTLM, בדקו את ארבעת התנאים: כתובות IP מוקשחות בקוד, SPNs לא רשומים, הימצאות מחוץ ל-Active Directory, ונגישות ל-KDC.5611
בעיות שמפיקות שגיאת אימות אחרי ש-Kerberos נבחר, כמו הפרש שעון, הן עניין נפרד. במקום לרדוף רק אחרי אירוע 8001 ב-NTLM/Operational, בדקו את אירועי Kerberos ואת סנכרון השעון.7 נקודת הפתיחה של החקירה היא לא להסיק “זה עובד, אז זה בטח Kerberos” או “זה נעצר, אז בטח נפל ל-NTLM”.
תגובה: לבדוק את ההגנות, ואז לעבור ל-Negotiate ולשמות
relay, שמעביר חילוף NTLM, ו-Pass-the-Hash, שמשתמש ב-hash גנוב, שונים גם בסיבה שהם עובדים וגם במה שהם צריכים.8113 בדקו את תנאי ההגנה בכל יעד תוך צמצום תלות ה-NTLM עצמה.
NTLMv1 הוסר ב-Windows 11 24H2 וב-Windows Server 2025, וכל הגרסאות כולל NTLMv2 הן deprecated.9 באפליקציות, השתמשו ב-Negotiate, תקננו את היעדים על FQDNs, ורשמו SPNs.15 אחר כך קדמו את ההגירה כשהתלויות שהתכונות החדשות אולי יכסו נשמרות בנפרד מהתלויות שעליכם לתקן בעצמכם.
מאמרים קשורים
- האם ביטול NTLM יעצור את האפליקציות העסקיות שלכם? — איך לאסוף audit logs, ובאיזה סדר לחסל תלויות
- מלכודות של כונני רשת ונתיבי UNC — עבודה עם שרתי קבצים (תיקיות משותפות) מאפליקציה עסקית
- מדריך לסנכרון זמן ב-Windows (w32time)
- חקירת Event Log בפועל עם Get-WinEvent — מהירות הסינון קובעת כמה זמן תימשך החקירה
- טיפול בטוח ב-credentials ב-PowerShell — להרחיק סיסמאות בטקסט גלוי מהסקריפטים שלכם
- מהו ה-TPM ב-Windows? — מדריך מאויר ל”כספת שלא מוציאה מפתחות החוצה” ול-measured boot
- עשרת האיומים הגדולים באבטחת מידע 2026 — איך לקרוא את הדירוג, ומה עסקים קטנים באמת צריכים להגן עליו
תחומי ייעוץ קשורים
KomuraSoft LLC מטפלת בשינויים באפליקציות עסקיות של Windows הנובעים מבחינה מחודשת של שיטות אימות, ובחקירת שורש של בעיות אימות סביב Kerberos ו-NTLM.
מקורות
-
Microsoft Learn, Microsoft NTLM. על כך ש-NTLM הוא פרוטוקול אימות בשם Windows Challenge/Response, וחבילת אבטחה שמספקת לאפליקציות אימות, שלמות וסודיות; על כך שה-credentials של NTLM מורכבים משם domain, שם משתמש ו-hash חד-כיווני של הסיסמה שהתקבל ב-logon אינטראקטיבי; על אימות בלי לשלוח את הסיסמה ברשת באמצעות challenge/response מוצפן, כשהצד שמבקש אימות מבצע חישוב שמוכיח שהוא יכול לגשת ל-credentials של NTLM המאוחסנים באופן מאובטח; על אימות לא אינטראקטיבי שבו משתתפים שלושה צדדים — לקוח, שרת ו-domain controller; על השלבים הקונקרטיים (הלקוח מחשב את ה-hash של הסיסמה וזורק את הסיסמה בטקסט גלוי, שולח את שם המשתמש בטקסט גלוי, השרת מייצר ושולח מספר אקראי של 8 בתים כ-challenge, הלקוח מצפין את ה-challenge עם ה-hash ומחזיר את ה-response, השרת שולח את שם המשתמש, ה-challenge וה-response ל-domain controller, וה-domain controller מבצע את אותו חישוב עם ה-hash ממסד הנתונים SAM ומשווה); ועל כך שאפליקציות לא ניגשות ישירות לחבילת האבטחה NTLM אלא משתמשות בחבילת האבטחה Negotiate, שבוחרת בין Kerberos ל-NTLM ובוחרת ב-Kerberos אלא אם אחת המערכות שמעורבות באימות לא יכולה להשתמש בו. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13
-
Microsoft Learn, [MS-NLMP]: NTLM v2 Authentication. על כך שגרסת אימות NTLM אינה מנוהלת במשא ומתן על ידי הפרוטוקול אלא חייבת להיות מוגדרת גם בלקוח וגם בשרת לפני האימות; על כך ש-response key של NTLM v2 מוגדר כ-
NTOWFv2(Passwd, User, UserDom) = HMAC_MD5( MD4(UNICODE(Passwd)), UNICODE(uppercased User + UserDom) ); על כך שהלקוח מייצר challenge של 8 בתים; על כך ש-tempהוא שרשור של גרסת ה-response, חתימת זמן GMT של 8 בתים, ה-challenge של הלקוח ו-ServerName (מבנה ה-AvPairs שנמצא ב-NTLMv2_CLIENT_CHALLENGE של AUTHENTICATE_MESSAGE); עלNTProofStr = HMAC_MD5( ResponseKeyNT, server challenge + temp )ועל כך ש-NtChallengeResponseהוא שרשור שלNTProofStrו-temp; עלSessionBaseKey = HMAC_MD5(ResponseKeyNT, NTProofStr); ועל צד האימות — שבו חשבון שמתארח ב-Active Directory שולח את צמד ה-challenge/response ל-domain controller לאימות, וה-DC מחשב את הערך המצופה עם NTOWF v2 / LMOWF v2 ומשווה, ואם ה-DC מחזיר STATUS_NTLM_BLOCKED השרת מחזיר STATUS_NOT_SUPPORTED, ואילו חשבון שמתארח מקומית בשרת גורם לשרת לחשב את הערך המצופה מה-OWF שהוא מאחסן מקומית ולהשוות. ↩ ↩2 ↩3 ↩4 ↩5 -
Microsoft Learn, How the Kerberos Version 5 Authentication Protocol Works. על חילוף AS, שבו הלקוח שולח ל-KDC את ה-user principal name שלו, את שם ה-domain של החשבון ואת נתוני ה-pre-authentication (כולל חתימת זמן) מוצפנים עם המפתח ארוך הטווח של המשתמש (שנגזר מהסיסמה), וה-KDC מפענח ומאמת עם אותו מפתח ארוך טווח לפני שהוא מחזיר TGT שמוצפן עם המפתח ארוך הטווח של ה-KDC עצמו (המפתח של חשבון krbtgt) ו-session key שמוצפן עם המפתח ארוך הטווח של המשתמש, כשה-TGT מכיל את ה-session key, נתוני הרשאה (SID של המשתמש ו-SIDs של קבוצות), וזמן חיים ו-flags. על חילוף TGS, שבו הלקוח שולח ל-KDC את שם שרת היעד (SPN), את ה-TGT ואת ה-authenticator (שמכיל חתימת זמן ו-checksum) מוצפן עם ה-session key, וה-KDC מפענח את ה-TGT עם המפתח ארוך הטווח שלו כדי לחלץ את ה-session key, מאמת שחתימת הזמן של ה-authenticator נמצאת בטווח שהוגדר במדיניות, ומחזיר service ticket שמוצפן עם המפתח ארוך הטווח של שירות היעד ו-session key חדש שמוצפן עם ה-TGS session key. על חילוף הלקוח/שרת (AP), שבו הלקוח מציג לשירות את ה-service ticket ואת ה-authenticator, והשירות מפענח את הכרטיס עם המפתח ארוך הטווח שלו כדי לחלץ את ה-session key ואת נתוני ההרשאה, ומחזיר את חתימת הזמן של הלקוח מוצפנת עם ה-session key כדי להוכיח את זהותו כשנתבקש mutual authentication. ועל ההבדל בין מפתחות ארוכי טווח ל-session keys (מפתחות ארוכי טווח נגזרים מסיסמאות או מחשבונות שירות ונשמרים בין sessions, בעוד session keys הם קצרי מועד ונהרסים עם פקיעת הכרטיס). ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13
-
Microsoft Learn, Kerberos authentication overview in Windows Server. על כך ש-Windows Server מממש את פרוטוקול האימות Kerberos גרסה 5 יחד עם הרחבות לאימות במפתח ציבורי, להעברת נתוני הרשאה ול-delegation; על כך שלקוח Kerberos ממומש כ-SSP (security support provider) שניגשים אליו דרך SSPI; על כך שה-KDC משולב עם שאר שירותי האבטחה ב-domain controller ומשתמש במסד הנתונים של Active Directory Domain Services כמסד החשבונות האבטחתי שלו; על כך ש-Kerberos תומך ב-delegation על ידי שירותים (שירות front-end שמתחבר לשירותי back-end במחשבים אחרים בזהות הלקוח) בעוד מה ש-NTLM ו-Kerberos מספקים הוא נתוני ההרשאה ששירות צריך כדי להתחזות ללקוח באופן מקומי; על כך שאימות NTLM שלפני Kerberos דרש משרת אפליקציה להתחבר ל-domain controller בכל פעם שהוא אימת לקוח או שירות, ואילו ב-Kerberos כרטיסי session שמתחדשים מחליפים את ה-pass-through authentication והשרת לא צריך לפנות ל-domain controller אלא כשנדרש אימות PAC; ועל mutual authentication — על כך ש-Kerberos מאפשר לכל אחד משני הקצוות של חיבור רשת לאמת שהצד השני הוא מי שהוא מצהיר, בעוד NTLM לא מאפשר לא ללקוח לאמת את זהות השרת ולא לשרת אחד לאמת את זהותו של אחר, לאחר שתוכנן לסביבות רשת שבהן אפשר להניח שהשרתים אמיתיים — הנחה ש-Kerberos לא מניח. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13
-
Microsoft Learn, Viewing events for assessing NTLM usage. על כך שאפשר לקבוע אם מידע ה-audit של NTLM ביומן האירועים נוגע ל-NTLM v1 או v2, בחיפוש ב-Security log אחרי אירועי logon של “Authentication Package” ובחינת “Package Name (NTLM only)” תחת “Detailed Authentication Information”; על כך שמדיניות ה-audit ומדיניות החסימה להגבלת NTLM משפיעות באותה מידה על שתי הגרסאות של NTLM; על ארבע הקטגוריות של אפליקציות שמשתמשות ב-NTLM למרות שהן אמורות לתמוך ב-Kerberos (אפליקציות שמאפשרות לבחור בין הגדרות וספקי אבטחה שונים, אפליקציות שה-SPN שלהן לא הוגדר נכון, אפליקציות שמשתמשות בכתובות IP ולא בשמות DNS בגלל הגדרה שגויה או תיעוד של הספק, ואפליקציות עם חלקים שתומכים רק ב-NTLM בקוד ישן); על נוהל החקירה שעוקב מאירוע 8004 ב-domain controller לאירוע 8003 בשרת member ולאירוע 8001 בלקוח, ועל השדות של כל אירוע; על כך ש-Kerberos לא נכנס לשימוש אם “Target Server” באירוע 8001 אינו בצורת NetBIOS ואינו בצורת FQDN; ועל כך שה-PID הוא תמיד 4 (SYSTEM) בתעבורה דרך SMB, ולכן נדרש Process Monitor כדי לזהות את התהליך הקורא. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9
-
Microsoft Japan Windows Technology Support Blog, Preparing for the Retirement of NTLM (in Japanese). על כך שביטול NTLM מתקדם בשלושה שלבים (שלב 1 = להפוך את השימוש לגלוי ולבצע עליו audit; שלב 2 = תכונות לתרחישים שתלויים ב-NTLM, מתוכננות למחצית השנייה של 2026; שלב 3 = השבתת אימות NTLM ברשת כברירת מחדל בשחרור המרכזי הבא); על כך ששלב 2 אמור לספק את IAKERB (פרוטוקול שתומך בפונקציונליות proxy) ואת ה-local KDC (תכונה שתומכת באימות מקומי); על כך שאפליקציות צריכות להשתמש ב-Negotiate; ועל הסיבות המייצגות לשימוש ב-NTLM: גישה לשרת שמוגדרת לפי כתובת IP, הגבלות firewall על הפורטים ש-Kerberos צריך, SPNs לא רשומים, אימות מול שותפים מהימנים, ואימות בסביבות workgroup. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9
-
Microsoft Learn, Registry entries about Kerberos protocol and Key Distribution Center (KDC) configuration. על ההגדרות תחת
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters. בפרט, על כך ש-SkewTimeברירת המחדל שלו היא חמש דקות, כהפרש הזמן המרבי שנסבל בין מחשב לקוח לבין השרתים או ה-KDC שמקבלים אימות Kerberos, ועל כך שהערך הזה משמש גם כדי להחליט אם אפשר להשתמש שוב בכרטיס; ועל פקיעת ה-cache של SPN (SpnCacheTimeout, 15 דקות כברירת מחדל) שמשמשת בלקוחות ובשרתי member כדי לנקות רשומות cache שליליות של “SPN not found”, כשה-SPN cache מושבת ב-domain controllers. ↩ ↩2 ↩3 ↩4 ↩5 -
Microsoft Learn, Network security: Restrict NTLM: Outgoing NTLM traffic to remote servers. על ארבעת הערכים Allow all, Audit all, Deny all ו-Not Defined; על הנוהל המומלץ של בחירה תחילה ב-“Audit all”, בחינת ה-operational log, ורק אחר כך בניית רשימת חריגים; על כך שאירועי audit ואירועי חסימה נרשמים תחת “Applications and Services Logs\Microsoft\Windows\NTLM”; ועל כך שאימות NTLM ו-NTLMv2 פגיע למגוון תקיפות זדוניות כולל SMB relay, man-in-the-middle ו-brute force, ולכן צמצום וביטול אימות NTLM מהסביבה גורם ל-Windows להשתמש בפרוטוקולים מאובטחים יותר כמו Kerberos גרסה 5 או במנגנוני אימות אחרים כמו smart cards — כשהתקיפות האלה אפשריות רק במקום שבו שרתים או domain controllers מעבדים בקשות NTLM. ↩ ↩2 ↩3
-
Microsoft Learn, Deprecated features in the Windows client. על כך שכל הגרסאות של NTLM, כולל LANMAN, NTLMv1 ו-NTLMv2, נמצאות מחוץ לפיתוח פעיל של תכונות והן deprecated (הוכרז ביוני 2024); על כך שהשימוש ב-NTLM ממשיך לעבוד בגרסה הבאה של Windows Server ובשחרור השנתי הבא של Windows; על כך שיש להחליף קריאות ל-NTLM בקריאות ל-Negotiate, שמנסה לאמת עם Kerberos ונופל ל-NTLM רק כשצריך; ועל העדכון מנובמבר 2024 שאומר ש-NTLMv1 הוסר מ-Windows 11 גרסה 24H2 ומ-Windows Server 2025. וכן על ההבחנה בין deprecated ל-removed — תכונות ברשימה הזאת אינן בפיתוח פעיל ועלולות להיות מוסרות בעדכון עתידי. ↩ ↩2 ↩3 ↩4 ↩5 ↩6
-
Microsoft Learn, NTLM overview in Windows Server. על כך שאימות NTLM הוא משפחה של פרוטוקולי אימות שנמצאת ב-Msv1_0.dll, וכוללת את LAN Manager גרסאות 1 ו-2 ואת NTLM גרסאות 1 ו-2; על כך שזו שיטה להוכיח לשרת או ל-domain controller, באמצעות מנגנון challenge/response, שאתם יודעים את הסיסמה של חשבון; על כך ששרת משאב צריך, בכל פעם שהוא דורש access token חדש, לפנות לשירות האימות ב-domain controller של ה-domain של אותו חשבון כשמדובר בחשבון domain, או להתייעץ עם מסד החשבונות המקומי שלו כשמדובר בחשבון מקומי; על כך שב-NTLM עדיין משתמשים, וחייבים להשתמש, לאימות Windows במערכות שמוגדרות כחברות ב-workgroup ולאימות logon מקומי במחשבים שאינם domain controllers; על כך ש-Kerberos גרסה 5 היא שיטת האימות המועדפת בסביבות Active Directory, בעוד שאפליקציות של Microsoft ושל אחרים עדיין עשויות להשתמש ב-NTLM; ועל כך שצמצום השימוש ב-NTLM דורש גם הבנה של הדרישות של האפליקציות הפרוסות וגם הגדרה לשימוש בפרוטוקולים אחרים. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10
-
Microsoft Learn, Configuring Kerberos for IP Address. על כך שמ-Windows 10 גרסה 1507 ומ-Windows Server 2016 ואילך אפשר לגרום ללקוח Kerberos לתמוך בשמות מארח IPv4/IPv6 ב-SPNs; על כך ש-Windows כברירת מחדל לא מנסה אימות Kerberos מול מארח ששם המארח שלו הוא כתובת IP, ונופל לפרוטוקול אימות תקף אחר כמו NTLM; על כך שאפליקציות שמקבעות כתובות IP בקוד לכן נופלות ל-NTLM ועלולות לגרום לבעיות תאימות בסביבות שמשביתות NTLM; על כך שהתכונה שמאפשרת להשתמש בכתובות IP כשמות מארח ב-SPN הוצגה כדי לצמצם את ההשפעה הזאת, ומופעלת בהגדרת ערך הרישיות בצד הלקוח
TryIPSPN(REG_DWORD, לא קיים כברירת מחדל) תחתHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\Kerberos\Parametersל-1, כשההגדרה נדרשת בכל לקוח שצריך לגשת למשאבים מוגני Kerberos לפי כתובת IP; על כך שצורת ה-SPN היאservice/hostname[:port]; ועל כך שכתובות IP הן זמניות ונוטות לגרום להתנגשויות ולכשלי אימות כשהחכירות מסתיימות ומתחדשות, ולכן בדרך כלל אין להשתמש בהן במקום שמות מארח, שרישום SPN לפי כתובת IP הוא עבודה ידנית שמיועדת לשימוש רק כשאי אפשר לעבור לשם מארח מבוסס DNS, והוא נעשה עםSetspn -s <service>/<ip.address> <domain-user-account>— ומכיוון שב-Active Directory אפשר לרשום SPN על חשבון אחד בלבד בכל רגע, מומלץ לבצע reservation סטטי של כתובת ה-IP כשמשתמשים ב-DHCP. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 -
Microsoft Learn, Overview of Server Message Block signing in Windows. על כך ש-SMB signing מצרף לכל הודעת SMB signature שנוצרת עם ה-session key ו-AES, כשה-signature מכיל, בנוסף ל-hash של כל ההודעה, את הזהויות של השולח המקורי ושל המקבל המיועד; על כך שכל שינוי בתעבורה בדרך לא יתאים ל-signature, ובכך מגן מפני מתקפות relay והתחזות; על כך שהאבטחה של SMB 2/3 signing ו-encryption תלויה ב-session key, וה-signature מאשר את הזהויות של השולח והמקבל כדי למנוע מתקפות relay; על כך שה-session key נגזר מהסיסמה, ולכן עדיפות לסיסמאות ארוכות, מורכבות ולא מילוניות; על כך שמומלץ Kerberos ולא NTLMv2 כדי שה-session key יתחיל חזק; על כך שכדאי להימנע מהתחברות ל-shares לפי כתובת IP או רשומת CNAME, כי זה גורם לשימוש ב-NTLM במקום ב-Kerberos; על כך ש-domain controllers דורשים SMB signing כברירת מחדל מלקוחות שמתחברים ל-SYSVOL ול-NETLOGON, כשבצד הלקוח UNC Hardening דורש בנוסף Kerberos לשני ה-shares האלה; על כך ש-signing משמש גם כחלק מ-pre-authentication integrity כדי למנוע מתקפות downgrade; על מיקומי המדיניות ועל ערך הרישיות (
RequireSecuritySignature); ועל ה-audit שזמין מ-Windows 11 גרסה 24H2 ואילך כדי לזהות צדדים שלא תומכים ב-signing או ב-encryption (Set-SmbClientConfiguration -AuditServerDoesNotSupportSigningוכדומה, SMBClient/Audit 31998 ו-31999, SMBServer/Audit 3021 ו-3022). ↩ ↩2 ↩3 -
Microsoft Learn, Block NTLM connections on SMB in Windows Server 2025. על כך שלקוח SMB יכול לחסום אימות NTLM בחיבורים יוצאים למחשבים מרוחקים; על כך שזה מונע טכניקות שגורמות לשליחת בקשות NTLM לשרתים זדוניים ומתמודד עם brute force, cracking ו-Pass-the-Hash; על כך ש-Kerberos מאובטח יותר מ-NTLM כי הגישה מבוססת הכרטיסים שלו מאפשרת לאמת את זהות השרת, ושחסימת NTLM הכרחית כדי להעביר את פרוטוקול האימות של הארגון ל-Kerberos, בעוד שאפשר גם להפעיל רק את שכבת ההגנה הזאת בלי להשבית את NTLM לגמרי; על כך שהדרישות המקדימות הן לקוח SMB ב-Windows Server 2025 ומעלה או ב-Windows 11 גרסה 24H2 ומעלה, ושרת SMB שיכול להשתמש ב-Kerberos; ועל כך שזו תכונה של לקוח ה-SMB. ↩ ↩2 ↩3
מאמרים קשורים
מאמרים עדכניים עם אותן תגיות, להעמקה בנושאים קרובים.
SMB signing ו-LDAP channel binding — לסגור בעבודה המעשית את "החצי השני" של הגנת NTLM
SMB signing ו-LDAP signing/channel binding מגבילים את נזקי ה-relay עד שמסיימים עם NTLM. המאמר מפרט את ברירות המחדל לפי OS, איך קוראים את ...
האם הוצאת NTLM משימוש תעצור את אפליקציות העסק? — איך לאסוף לוגי ביקורת ובאיזה סדר לחסל תלויות
המאמר מסביר איך מאתרים היכן Windows ואפליקציות עסקיות תלויות ב-NTLM: מדיניות ביקורת, אירועים 8001-8004 ביומן NTLM/Operational, הסיבות והת...
למה תיקייה משותפת ב-Windows עובדת לפעמים ונכשלת בפעמים אחרות — troubleshooting של Kerberos, NTLM ו-Credentials
מאבחנים גישה לסירוגין לתיקייה משותפת ב-Windows לפי תסמינים ולוגים. בודקים שמות מול כתובות IP, כשלים רק באפליקציה, סיסמאות ריקות, שגיאה 12...
חשבונות שירות ב-Windows: LocalSystem, virtual accounts ו-gMSA
עדיין מריצים Windows services כ-LocalSystem? המאמר משווה הרשאות וזהות רשת של LocalService, NetworkService, virtual accounts, domain users...
Windows LAPS — להפסיק סיסמת Administrator מקומית משותפת לכל המחשבים
סיסמת Administrator מקומית משותפת לכל המחשבים היא כר פורה ל-Pass-the-Hash: פריצה למחשב אחד מתפשטת לכל השאר. המאמר מסביר את הסיבוב האוטומט...
נושאים קשורים
העמודים האלה ממקמים את הנושא בהקשר רחב יותר של שירותים והחלטות.
נושאים טכניים ב-Windows
שער לנושאי פיתוח Windows, חקירת תקלות וניצול נכסים קיימים.
שירותים הקשורים לנושא הזה
המאמר קשור ישירות לשירותים הבאים.
פיתוח יישומי Windows
יישומים עסקיים, חיבור התקנים וכלי תקשורת, מהגדרת הדרישות ועד הפיתוח.
שאלות נפוצות
שאלות נפוצות בפניות בנושא המאמר.
- מה בעצם ההבדל בין NTLM ל-Kerberos?
- ההבדל הגדול ביותר הוא אם אפשר לאמת את זהות הצד שמולכם. Microsoft מציינת במפורש שב-NTLM הלקוח אינו יכול לאמת את זהות השרת, וגם שרת אחד אינו יכול לאמת את זהותו של שרת אחר. NTLM תוכנן לסביבות שבהן אפשר להניח שהשרתים אמיתיים; Kerberos לא מניח הנחה כזו. ההבדל השני הוא אם השרת צריך לפנות ל-domain controller. ב-NTLM, כשמאמתים חשבון domain, שרת האפליקציה מתחבר ל-domain controller בכל פעם שהוא מאמת לקוח (בחשבון מקומי בשרת, השרת מתייעץ עם מסד החשבונות שלו ומחליט בעצמו, וה-domain controller לא נכנס לתמונה כלל). ב-Kerberos, כרטיסי session שמתחדשים מחליפים את ה-pass-through authentication הזה, ולכן השרת לא פונה ל-domain controller אלא כשנדרש אימות PAC. ההבדל השלישי הוא ש-Kerberos תומך ב-delegation על ידי שירותים — מנגנון להתחברות לשירות אחר בשם הלקוח.
- Kerberos אמור להיות נתמך, אז למה בסוף יוצא NTLM?
- Kerberos מנפיק כרטיסים לפי "שם היעד", ולכן הוא לא מתקיים אם אי אפשר לפתור את השם. הלקוח מציג ל-KDC את ה-SPN (service principal name) של היעד כדי לבקש service ticket, אבל כברירת מחדל Windows לא מנסה אימות Kerberos כששם המארח הוא כתובת IP, ואם לא רשום SPN על חשבון השירות ה-KDC לא יכול להנפיק כרטיס. גם הנחיות ה-audit של Microsoft אומרות ש-Kerberos לא נכנס לשימוש אם "Target Server" באירוע 8001 אינו בצורת NetBIOS ואינו בצורת FQDN. (בכתובות IP אפשר להעמיד Kerberos כחריג על ידי הגדרת TryIPSPN בלקוח ורישום ידני של SPN לכתובת ה-IP, אבל זה מתואר כמוצא אחרון למקרים שבהם אי אפשר להשתמש בשם DNS.) תנאים נוספים שבהם Kerberos לא מתקיים: אימות במחשבי workgroup או עם חשבונות מקומיים (מחוץ ל-Active Directory מלכתחילה), אתרים שאינם יכולים להגיע ל-domain controller, ואימות מול צד שאין איתו יחסי אמון. Negotiate בוחר ב-NTLM כש-Kerberos לא זמין, וזו המשמעות של "נפילה" במקרים האלה.
- מהי מתקפת NTLM relay, ולמה היא עובדת?
- התוקף מפתה את הקורבן לשרת שלו ומעביר את חילוף האימות של NTLM שמגיע לשם ישירות לשרת האמיתי, ובכך מתחזה לקורבן. זה עובד כי ל-challenge/response של NTLM אין מנגנון שכובל את "למי אתם מאמתים את עצמכם". הלקוח פשוט מחשב response מה-challenge שהשרת הנפיק ומחזיר אותו, בלי דרך לבדוק אם ה-response הזה מיועד לשרת האמיתי או מועבר על ידי תוקף. Microsoft עצמה כותבת בתיעוד של הגדרת המדיניות שאימות NTLM ו-NTLMv2 פגיע למגוון תקיפות זדוניות, כולל SMB relay, מתקפות man-in-the-middle ומתקפות brute force. עם זאת, relay לא עובר לכל אחד. אם היעד דורש SMB signing, ה-signature מאשר את זהות השולח והמקבל ולכן ה-relay נכשל; כך גם בשירותים שאוכפים Extended Protection for Authentication (channel binding). מנגד, היעדים הם צדדים שמקבלים NTLM בלי signing ובלי channel binding. ב-Kerberos, ה-service ticket מוצפן עם המפתח ארוך הטווח של אותו שירות, ולכן כרטיס שמיועד לשירות אחד לא יכול להיות מפוענח על ידי אחר.
- Pass-the-Hash אומר שאפשר להתחזות למישהו בלי לפצח את הסיסמה שלו?
- בדיוק. ה-credentials של NTLM מורכבים משם domain, שם משתמש ו-hash חד-כיווני של הסיסמה. ב-NTLMv2, שבו Windows של ימינו משתמש, ה-response key נגזר כ-HMAC עם מפתח שהוא ה-hash של MD4 של הסיסמה (ה-NT hash), ואותו מפתח משמש לחשב HMAC על צירוף של ה-challenge של השרת, חתימת זמן, challenge מצד הלקוח ומידע על היעד. זה לא הצפנה פשוטה של ה-challenge, אבל נקודת המוצא היא עדיין ה-hash של הסיסמה. במילים אחרות, מה שהאימות צריך הוא ה-hash, ולא הסיסמה בטקסט גלוי. לכן תוקף שמצליח לחלץ את ה-hash, למשל מהזיכרון של מחשב, יכול לאמת כאותו משתמש בלי לפצח את הסיסמה. הפיכת הסיסמאות לארוכות ומורכבות יותר לא סוגרת את הנתיב הזה. אחת הסיבות ש-Microsoft מציינת לאספקת חסימת NTLM בצד לקוח SMB היא ההתמודדות עם מתקפות Pass-the-Hash.
- אם אנחנו על NTLMv2, אנחנו לא מוגנים לעת עתה?
- NTLMv2 חזק מ-NTLMv1, אבל הוא לא מחוץ ל-deprecation. רשימת התכונות ה-deprecated של Microsoft אומרת שכל הגרסאות של NTLM, כולל LANMAN, NTLMv1 ו-NTLMv2, נמצאות מחוץ לפיתוח פעיל של תכונות והן deprecated. מדיניות ההגבלה מתנהגת אותו דבר: מדיניות ה-audit ומדיניות החסימה מתוארות כבעלות אותה השפעה על שתי הגרסאות. לעומת זאת NTLMv1 מטופל אחרת: הוא עבר את ה-deprecation לשלב ה-removal, והוסר מ-Windows 11 גרסה 24H2 ומ-Windows Server 2025. לכן הניסוח אינו "אנחנו על NTLMv2, אז אפשר להשאיר את זה", אלא "NTLMv1 הוא דדליין כבר עכשיו; NTLMv2 צריך inventory לקראת השבתה כברירת מחדל".