האם הוצאת NTLM משימוש תעצור את אפליקציות העסק? — איך לאסוף לוגי ביקורת ובאיזה סדר לחסל תלויות
· עודכן בתאריך: · Go Komura · NTLM, Kerberos, Windows, Active Directory, אבטחה, מערכות מידע, PowerShell
“שמעתי ש-NTLM יוצא משימוש. נהיה בסדר?” כדי לענות על זה, הדבר הראשון שצריך לעשות אינו לחסום אותו בכל החברה אלא לבצע ביקורת על האימות שפועל כרגע. כל גרסאות NTLM הוכרזו כ-deprecated ביוני 2024, אבל ההכרזה הזאת לבדה לא עוצרת שום עסק.1
הוצאת NTLM משימוש אינה שינוי שבו מגיע patch ביום אחד והחברה כולה נעצרת; זו הוצאה שבה ההגבלות מתהדקות צעד אחר צעד עם כל גרסת מערכת הפעלה חדשה. בזמן ש-NTLM עוד עובד, רשמו את המחשבים, האפליקציות והיעדים שתלויים בו, נסו את השינוי בהיקף קטן, ורק אז הגבילו אותו. לחסום הכול קודם ואז לחפש מה נשבר — זה הסדר הלא נכון.
המאמר הזה הוא נוהל מעשי עבור מחלקת ה-IT שמתפעלת סביבת Windows ועבור המפתחים שמתחזקים אפליקציות עסקיות. הוא מתקדם בסדר הזה: ביקורת, סיווג הסיבות, תיקון שמות, הגדרות וקוד, בדיקה של חיבור אחד בכל פעם, ואז הגבלה מדורגת.
המכניקה של הפרוטוקול עצמו (למה NTLM מסוכן, ולמה אימות נופל חזרה ל-NTLM במקום ל-Kerberos) מופרדת למאמר הנלווה “NTLM ו-Kerberos מוסברים באיורים — למה אימות נופל חזרה ל-NTLM”.
מפת הדרכים של ההוצאה משימוש וזמינות התכונות מובאות נכון ליולי 2026, אותו בסיס תאריך כמו המאמר המקורי ביפנית. יש להפריד את זה מהתאריך שבו עודכן לאחרונה המבנה של המאמר הזה. בדקו את הזמינות של IAKerb, של ה-KDC המקומי ושל השאר ב-release notes של הגרסה שאליה אתם מכוונים, כשתבואו לקבל בפועל את החלטת המיגרציה.2
להתחיל מהבעיה שיש לכם
| מה שרוצים להבהיר | מה להפריד קודם | איפה לקרוא |
|---|---|---|
| מתי ההוצאה משימוש תעצור את העסק שלנו | הוצאה משימוש (deprecation), הסרת NTLMv1, והכיבוי העתידי כברירת מחדל | פרק 2: איפה אנחנו עומדים, שלושת השלבים |
| אנחנו לא יודעים אילו מחשבים ואפליקציות משתמשים בזה | היכן חלות מדיניות הביקורת, ואיפה האירועים באמת נרשמים | סעיף 4.1: הכנת הביקורת |
| יומני ה-DC דלילים, אפשר להרפות? | אימות דומיין מול אימות מקומי שלא מגיע ל-DC | סעיף 4.2: מעקב אחרי האירועים |
| רוצים לצמצם אלפי אירועים לאפליקציה שאחראית | קיבוץ לפי יעד ולפי התהליך הקורא | סעיף 4.3: PowerShell |
| מצאנו NTLMv1, או שורות עם PID 4 | תלויות לתקן קודם, ותלויות לרדוף אחריהן עם ProcMon | סעיף 4.4: NTLMv1, סעיף 4.5: PID 4 |
| מה לתקן: כתובות IP, aliases או SPN-ים | רדיוס ההשפעה, קלות התיקון והתנאים בצד השני | פרק 5: סיווג הסיבות, פרק 6: התיקונים |
| רוצים לבדוק אם שיתוף עובד בלי NTLM | סגירת ה-session הקיים, ובדיקת ביקורת בלי הדגל | סעיף 7.1: לבדוק מחשב אחד וחיבור אחד |
| רוצים לתקן את האפליקציה שלנו או את צד ה-IIS | שיטת האימות, החשבון שמאמת, והיכן נרשם ה-SPN | פרק 8: למפתחים, IIS ו-SPN-ים |
| איך מחליטים שהפריסה בכל החברה הסתיימה | SMB מול כל השאר, תקופת הביקורת מול מחזור עסקי שלם | פרק 9: מפת דרכים, תקופת הביקורת |
אם אתם קוראים ברצף, התחילו בפרק 1; כשאתם מתחילים בעבודה בפועל, חזרו לביקורת בפרק 4.
1. קודם המסקנות
להבחין איפה השינוי באמת עומד
NTLM הוצאה משימוש ביוני 2024. זה כולל כל גרסה, כולל LANMAN, NTLMv1 ו-NTLMv2, וזו הצהרה שפיתוח תכונות פעיל הופסק. באותה הכרזה נאמר גם ששימוש ב-NTLM ימשיך לעבוד במהדורה הבאה של Windows Server ובמהדורה השנתית הבאה של Windows.1
חלקים ממנו כבר הוסרו. NTLMv1 הוסר ב-Windows 11 גרסה 24H2 וב-Windows Server 2025.1
ההוצאה משימוש מתקדמת בשלושה שלבים. שלב 1 הוא הפיכת השימוש לגלוי וביקורת עליו, שלב 2 (המחצית השנייה של 2026) הוא התכונות שמסירות את המצבים שבהם אי אפשר להימנע מ-NTLM (IAKerb וה-KDC המקומי), ושלב 3 הוא השבתת אימות NTLM ברשת כברירת מחדל במהדורה הגדולה הבאה.2
לזהות את התלויות לפני שחוסמים משהו
יש דבר אחד בדיוק שצריך לעשות עכשיו. להפעיל מצב ביקורת ולבנות רשימה של “איזה מחשב, איזו אפליקציה, מול איזה שרת” משתמשים ב-NTLM (פרק 4).
עבור חשבונות דומיין, החקירה מתחילה בבקר הדומיין. מעקב אחרי אירוע 8004, ואז 8003 בשרת החבר, ואז 8001 בלקוח, מביא אתכם עד לשם האפליקציה (סעיף 4.2). שימו לב עם זאת שאימות עם חשבונות מקומיים לא עובר דרך בקר דומיין, ולכן לא מופיע 8004. את המסלול הזה צריך לתפוס מ-8003 בשרת ומ-8001 בלקוח.3
רוב הסיבות הן שמות. כתובות IP מקודדות ו-SPN-ים שלא נרשמו הם השניים הגדולים, ואף אחד מהם לא דורש בנייה מחדש של האפליקציה (פרק 5).32
לנסות בקטן, ולתקן גם את צד האפליקציה
יש דרך בטוחה לבדוק על מחשב בודד. ב-Windows 11 24H2 או ב-Windows Server 2025, NET USE \\server\share /BLOCKNTLM מאפשר לבדוק “האם זה מתחבר בלי NTLM?” בלי לשנות אף מדיניות (פרק 7).4
באפליקציות שלכם, החליפו את המקומות שמציינים NTLM ב-Negotiate. Microsoft עצמה כותבת “אל תגשו ישירות ל-NTLM security package” (פרק 8).5
ב-diagram, solid line מציינת relation שתמיד מתקיים ו-dashed line מציינת relation מותנה (התנאים מופיעים בהסבר של כל relation ב-detail page). הרשימה המלאה של ה-relations (סה”כ 29, כולל evidence ו-certainty) וההגדרות של ה-concepts המרכזיים נמצאות ב-detail page של ה-knowledge map (ביפנית). Data: JSON-LD / Turtle
2. מה המשמעות בפועל של “הוצאה משימוש”
מתחילים מלסדר את המינוח. אם תסבירו את זה לחברה כשהדברים עוד מעורפלים, יסתובבו במקביל “כנראה כבר אי אפשר להשתמש בזה” ו”כנראה אנחנו בסדר לשנים”, והדיון מתפרק.
להפריד בין הכרזת ההוצאה משימוש לבין ההסרה שכבר קרתה
בקיצור, הרשומה של NTLM ברשימת התכונות שהוצאו משימוש של Microsoft אומרת שלושה דברים.1
- כל גרסה של NTLM, כולל LANMAN, NTLMv1 ו-NTLMv2, מחוץ לפיתוח תכונות פעיל והוצאה משימוש.
- שימוש ב-NTLM ימשיך לעבוד במהדורה הבאה של Windows Server ובמהדורה השנתית הבאה של Windows.
- יש להחליף קריאות ל-NTLM בקריאות ל-Negotiate. Negotiate מנסה לאמת עם Kerberos ונופל חזרה ל-NTLM רק כשצריך.
עדכון מאוחר יותר מוסיף שNTLMv1 הוסר מ-Windows 11 גרסה 24H2 ומ-Windows Server 2025.1
אז המצב שבו אנחנו נמצאים הוא “הוצאה משימוש”, לא “הוסר”. רק NTLMv1 עבר מעבר להוצאה משימוש ונמצא כבר בשלב ההסרה. אם מדפסת רב-תכליתית ישנה או NAS יודעים לאמת רק עם NTLMv1, העדכון ל-Windows 11 24H2 הוא עצמו התקלה. זו לא בעיה של העתיד; היא קורית עכשיו.
בשימושים שאין להם חלופה, בדקו גם את התנאים בצד השני
הדבר הנוסף שכדאי להחזיק הוא של-NTLM עדיין יש שימושים שאין להם חלופה. Microsoft מציינת במפורש ש-NTLM עדיין בשימוש, וחייב להיות בשימוש, עבור אימות Windows במערכות שמוגדרות כחברות ב-Workgroup ועבור אימות התחברות מקומי במערכות שאינן בקרי דומיין.6 ה-KDC המקומי שמתוכנן לשלב 2 הוא בדיוק התכונה שאמורה למלא את הפער של “חשבונות מקומיים דורשים NTLM”.2
2.1. איפה שלושת השלבים עומדים
מפת הדרכים של ההוצאה משימוש כוללת שלושה שלבים. המידע הזה תלוי בזמן, ולכן הוא מובא עם תאריך הבסיס שלו (הטבלה שלמטה משקפת את המצב נכון ליולי 2026).
| שלב | תוכן | מצב נכון ליולי 2026 | מה לעשות בארגון שלכם |
|---|---|---|---|
| שלב 1 | הפיכת השימוש לגלוי וביקורת עליו | אפשר לעשות את זה כבר עכשיו. גם מדיניות הביקורת וגם יומן Microsoft-Windows-NTLM/Operational קיימים ב-Windows של היום27 |
להריץ את הביקורת מפרק 4 ולבנות את הרשימה |
| שלב 2 | תכונות שמסירות את המצבים שבהם אי אפשר להימנע מ-NTLM (IAKerb, KDC מקומי) | מוצהר כמתוכנן למחצית השנייה של 20262 | לבדוק קודם את ה-release notes כדי לראות אם זה זמין באופן כללי או עדיין ב-preview בגרסה שאליה אתם מכוונים, ורק אז להכניס לתוכנית. אל תשימו סעיף על המדף בטענה ש”שלב 2 יפתור את זה” לפני הבדיקה הזאת |
| שלב 3 | השבתת אימות NTLM ברשת כברירת מחדל במהדורה הגדולה הבאה | לא פורסם תאריך מדויק. גם עם כיבוי ברירת המחדל נאמר שאפשר להחזיר אותו לפעולה באמצעות מדיניות21 | לסיים קודם את שלבים 1 ו-2. הנקודה היא לא להתחיל לחקור כשזה מגיע |
מה שהטבלה הזאת אמורה להבהיר הוא ששלב 1 הוא היחיד שאפשר לקדם בידיים שלכם היום. טבלת ההחלטות בפרק 6 אומרת על כמה סעיפים שתכונה משלב 2 “יכולה להיות התשובה”, אבל כל אחד מהם מותנה בבדיקת זמינות. תאריכי אספקה יכולים להשתנות, ולכן תמיד בדקו מחדש את תוכן הטבלה הזאת בנקודה שבה הארגון שלכם מקבל את ההחלטה.
3. למה זה נעלם — שלוש דקות
רק המינימום הנדרש כקלט להחלטת המיגרציה. הטיפול המפורט באיורים נשאר למאמר הנלווה.
בתיעוד של הגדרות המדיניות, Microsoft קובעת בפשטות שאימות NTLM ו-NTLMv2 פגיע למגוון התקפות זדוניות, כולל SMB relay, man-in-the-middle ותקיפות brute force.7 בשורש העניין עומדות התכונות הבאות, שמוסברות בדרך כלל בהשוואה ל-Kerberos.8
אין אימות הדדי
ב-NTLM, לקוח לא יכול לאמת את זהותו של שרת, ושרת אחד לא יכול לאמת את זהותו של שרת אחר. NTLM תוכנן לסביבות רשת שבהן אפשר להניח ש”השרת אמיתי”. Kerberos לא מניח הנחה כזאת. ההבדל הזה הוא מה שמאפשר התקפות relay, שבהן קורבן גורם לשלוח את פרטי האימות שלו לשרת מזויף.
באימות דומיין, השרת פונה ל-DC
ב-NTLM, שרת אפליקציות צריך להתחבר לבקר דומיין בכל פעם שהוא מאמת לקוח עם חשבון דומיין (עבור חשבון מקומי של השרת, השרת מתייעץ עם מסד החשבונות שלו ומחליט שם).6 ב-Kerberos, כרטיסי session מתחדשים מחליפים את אימות ה-pass-through הזה, והשרת לא צריך לפנות לבקר דומיין אלא כשצריך לאמת את ה-PAC (privilege attribute certificate).
האש שנגנב מנוצל בלי לדעת את הסיסמה
פרטי האימות של NTLM מורכבים משם דומיין, שם משתמש ו-hash חד-כיווני של הסיסמה (רק הסיסמה עוברת hash), והלקוח מצפין את ה-challenge עם ה-hash הזה כדי להפיק את ה-response שלו.5 מכאן נובעת התכונה שגניבת ה-hash מספיקה כדי להתחזות למשתמש, בלי לדעת את הסיסמה בטקסט גלוי.
המשמעות המעשית של “אין אימות הדדי” היא שניסיון פשוט להתחבר ל-share של SMB יכול למסור את פרטי האימות שלכם לשרת מזויף. הסיבה ש-Microsoft בנתה חסימת NTLM לתוך לקוח ה-SMB מתוארת באותה צורה: למנוע טכניקות שגורמות לשלוח בקשות NTLM לשרתים זדוניים.4
4. ביקורת — בניית רשימה של היכן משתמשים ב-NTLM
זה הלב של המאמר. ההנחיה של Microsoft עצמה קובעת במפורש שגילוי וביקורת של המצב הנוכחי של תעבורת אימות NTLM הכרחיים לפני יישום מדיניות הגבלה.9
4.1. הפעלת מצב ביקורת
הערה: מצב ביקורת רק רושם; הוא לא חוסם דבר. מנגד, בסביבה עם מחשבים רבים נפח היומן קופץ מיד. אם אתם לא משתמשים באיסוף אירועים (WEF), עברו על מגבלת גודל היומן ותקופת השמירה לפני שאתם מפעילים. ההנחיה של Microsoft אומרת גם שהניתוח עלול לקחת כמה חודשים בהתאם למורכבות הסביבה.3
את תקופת הביקורת ספרו מרגע שההגדרות הגיעו למחשבי היעד. כדי לא לפספס עיבוד חודשי או מסלולים שמשמשים רק בתקלה, קראו גם את סעיף 9.2 על “מחזור עסקי שלם”.
איפה מגדירים, ושלוש המדיניות
יש שלוש מדיניות להגדיר. כולן נמצאות תחת Computer Configuration\Windows Settings\Security Settings\Local Policies\Security Options, ולא נדרש restart. בין אם תשמרו אותן מקומית ובין אם תפיצו אותן ב-Group Policy, הן נכנסות לתוקף ברגע שההגדרה מיושמת.7
אל תשתמשו בשעה שבה שמרתם את ה-GPO כתחילת הביקורת
“לא נדרש restart” ו”נכנס לתוקף בכל מחשב מיד” הם לעומת זאת שני דברים שונים. כשאתם מפיצים GPO של דומיין, שמירת ה-GPO מעדכנת רק את המדיניות ב-AD וב-SYSVOL; כל מחשב מתחיל לבצע ביקורת בפועל ב-refresh הבא שלו ברקע או אחרי שאתם מריצים gpupdate /force. ספרו את תחילת תקופת הביקורת מהרגע שההגדרות סיימו להגיע למחשבי היעד, ולא מהרגע שמרתם את ה-GPO. אם תטעו בזה, התוצאה תיטה לכיוון מסוים: רק הצבירה הראשונה תכסה פחות מחשבים ממה שאתם חושבים.
| מדיניות | חלה על | ערך |
|---|---|---|
| Network security: Restrict NTLM: Audit NTLM authentication in this domain | בקרי דומיין | Enable all |
| Network security: Restrict NTLM: Audit Incoming NTLM Traffic | כל השרתים והלקוחות | Enable auditing for all accounts |
| Network security: Restrict NTLM: Outgoing NTLM traffic to remote servers | כל השרתים והלקוחות | Audit all |
לשלישית, “Outgoing NTLM traffic to remote servers”, יש ארבעה ערכים: Allow all, Audit all, Deny all ו-Not Defined, ו-Not Defined מתייחס לאותו דבר כמו Allow all. ההמלצה של Microsoft ברורה באותה מידה: אל תקפצו ישר ל-“Deny all”; הגדירו קודם “Audit all”, עברו על ה-operational log, הבינו אילו שרתים מקבלים בקשות אימות, ורק אז בנו את רשימת החריגים.7
מסתכלים על NTLM/Operational, לא על ה-Security log
האירועים נרשמים ב-Event Viewer > Applications and Services Logs > Microsoft > Windows > NTLM (Microsoft-Windows-NTLM/Operational). אין מדיניות של security audit event שמתאימה לביקורת הזאת, ולכן מסתכלים על ה-channel הזה ולא על ה-Security log.7
להתאים את תפקיד המחשב לאירועים שהוא רושם
הדבר היחיד שהכי קל לטעות בו בשטח הוא המיפוי של “איזו מדיניות שמים על איזה מחשב, ואיזה אירוע מסתכלים עליו”. אם נקרא לשלוש המדיניות בטבלה שלמעלה (1), (2) ו-(3), הרי זו רשימת הבדיקה.
| סוג מחשב | מדיניות להפעיל | אירועים להסתכל עליהם | מה זה אומר לכם |
|---|---|---|---|
| בקר דומיין | (1) (רק ב-DC) גם (2) ו-(3) מוגדרים, כי ה-DC עצמו מתקשר גם כשרת וגם כלקוח |
8004 | עבור אימות עם חשבונות דומיין — איזה משתמש אומת ב-NTLM מול איזה שרת (Secure Channel Name) |
| שרת חבר (שרתי קבצים, שרתי אפליקציות) |
(2)(3) | 8003 (נכנס) 8001 (יוצא מהשרת הזה עצמו) |
מאיזה לקוח זה הגיע. PID 4 (SYSTEM) אומר שזה הגיע דרך SMB (סעיף 4.5) |
| מחשב לקוח | (2)(3) | 8001 (יוצא) | Target Server ו-Client Process Name. כאן מאתרים את הסיבה |
| מחשבי Workgroup, גישה ל-share עם חשבונות מקומיים | (2)(3) (בשני הקצוות אם העמית הוא Windows) | 8003 ו-8001 בלבד | כיוון שזה לא עובר דרך ה-DC, לא מופיע 8004. המסלול הזה נראה רק ביומני השרת והלקוח3 |
היומן הוא אותו Microsoft-Windows-NTLM/Operational בכל מחשב. מדיניות (1) משפיעה רק על בקרי דומיין, ומחשב ששכחתם בו את (2) ו-(3) אינו “מחשב שלא משתמש ב-NTLM” אלא “מחשב שלא רושם”. ההבדל הזה הוא מקור ההטיה הגדול ביותר בצבירות.
4.2. לעקוב “מבקר הדומיין והלאה במורד הזרם”
מתחילים מלהפריד בין החשבונות שמשמשים לאימות. עבור חשבונות דומיין, עוקבים מבקר הדומיין והלאה; עבור חשבונות מקומיים, עוקבים מהשרת ומה-לקוח.3
שימו לב גם שיש מקרים שבהם לא מופיע 8004 בבקר הדומיין, כי כשמשתמש מקומי מתחבר לשרת קבצים, האימות הזה לא עובר דרך בקר דומיין.3 אל תסיקו “יומני ה-DC היו דלילים, אז אנחנו בסדר”.
חשבונות דומיין: עוקבים 8004 → 8003 → 8001
מסלול המעקב לחשבונות דומיין שנותנת ההנחיה של Microsoft הוא כזה.3
flowchart TD
DC["בקר דומיין<br/>אירוע 8004"]
MS["שרת חבר<br/>אירוע 8003"]
CL["לקוח<br/>אירוע 8001"]
APP["האפליקציה האשמה"]
DC -->|"Secure Channel Name =<br/>השרת לבדיקה"| MS
MS -->|"Workstation Name =<br/>הלקוח לבדיקה"| CL
CL -->|"Client Process Name"| APP
MS -.->|"PID 4 (SYSTEM) אומר<br/>שזה הגיע דרך SMB"| CL
איור 1: הסדר שבו עוקבים אחרי אירועי הביקורת של NTLM
השדות שמסתכלים עליהם בכל אירוע הם אלה.3
| אירוע | איפה הוא נרשם | שדות עיקריים | איך לקרוא אותו |
|---|---|---|---|
| 8004 | בקר דומיין | Time / Secure Channel Name / User Name / Domain Name / Workstation Name | “Secure Channel Name” הוא השרת החבר שאליו התחבר הלקוח. בהמשך מסתכלים על 8003 בשרת הזה |
| 8003 | שרת חבר | Time / User Name / Domain Name / Workstation Name / PID | PID 4 (SYSTEM) אומר שזה עבר במצב kernel, כלומר דרך SMB. מסתכלים על 8001 בלקוח שמופיע ב-“Workstation Name” |
| 8001 | לקוח | Time / Target Server / Specified User / Specified Domain / Client Process Name / Client Process User Identity | כאן מאתרים את הסיבה. אם “Target Server” אינו בצורת NetBIOS ולא בצורת FQDN (כלומר כתובת IP), Kerberos לא ישמש בתצורת ברירת המחדל |
הדברים האחרונים שמסתכלים עליהם הם היעד ושם התהליך
מה שהופך את המסלול הזה לבעל ערך במיוחד הוא “Target Server” ו-“Client Process Name” באירוע 8001. הראשון אומר לכם ישירות למה זה לא הפך ל-Kerberos, והשני אומר לכם ישירות מי אשם. ההנחיה של Microsoft מתארת את אותו דבר: מהמידע הזה אפשר לקבוע שמשתמש מתחבר לכתובת ה-IP של שרת אינטרנט ולא לשם NetBIOS או ל-FQDN שהיו מאפשרים Kerberos.3
4.3. צבירה עם PowerShell
שלב 1: לספור את מזהי האירועים שנרשמו במחשב
להסתכל על אלפי רשומות בממשק של Event Viewer זה לא ריאלי, ולכן מסכמים אותן עם Get-WinEvent. קודם בודקים אילו אירועים מופיעים במחשב וכמה מכל אחד.
# צבירת אירועי NTLM/Operational לפי ID (להריץ כמנהל)
Get-WinEvent -FilterHashtable @{
LogName = 'Microsoft-Windows-NTLM/Operational'
StartTime = (Get-Date).AddDays(-7)
} -ErrorAction SilentlyContinue |
Group-Object Id |
Sort-Object Count -Descending |
Select-Object Count, @{ N = 'EventId'; E = { $_.Name } }
שלב 2: לפתוח אירוע 8001 אחד ולבדוק את שמות השדות בפועל
אחרי שאימתתם שאירועים מופיעים, קבצו את אירועי 8001 בצד הלקוח לפי “שרת היעד כפול התהליך הקורא”. פריסת השדות של אירוע שונה בין מזהי אירוע, ולכן הגישה הבטוחה היא לפתוח אירוע אחד עם Format-List ולבדוק קודם את המבנה שלו, ואז להחליט לפי אילו שמות שדות לצבור.
# קודם בודקים אירוע אחד
$sample = Get-WinEvent -FilterHashtable @{
LogName = 'Microsoft-Windows-NTLM/Operational'
Id = 8001
} -MaxEvents 1
$sample | Format-List TimeCreated, Id, Message
# כדי לראות את השדות המובנים
([xml]$sample.ToXml()).Event.EventData.Data |
Select-Object Name, '#text'
שלב 3: לצבור לפי יעד כפול תהליך קורא
כשמכירים את המבנה, שולפים את הערכים לפי מאפיין ה-Name ב-XML ומצברים. שמות המאפיינים שונים בין גרסאות מערכת הפעלה, ולכן חיפוש שלהם לפי שם נשבר פחות מאשר שימוש באינדקסים לפי מיקום.
# צבירת 8001 של 7 הימים האחרונים לפי "יעד × תהליך קורא"
$events = Get-WinEvent -FilterHashtable @{
LogName = 'Microsoft-Windows-NTLM/Operational'
Id = 8001
StartTime = (Get-Date).AddDays(-7)
} -ErrorAction SilentlyContinue
$rows = foreach ($e in $events) {
$data = @{}
foreach ($d in ([xml]$e.ToXml()).Event.EventData.Data) {
$data[$d.Name] = $d.'#text'
}
[pscustomobject]@{
Time = $e.TimeCreated
# לאסוף רק את שמות השדות שקיימים בפועל, לפי סדר עדיפות
Target = @('TargetName', 'TargetServer', 'ServerName') |
Where-Object { $data.ContainsKey($_) } |
ForEach-Object { $data[$_] } | Select-Object -First 1
Process = @('ClientProcessName', 'ProcessName', 'ApplicationName') |
Where-Object { $data.ContainsKey($_) } |
ForEach-Object { $data[$_] } | Select-Object -First 1
}
}
$rows | Group-Object Target, Process |
Sort-Object Count -Descending |
Select-Object Count, Name
שלב 4: להסתכל על היעד ועל האפליקציה שאחראית, לא על מספר המופעים
הצבירה הסופית מחזירה שתי עמודות: Count ו-Name (היעד והתהליך הקורא מחוברים בפסיק). כלומר, הפלט נראה כך (הערכים להמחשה בלבד).
Count Name
----- ----
412 192.168.1.10, System
118 fileserver.corp.example.com, System
57 192.168.1.24, MyBizApp.exe
9 legacy-nas, System
מה שמסתכלים עליו הוא המחצית הראשונה של Name, כלומר היעד. כך קוראים כל שורה.
הצורה של Name |
המשמעות | מה עושים בהמשך |
|---|---|---|
המחצית הראשונה היא כתובת IP (למשל 192.168.1.10, ...) |
התבנית המסוכנת ביותר. כברירת מחדל לא מנסים אימות Kerberos כששם המארח הוא כתובת IP, ולכן השורה הזאת מבניתית לא יכולה להפוך ל-Kerberos10 | להחליף את היעד ל-FQDN (פרק 6). עבודה מלמעלה למטה מהשורות עם מספר המופעים הגבוה ביותר מקטינה את הסך הכול במהירות |
| המחצית הראשונה היא שם NetBIOS או FQDN | השם עצמו תקין. אם זה עדיין NTLM, הבעיה היא SPN שלא נרשם, alias או נתיב הרשת | לסדר את הסיבה עם הטבלה בפרק 5 |
המחצית השנייה היא תהליך מערכת כמו System |
כנראה דרך SMB (PID 4). עד כאן אפשר לזהות את האפליקציה הקוראת | לאמת שה-PID הוא 4 באירוע 8003 בשרת, ואז להרים ProcMon על המחשב הזה בלבד (סעיף 4.5) |
המחצית השנייה היא שם של קובץ הרצה (למשל MyBizApp.exe) |
האפליקציה שאחראית כבר מזוהה. זו הסוג הקל ביותר לתיקון | לעבור על הגדרות היעד של האפליקציה הזאת (סעיף 8.2) |
המחצית השנייה של Name ריקה, או ריקה בכל השורות |
שם השדה ששימש לצבירה לא תואם לסכימה בפועל | להוסיף את השם שאימתתם בשלב הקודם למערך המועמדים |
המספר המוחלט לבדו אומר מעט. מסתכלים על שני דברים: האם שורות שמופנות לכתובות IP נמצאות למעלה, וכמה שורות מגיעות עד לשם של קובץ הרצה. הראשונות הן תלויות שבטוח ייפלו אחרי התיקון; השניות הן תלויות שאפשר להקצות להן אחראי.
אם הצבירה מחזירה ריקים או PIDs, לחזור לשמות השדות
כיוון ששמות השדות שונים בין גרסאות מערכת הפעלה, הקוד מפרט מועמדים במערך לפי סדר עדיפות ולוקח רק את אלה שקיימים. אם תשתמשו כאן בהתאמה חלקית כמו -match 'Process', גם שדות PID כמו ClientProcessId ייתפסו, ותיגמרו בצבירה לפי PID שמשתנה בכל פעם במקום לפי שם קובץ ההרצה (סדר המפתחות בטבלת hash אינו מוגדר, ולכן גם לא מובטח מה תקבלו). אם עמודת ה-Process יוצאת ריקה בכל השורות, זה הסימן ששמות המועמדים שלכם לא תואמים לסכימה בפועל, ולכן הוסיפו את השם שאימתתם בשלב הקודם למערך.
לפני שמתרחבים, לוודא שמחשב אחד נקרא באותה צורה
אם אתם אוספים מכמה מחשבים, הרצה במקביל עם PowerShell Remoting היא הדרך המהירה (“מבוא ל-PowerShell Remoting (WinRM) — ניהול כמה מחשבי Windows בבת אחת”). השאלה אם אתם משתמשים ב--FilterHashtable עושה הבדל של סדר גודל בזמן שסינון Get-WinEvent לוקח; העיקר של זה מרוכז ב-“חקירת יומני אירועים בפועל עם Get-WinEvent — מהירות הסינון קובעת כמה זמן החקירה תיקח”.
4.4. להסתכל מהצד של ה-Security log — האם NTLMv1 עוד בשימוש?
בנפרד מ-NTLM/Operational, יש גם דרך לבדוק את גרסת ה-NTLM מאירועי ההתחברות ב-Security log. הנוהל הוא לחפש ב-Security log את “Authentication Package” ולהסתכל על “Detailed Authentication Information” בכל אירוע.3
Detailed Authentication Information:
Logon Process: NtLmSsp
Authentication Package: NTLM
Transited Services: -
Package Name (NTLM only): NTLM V1
Key Length: 128
רשומות NTLM V1 מטופלות בנפרד ובעדיפות גבוהה יותר
ה-“Package Name (NTLM only)” הזה מראה איזה תת-פרוטוקול ממשפחת NTLM שימש.3 מארח שמציג NTLM V1 הוא מועמד לכשלי אימות ברגע שתשדרגו אותו ל-Windows 11 24H2 או ל-Windows Server 2025, כי NTLMv1 הוסר בגרסאות האלה.1 כשאתם מריצים את הביקורת, העלו את העדיפות של ההיבט הזה במיוחד.
4.5. כשהכול מציג PID 4 (SYSTEM) ואי אפשר להתקדם
תתחילו לבצע ביקורת וכמעט בטוח תיתקלו בקיר הזה. באפליקציות שמתקשרות דרך ה-redirector, כמו SMB (תיקיות משותפות), הגורם שמבקש אימות הוא ה-redirector במצב kernel, ולכן ה-PID שנרשם באירוע הוא תמיד 4 (SYSTEM).3
לצמצם למחשב אחד בעזרת היומנים, ואז לרדוף אחרי המחשב הזה עם ProcMon
התרופה שנותנת ההנחיה של Microsoft היא כזאת.3
- להתקין כלי לניטור תהליכים בלקוח ששולח את פרטי האימות של NTLM (ה-“Computer” באירוע 8001).
- לסנן נתיבים לפי גם שם המחשב של שרת העמית וגם כתובת ה-IP שלו. אם צריך לתעד לאורך זמן, להריץ במצב background.
- להצליב את התיעוד עם חותמות הזמן של אירוע 8003 בצד השרת. המשתמש, הנתיב ומזהה האימות מסתדרים, ומשם אפשר לזהות את האפליקציה הקוראת.
הכלי הוא Process Monitor (ProcMon). איך מחילים סינון ואיך קוראים את הפלט מרוכזים ב-“מדריך מעשי ל-Process Monitor (ProcMon) — לאתר בזמן של 10 דקות הגדרה שלא הוחלה ו-ACCESS DENIED”.
טיפ מעשי אחד להוסיף: הרבה יותר מהיר לצמצם את “איזה מחשב” בעזרת יומני האירועים בלבד עד לנקודה הזאת, ורק אז להרים ProcMon על המחשב האחד הזה. לפרוס ProcMon על כל מחשב זה לא ריאלי.
5. תבניות אופייניות שנופלות חזרה ל-NTLM
אחרי שהביקורת אמרה לכם איפה, השלב הבא הוא לסווג את הסיבות. ההנחיה של Microsoft מפרטת את ארבעת אלה כאפליקציות שמשתמשות ב-NTLM למרות שהן תומכות תאורטית ב-Kerberos.3
- אפליקציות שמאפשרות לבחור בין תצורות אבטחה ו-providers שונים
- אפליקציות שה-SPN (service principal name) שלהן לא מוגדר נכון
- אפליקציות שמשתמשות בכתובת IP ולא בשם DNS בגלל תצורה שגויה או תיעוד של הספק
- אפליקציות עם קוד בסיס ישן שעדיין יש בהן חלקים שתומכים רק ב-NTLM
הבלוג של התמיכה הטכנית של Microsoft Japan מונה את הסיבות האופייניות לשימוש ב-NTLM: גישה לשרת שצוינה לפי כתובת IP, הגבלות firewall על הפורטים ש-Kerberos צריך, SPN-ים שלא נרשמו, אימות מול שותף מהימן, ואימות בסביבת Workgroup.2
לרשום את הסיבה ואת עדיפות התיקון באותה טבלה
כשמארגנים אותן לפי הצורות שפוגשים בשטח, מקבלים את הטבלה שלמטה. שתי העמודות הימניות הן הקריטריונים לקביעת עדיפות. “רדיוס ההשפעה” פירושו כמה רחב הנזק כשזה נעצר, ו”קלות התיקון” פירושה אם אפשר לתקן לפי החלטה שלכם בלבד. כששני אלה ידועים, הטבלה הופכת לפקודת העבודה בתוכנית כפי שהיא.
| תסמין או תצורה | למה זה הופך ל-NTLM | איך מאמתים | סיווג | רדיוס ההשפעה | קלות התיקון |
|---|---|---|---|---|---|
התחברות לתיקייה משותפת לפי כתובת IP, כמו \\192.168.1.10\share |
כברירת מחדל לא מנסים אימות Kerberos כששם המארח הוא כתובת IP10 | “Target Server” באירוע 8001 הוא כתובת IP | אפשר לתקן מיד | גדול (מספר מופעים גבוה) | גבוהה (הכול בידיים שלכם) |
| הגדרת היעד באפליקציה עסקית היא כתובת IP | כמו למעלה. נהלים של ספקים מרבים לציין IP | לזהות את האפליקציה מ-“Client Process Name” באירוע 8001 | אפשר לתקן מיד | בינוני עד גדול | גבוהה (רק שינוי הגדרה) |
| הגישה משתמשת ב-alias של DNS (CNAME) או בשם מותאם ב-hosts | לא נרשם SPN לשם הזה | לבדוק את רשימת ה-SPN בחשבון השירות הרלוונטי | נפתר ברישום SPN | בינוני | בינונית (עבודה בצד ה-AD, וגם תיאום) |
| שירות פנימי או אתר IIS רץ תחת חשבון ייעודי | לא נרשם SPN בחשבון השירות | כמו למעלה | נפתר ברישום SPN | בינוני | בינונית (צריך לבדוק רישומים כפולים) |
| בקר דומיין לא נגיש דרך סניף או VPN | התעבורה ש-Kerberos צריך לא עוברת, ולכן יש נפילה חזרה | כללי firewall ונגישות ל-DC | בעיה של נתיב רשת | גדול (אתר שלם) | נמוכה (שינוי בתכנון הרשת) |
| NAS, מדפסת רב-תכליתית או סורק שולחים דרך SMB ל-share ב-Windows | ההתקן לא תומך ב-Kerberos, או שהוא מאמת עם חשבון מקומי | הגדרות האימות של ההתקן, ו-8003 בשרת | תלוי בהתקן | בינוני (תהליך עסקי מסוים) | נמוכה (תלוי בתשובת הספק ובהחלפת ההתקן) |
| מחשבי Workgroup, או גישה ל-share עם חשבונות מקומיים (שני הקצוות על Windows עדכני) | זה לא חשבון דומיין, ולכן זה בכלל לא על קרקע של Kerberos | לא מופיע 8004 בבקר הדומיין | שלב 2 יכול לפתור את זה | בינוני | נמוכה (המתנה לתכונה; סעיף 2.1) |
| אותו דבר, אבל העמית הוא Windows ישן או ציוד של צד שלישי | כמו למעלה, אלא שה-KDC המקומי עובד רק בין מחשבי Windows שתומכים בו | לבדוק את גרסת מערכת ההפעלה והדגם של העמית | לפעול בעצמכם (להצטרף לדומיין, להחליף, להשתמש בפרוטוקול אחר, או לעשות חריג) | בינוני | נמוכה (כרוך בתקציב ובעיתוי של החלפה) |
| אימות מול דומיין של חברה אחרת, או מול עמית בלי קשר אמון | אי אפשר להנפיק כרטיס Kerberos | “Specified Domain” באירוע 8001 | נדרשת החלטת תכנון | קטן עד בינוני | נמוכה (תיאום עם הצד השני) |
| מוצר ארוז ישן שמאפשר לבחור את שיטת האימות | ההגדרה נעוצה ב-NTLM | מסך הגדרות האימות של המוצר | לשנות את ההגדרה, או לשאול את הספק | בינוני | בינונית (גבוהה אם הגדרה מספיקה) |
לתת ל-NTLMv1 עדיפות ראשונה, ולהתחיל במקביל תיאומים עם זמן אספקה ארוך
סדר העבודה נובע מכנית משתי העמודות האלה.
- בלי קשר לרדיוס ההשפעה, העדיפות העליונה היא ציוד שיודע לדבר רק NTLMv1 ומארחים שבהם נרשם
NTLM V1(סעיף 4.4). זה יוצא מחוץ לחישוב העדיפות, כי המועד שלו כבר הגיע.1 - אחר כך באים רדיוס השפעה גדול וקלות תיקון גבוהה, כלומר כתובות IP מקודדות. מספר המופעים גבוה ואפשר לתקן לפי החלטה שלכם בלבד. להתרכז בהם בחודש הראשון.
- אחרי זה סעיפי קלות התיקון הבינונית סביב SPN-ים. לעבור עליהם יחד עם האחידות של שמות.
- סעיפי קלות התיקון הנמוכה (תלוי בהתקן, נתיב רשת, המתנה לשלב 2) לא מאחרים להתחיל; פשוט יש להם זמן אספקה ארוך, ולכן מתחילים את הפניות לספקים ואת בקשות התקציב במקביל לסעיפים 1 עד 3.
אלה שמסווגים כ”אפשר לתקן מיד” וכ”נפתר ברישום SPN” אמורים להוות את רוב תוצאות הביקורת. טיפול רק בהם מותיר הרבה פחות חריגים.
6. טבלת החלטות לתיקונים
בוחרים את התיקון לפי הסיווג שקבעתם בפרק 5. קודם עושים את המעבר ל-FQDN ואת בדיקת ה-SPN, ומתייחסים ל-TryIPSPN כמוצא האחרון למקרה שאי אפשר להשתמש בשם. יש חריג לגבי היכן נרשמים SPN-ים עבור IIS, ולכן קראו את סעיף 8.3 על “הזהות שמפענחת את הכרטיס” לפני שמתחילים.
| סיווג | מה עושים | נקודות לתשומת לב |
|---|---|---|
| כתובת IP מקודדת | להחליף את היעד ל-FQDN. לעבור על קיצורי דרך לתיקיות משותפות, מיפויי כוננים, קבצי תצורה של אפליקציות, קבצי batch, ואפילו על הארגומנטים ב-Task Scheduler | לאמת קודם שפתרון השמות עובד באופן אמין. המלכודות סביב כונני רשת ונתיבי UNC מרוכזות במאמר נפרד |
| כתובת IP מקודדת שבאמת אי אפשר להחליף לשם | להגדיר TryIPSPN בלקוח ולרשום ידנית SPN עבור כתובת ה-IP עם Setspn -s <service class>/<IP address> <account> |
מוצא אחרון. לרשום את מחלקת השירות שהלקוח מבקש בפועל. שירותים שממופים ל-HOST, כמו תיקיות משותפות, מכוסים ב-host/192.168.1.1, אבל האינטרנט צריך HTTP/192.168.1.1 ו-SQL Server צריך SPN אחר שכולל את הפורט, כמו MSSQLSvc/192.168.1.1:1433; רישום של host/ בלבד לא יתאים והאימות ייפול חזרה ל-NTLM. Microsoft עצמה אומרת שכתובות IP הן זמניות, ולכן בדרך כלל לא משתמשים בהן ב-SPN, וזו עבודה ידנית שנועדה רק למקרה שאי אפשר להשתמש בשם DNS. עם DHCP הזמנה סטטית היא תנאי מוקדם. ההגדרה נדרשת בכל לקוח שמבצע את הגישה10 |
| SPN שלא נרשם | לרשום SPN בחשבון שמריץ את השירות, לפי השם שמשמש לגישה | רישומים כפולים של SPN שוברים את אימות Kerberos עצמו. תמיד לבדוק רישומים כפולים קיימים לפני הרישום |
| גישה דרך alias (CNAME) | או לרשום SPN גם ל-alias, או לאחד את הגישה על ה-FQDN | הסיבה היא ש”השם האמיתי” ו”השם שמשמש בפועל” לא מסכימים, ולכן קודם מחליטים על איזה מהם לאחד |
| אתר שלא מגיע ל-DC | לתת לתעבורה ש-Kerberos צריך לעבור. אם התצורה לא נגישה באופן קבוע, IAKerb משלב 2 יכולה להיות התשובה | IAKerb וה-KDC המקומי אמורים להגיע במחצית השנייה של 2026. לבדוק ב-release notes אם הם באמת שמישים בגרסה שאליה אתם מכוונים2 |
| תפעול עם חשבונות מקומיים | קודם למיין לפי מה שהעמית באמת. בין מחשבי Windows שתומכים בכך, ה-KDC המקומי משלב 2 יכול להיות התשובה, אבל Windows ישן וציוד של צד שלישי (NAS, מדפסות רב-תכליתיות וכדומה) לא מכוסים בו. עבור האחרונים, לבחור בין הצטרפות לדומיין, החלפת ההתקן, מעבר לפרוטוקול אחר, או רשימת חריגים | אל תאחדו הכול ותשימו את זה על המדף בטענה ש”חשבונות מקומיים, אז מחכים לשלב 2”. מה ש-IAKerb פותר הוא נגישות ל-DC, לא אם חשבונות מקומיים או ציוד של צד שלישי נתמכים. נאמר ש-NTLM נשאר הכרחי לאימות התחברות מקומי ולתצורות Workgroup62 |
| NAS ומדפסות רב-תכליתיות | לשאול את היצרן על תמיכה ב-firmware. אם תמיכת Kerberos בלתי אפשרית, לעבור למסלול אספקה שאינו SMB (SMTP, FTPS, תיקייה ייעודית), או להחליף את ההתקן | ציוד שיודע לדבר רק NTLMv1 הוא העדיפות העליונה. הוא כבר הוסר ב-Windows 11 24H2 וב-Server 20251 |
| מוצר שמאפשר לבחור את שיטת האימות | לבחור Negotiate או Kerberos בהגדרות. אם אי אפשר לבחור, לשאול את הספק על מפת הדרכים שלו | תשובה של “אין תוכניות לתמוך בזה” היא קלט לתוכנית ההחלפה שלכם |
| אפליקציות פנימיות | להחליף NTLM בשם ב-Negotiate (פרק 8) | מה שצריך תיקון הוא לא רק הקוד אלא גם הדרך שבה כתוב היעד |
| כל מה שבאמת נשאר | לרשום אותו ברשימת החריגים של השרת, ולספור את המחשבים האלה בכל שנה | חריג הוא תקופת חסד עד להסרה, לא פתרון. להשתמש בשאלה אם המספר יורד כמדד7 |
7. חסימת NTLM ב-SMB — הדרך הקצרה לבדיקה אמיתית
לוגי הביקורת אומרים לכם שמשהו נמצא בשימוש, אבל לא מה יקרה אם תעצרו אותו. כאן עוזרת חסימת ה-NTLM בצד לקוח ה-SMB שנוספה ב-Windows Server 2025 וב-Windows 11 גרסה 24H2.4
התכונה חוסמת את לקוח ה-SMB מלהשתמש באימות NTLM בחיבורים יוצאים למחשבים מרוחקים. Microsoft קובעת שזה מונע טכניקות שגורמות לשלוח בקשות NTLM לשרתים זדוניים ומתמודד עם תקיפות brute force, cracking ו-Pass-the-Hash, וממקמת את חסימת NTLM כמה שהכרחי למעבר של פרוטוקול האימות של הארגון ל-Kerberos. במקביל היא כותבת שאפשר להפעיל את שכבת ההגנה הזאת לבדה, בלי להשבית את NTLM לגמרי.4
הערה: זו תכונה של לקוח ה-SMB.4 NTLM במסלולים שאינם SMB (תעבורת HTTP מהאפליקציות שלכם, חיבורים ל-SQL Server, WinRM וכדומה) לא נעצר על ידה. את אלה צריך לחסל בנפרד, לפי הסיווג בפרק 5.
יש שני תנאים מוקדמים.4
- לקוח ה-SMB הוא Windows Server 2025 ואילך, או Windows 11 גרסה 24H2 ואילך
- שרת ה-SMB ביעד יכול להשתמש ב-Kerberos (מערכת ההפעלה בצד שרת ה-SMB יכולה להיות כל דבר שתומך ב-PKU2U או ב-Kerberos)
7.1. לבדוק קודם מחשב אחד וחיבור אחד
במקום לדחוף מדיניות מיד, מנצלים את העובדה שאפשר לציין את החסימה לכל חיבור בנפרד. כדי לשפוט את התוצאה צריך עם זאת לסגור את ה-session הקיים ולאמת שהחיבור עובד בלי הדגל. שתי הפקודות שלמטה הן דוגמאות לתחביר; את הבדיקה בפועל מריצים בארבעת השלבים בהמשך.
# לנסות להתחבר עם איסור NTLM בחיבור הזה בלבד (אם זה מתחבר, ה-share הזה לא צריך NTLM)
NET USE \\fileserver.corp.example.com\share /BLOCKNTLM
# אותו דבר אפשר לעשות עם מיפוי ב-PowerShell
New-SmbMapping -RemotePath \\fileserver.corp.example.com\share -BlockNTLM $true
אם זה מתחבר כשהתנאים המוקדמים מתקיימים, אפשר להסיק שהמסלול הזה עובד בלי NTLM. אם זה נכשל, להשוות מול בדיקה בלי הדגל כדי להפריד את הסיבה. כיוון שאפשר לבדוק חיבור אחד בכל פעם בלי לשנות מדיניות, זה מתאים היטב לאימות לוגי הביקורת.
בודקים את התוצאה בשלושה שלבים. אל תסיקו על תלות ב-NTLM מהניסוח של הודעת שגיאה בלבד.
| מה רוצים לאמת | איפה בודקים | איך קוראים את זה |
|---|---|---|
| האם זה התחבר | תוצאת הפקודה, רשימת net use, Get-SmbConnection -ServerName <server name> |
בהצלחה נוצר מיפוי; בכשל זה נגמר בשגיאה ולא נשאר מיפוי |
| האם הכשל נגרם מ-NTLM | ההשוואה מול חיבור בלי הדגל, בשלב 3 שלמטה | אם זה נכשל גם בלי הדגל, הבעיה היא משהו אחר, כמו פתרון שמות, פרטי אימות או הרשאות |
| איזו שיטת אימות באמת שימשה | כרטיס ה-cifs/ לשרת הזה ב-klist, או ה-Security log בצד השרת |
להפריד בין “זה לא השתמש ב-NTLM” ל-“זה השתמש ב-Kerberos”. פירוט בסוף הסעיף |
ארבעה שלבים כדי להימנע מפסק דין שגוי
הבדיקה הזאת דורשת נוהל. אם תריצו אותה בלי מחשבה תקבלו פסקי דין שגויים בשני הכיוונים.
$server = 'fileserver.corp.example.com'
# 1. להסיר כל מיפוי אחרון לשרת הזה
# אם נשאר אפילו share אחד אחר, ה-session לשרת נשאר בחיים
net use | Select-String $server # קודם לראות מה מחובר
net use \\$server\share /delete
net use \\$server\other /delete # וגם כל share אחר על אותו שרת
# 2. לאמת שה-session באמת נעלם (לא להמשיך עד שזה ריק)
Get-SmbConnection -ServerName $server
# 3. קודם לאמת שזה מתחבר בלי הדגל (כשל כאן אינו בעיית NTLM)
net use \\$server\share
net use \\$server\share /delete
Get-SmbConnection -ServerName $server # גם כאן לחזור לריק
# 4. ורק אז לנסות עם /BLOCKNTLM
net use \\$server\share /BLOCKNTLM
שלבים 1 ו-2: לפרק את ה-session לשרת, לא רק ל-share
session-ים של SMB הם לפי שרת, לא לפי share. אם נשאר session מאומת לשרת הזה, ה-redirector עושה בו שימוש חוזר במקום לאמת שוב. /BLOCKNTLM משפיע רק על האימות שמבוצע עבור המיפוי הזה; הוא לא מאמת בדיעבד session שכבר הוקם (ושאולי הוקם עם NTLM).
במילים אחרות, /delete על ה-share הנבדק לבדו אינו מספיק. אם share אחר על אותו שרת עוד מחובר, זה יצליח למרות שקיימת תלות ב-NTLM. להביא את זה עד ש-Get-SmbConnection לא מחזיר דבר. מלבד המיפויים שלכם, גם אפליקציות שפועלות ברקע ומשימות גיבוי יכולות להחזיק session. הגישה האמינה והמהירה ביותר היא לבדוק ממחשב שמעולם לא התחבר לשרת הזה.
שלב 3: להשתמש בהצלחה בלי הדגל כבסיס להשוואה
הרצה עם /BLOCKNTLM נכשלת גם בגלל כשל בפתרון שמות, פרטי אימות שגויים או הרשאות לא מספיקות על ה-share עצמו. אם זה נכשל גם בלי הדגל, זו לא תלות ב-NTLM אלא בעיה אחרת.
הצלחה לא קובעת אוטומטית את שיטת האימות
שימו לב שכל מה שאפשר לומר כאן הוא “זה לא היה צריך את NTLM”, ולא “זה אומת עם Kerberos”. התנאי המוקדם של התכונה הזאת הוא “שרת SMB שיכול להשתמש ב-Kerberos”, אבל היעד רשאי להיות מערכת הפעלה שתומכת ב-PKU2U.4 זה משאיר אפשרות שהסיבה להצלחה הייתה PKU2U ולא Kerberos. כשהעמית הוא שרת קבצים שהצטרף לדומיין זה כנראה לא ישנה, אבל כשרוצים לקבוע בדיוק מה אומת, מריצים klist בלקוח אחרי ההתחברות ורואים אם התקבל כרטיס cifs/ לשרת הזה, או בודקים את חבילת האימות של אירוע ההתחברות ב-Security log בצד השרת (סעיף 4.4).
7.2. הפעלה לפי מחשב
אחרי שהאימות הושלם, עוברים לחסימה בכל המחשב במחשבי ה-pilot.4
# לחסום NTLM בכל לקוח ה-SMB (להריץ כמנהל)
Set-SmbClientConfiguration -BlockNTLM $true
ב-Group Policy מפעילים את “Block NTLM (LM, NTLM, NTLMv2)” תחת Computer Configuration > Administrative Templates > Network > Lanman Workstation.4
7.3. עמיתים שאי אפשר לשנות נכנסים לרשימת החריגים
עמיתים שבאמת צריכים NTLM, כמו שרתי SMB שלא הצטרפו לדומיין, יכולים להיות חריגים. מפעילים ב-Group Policy את Lanman Workstation > Block NTLM Server Exception List ורושמים את כתובות ה-IP, שמות ה-NetBIOS וה-FQDN-ים שרוצים לאפשר.4
להפריד בין חריגים קבועים לבין עריכות registry של חירום
אין cmdlet של PowerShell ליצירת רשימת החריגים עצמה, ולכן את התצורה הראשונה חייבים לעשות ב-Group Policy Editor; אחרי שהיא קיימת, אפשר להוסיף רשומות בודדות בעריכת registry.4
# להוסיף רשומות לרשימת חריגים קיימת
$params = @{
Path = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\LanmanWorkstation"
Name = "BlockNTLMServerExceptionList"
}
$Entries = "192.168.10.10", "corp.contoso.com", "CORP"
$CurrentValue = (Get-ItemProperty @params -ErrorAction SilentlyContinue).BlockNTLMServerExceptionList
$params["Value"] = if ($null -eq $CurrentValue) { $Entries }
else { $CurrentValue + $Entries }
Set-ItemProperty @params
הערה: בדוגמה שמפורסמת בתיעוד של Microsoft, הענף של “הערך עוד לא קיים” מגדיר רק
@(""), ולכן הרשומות שרציתם להוסיף נזרקות לפח.4 ההתנהגות היא שהרצה ראשונה לא מוסיפה אף חריג ורק ההרצה השנייה מוסיפה, ולכן הקוד שלמעלה כותב את הרשומות כפי שהן גם במקרה שהערך עוד לא נוצר. עם זאת, ערך ה-registry הזה הוא טריטוריה שמנוהלת על ידי Group Policy. נהלו חריגים קבועים בצד ה-Group Policy והגבילו את הפעולה הזאת לשימוש של חירום וזמני. יישום המדיניות הבא ידרוס אותה.
8. NTLM מנקודת המבט של המפתח — להשתמש ב-Negotiate
אם אתם בונים אפליקציות Windows בעצמכם, מה שצריך לתקן ברור. Microsoft קובעת את הדבר הבא במפורש.5
אפליקציות לא אמורות לגשת ישירות ל-NTLM security package; במקום זאת הן אמורות להשתמש ב-Negotiate security package. Negotiate מאפשר לאפליקציות ליהנות מפרוטוקולי אבטחה מתקדמים יותר אם המערכות שמשתתפות באימות תומכות בהם. נכון להיום, חבילת האבטחה Negotiate בוחרת בין Kerberos ל-NTLM. Negotiate בוחר Kerberos אלא אם אחת המערכות שמשתתפות באימות לא יכולה להשתמש בו.
בקיצור, הכלל הוא להחליף את המקומות שכתוב בהם “NTLM” ב-“Negotiate”. גם רשימת התכונות שהוצאו משימוש אומרת את אותו דבר: יש להחליף קריאות ל-NTLM בקריאות ל-Negotiate.1
8.1. ה-“ציון NTLM” הנפוץ ב-.NET
להחליף רק את סוג האימות, לא את החשבון שמאמת
// רע: מציין NTLM כסוג האימות
var credential = new NetworkCredential(user, password, domain);
var cache = new CredentialCache();
cache.Add(new Uri("http://intra.example.local/"), "NTLM", credential);
var handler = new HttpClientHandler { Credentials = cache };
// טוב: רק סוג האימות משתנה. פרטי האימות מועברים כמו קודם
var credential = new NetworkCredential(user, password, domain);
var cache = new CredentialCache();
cache.Add(new Uri("http://intra.example.local/"), "Negotiate", credential);
var handler = new HttpClientHandler { Credentials = cache };
מה שמשתנה כאן הוא רק המחרוזת של סוג האימות. אם תחליפו את credential ב-CredentialCache.DefaultNetworkCredentials, תשנו לא רק את פרוטוקול האימות אלא את הזהות שמאמתת. האימות ייצא אז כחשבון שמריץ את התהליך (חשבון שירות או המשתמש המחובר) ולא כחשבון שציינתם, ובהתאם להרשאות ביעד זה יכול להפסיק לעבוד. החזיקו את החלפת הפרוטוקול ואת כל בחינה מחדש של פרטי האימות כשינויים נפרדים.
מעבר לאימות כהמשתמש הנוכחי הוא החלטה נפרדת
אם לעומת זאת מה שאתם רוצים מלכתחילה הוא לאמת עם פרטי האימות של המשתמש המחובר (אימות Windows משולב), אפשר לכתוב את זה הרבה יותר פשוט. כך כותבים את זה כשאתם משנים בכוונה את “מי שאתם מאמתים בתורו”.
// אימות Windows משולב (אימות כהמשתמש המחובר כרגע)
var handler = new HttpClientHandler
{
UseDefaultCredentials = true,
};
הטיפול ב-HttpClient עצמו (לא לעטוף אותו ב-using, תבניות יצירה, תכנון timeouts) מכוסה ב-“אל תעטפו את HttpClient ב-using — תקשורת HTTP מעשית באפליקציות עסקיות ב-C# (תבניות יצירה, timeouts, retries)”.
כשעובדים ישירות עם SSPI, גם שם מציינים Negotiate
אם אתם חייבים לעבוד ישירות עם SSPI, System.Net.Security.NegotiateAuthentication, שנוסף ב-.NET 7, מאפשר לטפל באימות מעל Negotiate מקוד מנוהל. גם כאן הנקודה המרכזית היא לא לציין NTLM כשם החבילה.
8.2. “איך כתוב היעד” בא לפני הקוד
גם אם תתקנו את הקוד, אם היעד עוד כתוב ככתובת IP זה יגיע בכל זאת ל-NTLM. כברירת מחדל, כששם המארח הוא כתובת IP, Windows לא מנסה אימות Kerberos מול המארח הזה ונופל חזרה לפרוטוקול תקף אחר, כמו NTLM.10 באופן קונקרטי, עברו על הדברים הבאים.
- שמות שרתים שכתובים בקבצי תצורה (
appsettings.json,App.config, קבצי ini) - ציון השרת במחרוזות חיבור של SQL Server (
Data Source) - מקומות שבהם מרכיבים נתיבי UNC. לחפש כתובות IP מקודדות
- ערכי ברירת מחדל במתקינים ובנהלי התקנה של מחשבים
- מקומות שנכתבו מחדש ככתובת IP בתקלה קודמת “כי פתרון השמות היה לא יציב” ומעולם לא הוחזרו
הסעיף האחרון באמת מופיע בשטח. כתובת IP מקודדת הייתה הפתרון הזמני הנכון בזמנו, אבל היום היא חוב טכני.
8.3. אם אתם בונים את צד השירות
אם אתם רוצים ששירות Windows או אפליקציית IIS שלכם יקבלו Kerberos, עליכם לרשום SPN, לפי השם שהלקוחות משתמשים בו לגישה, בחשבון שמפענח את הכרטיס. כפי ש-Microsoft עצמה מפרטת, אפליקציה בלי SPN רשום היא דוגמה קלאסית לכזו שנופלת חזרה ל-NTLM בעודה מצהירה שהיא תומכת ב-Kerberos.3
ב-IIS, זהות ה-App Pool והזהות שמפענחת אינן בהכרח אותו דבר
אם תחשיבו את יעד הרישום בפשטות כ”החשבון שמריץ את השירות”, תיתקלו ב-IIS. אימות Windows ב-IIS פועל כברירת מחדל עם אימות במצב kernel, ובמקרה הזה מי שמפענח את כרטיס ה-Kerberos הוא לא זהות ה-application pool אלא חשבון המחשב שבו משתמש HTTP.sys. הרצה של ה-application pool תחת חשבון דומיין ייעודי ורישום ה-SPN של ה-HTTP של האתר בחשבון הזה מותירה את בעל ה-SPN ואת החשבון שמפענח בפועל לא מסכימים, והאימות עצמו נכשל עם KRB_AP_ERR_MODIFIED במקום ליפול חזרה ל-NTLM.
הנקודה היא להפוך את יעד רישום ה-SPN ואת הזהות שמפענחת את הכרטיס לאותו דבר. יש שתי צורות שעובדות.
| הזהות שמפענחת את הכרטיס | ההגדרות הנדרשות ויעד רישום ה-SPN |
|---|---|
| חשבון המחשב (ברירת המחדל) | אם האתר מפורסם תחת שם מארח, לרשום את SPN ה-HTTP של שם המארח הזה בחשבון המחשב |
| זהות ה-application pool | להפעיל useAppPoolCredentials, ואז לרשום את SPN ה-HTTP בחשבון של ה-application pool |
מה לבחור תלוי בשאלה אם אותו חשבון שירות משותף לכמה שרתים (אם כן, איחוד על זהות ה-pool קל יותר לניהול). שימו לב שSPN יכול להיות רשום רק בחשבון אחד, ולכן כשאתם מחליפים, אל תשכחו להסיר את הרישום הישן. רישומים כפולים שוברים את אימות Kerberos עצמו.
לבדוק גם את ההאצלה לשרתים אחרים יחד עם שינוי הפרוטוקול
אם התכנון שלכם מתחזה ללקוח כדי לגשת לשרת אחר (delegation), NTLM ו-Kerberos שונים באופן שבו הם מטפלים בזה. Kerberos תומך במנגנון האצלה שבו שירות מתחבר לשירותים אחרים בשם הלקוח, ואילו מה ש-NTLM מספק מגיע רק עד למידע ההרשאה שנדרש כדי להתחזות באופן מקומי.8 הצד המימושי של ההתחזות מכוסה ב-“טיפול נכון ב-impersonation token של Windows — השאלת הרשאות לכל thread וחזרה בטוחה”.
9. מפת דרכים להידוק מדורג
אם מאחדים את כל מה שלמעלה, הסדר שבו מתקדמים הוא כזה. כל שלב מותנה בכך שהוא הפיך.
| שלב | מה עושים | איך מחליטים שהוא הושלם |
|---|---|---|
| 0. הכנה | לעבור על הגדלים ותקופות השמירה של יומני האירועים. אם יש לכם מנגנון איסוף (WEF וכדומה), לבדוק את המסלול | היומנים לא נדרסים ולא הולכים לאיבוד ברגע שהביקורת פועלת |
| 1. נראות | להפעיל את שלוש מדיניות הביקורת ולאסוף עד שהעסק עבר מחזור שלם (לפחות מעבר על סגירה חודשית אחת) | יש לכם רשימה של “מחשב × יעד × תהליך”, וגם העיבודים בתדירות נמוכה רצו |
| 2. סיווג | למיין את הסיבות עם הטבלה בפרק 5. מארחים שמציגים NTLMv1 מקבלים עדיפות עליונה נפרדת | לכל שורה יש אחראי וסיווג |
| 3. תיקון השמות | להחליף כתובות IP מקודדות ב-FQDN. לרשום SPN-ים | אירועי 8001 המתאימים הפסיקו להופיע |
| 4. אימות (SMB) | לבדוק חיבור אחד בכל פעם עם NET USE /BLOCKNTLM (לפי הנוהל בסעיף 7.1) |
השיתופים העיקריים מתחברים בלי NTLM |
| 5. Pilot (SMB) | Set-SmbClientConfiguration -BlockNTLM $true על כמה מחשבים, למשל של מחלקת ה-IT |
זה מכסה מחזור סגירה אחד בלי השפעה על העסק |
| 6. פריסה (SMB) | להפיץ את חסימת NTLM ב-SMB ב-Group Policy. להשאיר את רשימת החריגים מינימלית | רשימת החריגים קטנה מספיק כדי לנהל |
| 6b. כל מה שאינו SMB | להידוק את מה שנשאר ב-HTTP, SQL Server, WinRM ובאפליקציות פנימיות על ידי העברה של “Outgoing NTLM traffic to remote servers” דרך ביקורת, רישום חריגים, ואז חסימה. להעביר את כל הדומיין באותו סדר עם “NTLM authentication in this domain” | גם אירועי 8001 מחוץ ל-SMB הפסיקו להופיע |
| 7. שוטף | לספור באופן קבוע את גם רשימת החריגים של SMB וגם רשימת החריגים של Restrict NTLM. לעקוב אחרי אספקת התכונות משלב 2 | החריגים מתכווצים בכל שנה |
9.1. עצירת SMB היא רק חצי מהטיפול ב-NTLM
שלבים 4 עד 6 מטפלים ב-SMB בלבד. כפי שמוסבר בפרק 7, חסימת NTLM בצד לקוח SMB היא תכונה של לקוח ה-SMB,4 ואין לה שום השפעה על מסלול אחר. כל מה שסיווגתם בשלב 2 כ”מאמת מעל HTTP”, “SQL Server משתמש ב-NTLM” או “WinRM משתמש ב-NTLM” נשאר לא נגוע כשתסיימו את שלב 6. וכיוון שזה גם לא מופיע ברשימת החריגים של SMB, ספירה של הרשימה הזאת לא תגלה אותו.
עבור כל מה שאינו SMB, להתקדם בביקורת, חריגים וחסימה עם Restrict NTLM
שלב 6b הוא מה שסוגר את הפער הזה. הוא משתמש בדיוק בשלוש המדיניות שהעברתם למצב ביקורת בפרק 4. הנוהל עוקב אחרי אותה צורה.11
- להשאיר את “Outgoing NTLM traffic to remote servers” על Audit all ולמנות את היעדים שנשארו
- לרשום את העמיתים שבאמת צריך ב-“Add remote server exceptions”
- להעביר מחשבי pilot ל-Deny all ולהמתין שהעסק יעבור מחזור שלם
- אם אין בעיות, לפרוס
גם עבור הדומיין כולו, לאמת את ההשפעה עם הביקורת המתאימה לפני החסימה
עבור הדומיין בכללותו, להעביר את “NTLM authentication in this domain” באותו סדר: ביקורת, חריגים (“Add server exceptions in this domain”), ואז חסימה.12 Microsoft אומרת באותה מידה שלפני שבוחרים באפשרות חסימה יש להגדיר את מדיניות הביקורת המתאימה לאותה אפשרות ולהעריך את ההשפעה.12
“חסמנו את SMB, אז הטיפול ב-NTLM הושלם” אינו נכון. אם רוצים מדד להשלמה, ספרו גם את רשימת החריגים של SMB וגם את רשימת החריגים של Restrict NTLM.
9.2. לקבוע את תקופת הביקורת לפי “מחזור עסקי שלם”, לא לפי ימים
הדבר שהכי קל לטעות בו בשלב 1 הוא איך מחליטים על התקופה. תכריזו שזה הושלם כי “אספנו שבועיים” וכל מה שלא רץ בשבועיים האלה לא נמצא ברשימה. ומה שלא נמצא ברשימה יישבר בפעם הראשונה אחרי שתפיצו את החסימה בשלב 6.
למפות גם מסלולי שחזור ומחשבים לא מקוונים, לא רק עיבוד חודשי
באופן קונקרטי, הדברים שהכי קל לפספס הם אלה.
- עיבוד סגירה חודשי ורבעוני. batch של סוף חודש שמתחבר לתיקייה משותפת או למסד נתונים לפי כתובת IP מקודדת הוא הדוגמה הקלאסית.
- עיבוד שנתי. ספירת מלאי, מעבר שנת הכספים, כל דבר שקשור לסגירה הפיננסית.
- מסלולים שנלקחים רק בזמן תקלה. נהלי שחזור מגיבוי, מעבר לשרת חלופי, תרגילי DR.
- מחשבים שנמצאים לא מקוונים תקופות ארוכות. מחשבים ניידים שיצאו מהאתר, המחשבים של עובדים בחופשה ארוכה, מחשבי רזרבה שבדרך כלל כבויים.
- אפליקציות עסקיות שמשמשות רק כמה פעמים בשנה.
אם אי אפשר לחכות, להריץ את העיבוד בתדירות הנמוכה בכוונה
ההנחיה של Microsoft עצמה אומרת שהניתוח יכול להימשך עד כמה חודשים בהתאם למורכבות הפריסה.3 הקו הריאלי לשרטט הוא אחד משני אלה.
- להשאיר את הביקורת פועלת עד שהעסק עבר מחזור שלם. לפחות סגירה חודשית אחת, ועדיף על פני רבעון.
- למפות את העיבוד בתדירות הנמוכה ולהריץ אותו בכוונה. אם אי אפשר לחכות לתקופה, להריץ את עיבוד הסגירה ואת נהלי ה-DR בסביבת בדיקה ולהוסיף את התוצאות לרשימה. המפתח הוא למנות מראש, בראיונות עם האחראים, את העיבוד ש”לא הניב אירועים רק כי לא רץ”.
בשני המקרים, לעבור לשלב הבא רק כשאתם בעמדה שמבחינה בין “לא הופיע אירוע” ל”זה עוד לא רץ”.
9.3. לא להעביר ישר לחסימה
המפתח כאן הוא לא להעביר את “Outgoing NTLM traffic = Deny all” בתנועה אחת. Microsoft אומרת באותה מידה שהגדרה של המדיניות הזאת לחסימה עלולה לגרום לכשל של בקשות אימות NTLM רבות ולפגוע בפרודוקטיביות, ולכן לפני יישום יש לעבור על היומן עם “Audit all”, לנתח את השרתים ולבנות רשימת חריגים של אלה שיש להוציא.7 אותה אזהרה כתובה גם לגבי המדיניות “NTLM authentication in this domain” שמכוונת לדומיין כולו.12
10. סיכום
- כל גרסאות NTLM הוצאו משימוש ביוני 2024. זה לא שינוי שעוצר משהו מיד; נאמר שזה ימשיך לעבוד במהדורה הבאה של Windows Server ובמהדורה השנתית הבאה של Windows.1
- מנגד, NTLMv1 כבר הוסר (Windows 11 24H2 ו-Windows Server 2025). ציוד שיודע לדבר רק NTLMv1, ומארחים שבהם נרשם
NTLM V1, הם המועד הקרוב ביותר.1 - להוצאה משימוש יש שלושה שלבים: שלב 1 הוא ביקורת, שלב 2 (המחצית השנייה של 2026) הוא IAKerb וה-KDC המקומי, ושלב 3 הוא כיבוי ברירת המחדל.2
- ביקורת פירושה העברה של שלוש המדיניות למצב ביקורת ואיסוף
Microsoft-Windows-NTLM/Operational. עבור חשבונות דומיין, עוברים 8004 ב-DC, 8003 בשרת החבר, ואז 8001 בלקוח, ומגיעים בסוף לשם האפליקציה. אימות עם חשבונות מקומיים לא מייצר 8004, ולכן תופסים אותו מאירועי השרת והלקוח.37 - תעבורה דרך SMB מציגה תמיד PID 4 (SYSTEM). לצמצם למחשב בעזרת יומני האירועים, ואז לרדוף אחרי המחשב הזה עם ProcMon.3
- רוב הסיבות הן שמות. רק טיפול בכתובות IP מקודדות וב-SPN-ים שלא נרשמו מקטין מאוד את החריגים שנשארים.32
NET USE \\server\share /BLOCKNTLMהוא הדרך הבטוחה ביותר לאמת, חיבור אחד בכל פעם, בלי לשנות מדיניות.4- באפליקציות פנימיות, להחליף NTLM בשם ב-Negotiate ולאחד את כתיבת היעדים על FQDN-ים.5
- רשימת חריגים היא תקופת חסד, לא פתרון. להשתמש בשאלה אם המספר יורד בכל שנה כמדד.
מאמרים קשורים
- NTLM ו-Kerberos מוסברים באיורים — למה אימות נופל חזרה ל-NTLM
- מלכודות בכונני רשת ובנתיבי UNC — עבודה עם שרתי קבצים (תיקיות משותפות) מאפליקציה עסקית
- חקירת יומני אירועים בפועל עם Get-WinEvent — מהירות הסינון קובעת כמה זמן החקירה תיקח
- מדריך מעשי ל-Process Monitor (ProcMon) — לאתר בזמן של 10 דקות הגדרה שלא הוחלה ו-ACCESS DENIED
- מבוא ל-PowerShell Remoting (WinRM) — ניהול כמה מחשבי Windows בבת אחת
- טיפול בטוח בפרטי אימות ב-PowerShell — הרחקת סיסמאות בטקסט גלוי מהסקריפטים שלכם
- שילוב אימות Entra ID באפליקציות WinForms/WPF — ארכיטקטורה מעשית עם MSAL.NET ו-WAM Broker
- מהו ה-TPM ב-Windows? — מדריך מאויר ל”כספת שלעולם לא מוציאה מפתחות החוצה” ולמדידה של אתחול
תחומי ייעוץ קשורים
KomuraSoft LLC מבצעת מיפוי של תלויות NTLM, התאמת אפליקציות עסקיות למעבר לסביבה מבוססת Kerberos, וחקירת תקלות שקשורות לאימות.
- פיתוח אפליקציות Windows
- חקירת תקלות וניתוח שורש הבעיה
- שימוש חוזר בנכסי legacy ותמיכה במיגרציה
- יצירת קשר
מקורות
-
Microsoft Learn, Deprecated features in the Windows client. על כך שכל גרסאות NTLM, כולל LANMAN, NTLMv1 ו-NTLMv2, מחוץ לפיתוח תכונות פעיל והוצאו משימוש; על כך ששימוש ב-NTLM ממשיך לעבוד במהדורה הבאה של Windows Server ובמהדורה השנתית הבאה של Windows; על כך שיש להחליף קריאות ל-NTLM בקריאות ל-Negotiate, שמנסה לאמת עם Kerberos ונופל חזרה ל-NTLM רק כשצריך; על כך שהכרזת ההוצאה משימוש היא מיוני 2024; ועל העדכון מנובמבר 2024 שקובע ש-NTLMv1 הוסר מ-Windows 11 גרסה 24H2 ומ-Windows Server 2025. כמו כן על כך ש-deprecated ו-removed הם שלבים נפרדים, ושתכונות שהוצאו משימוש אינן בפיתוח פעיל ועלולות להיות מוסרות בעדכון עתידי. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12
-
Microsoft Japan Windows Technology Support Blog, Preparing for the retirement of NTLM. על כך שהוצאת NTLM משימוש מתקדמת בשלושה שלבים (שלב 1 = הפיכת השימוש לגלוי וביקורת עליו; שלב 2 = תכונות לתרחישים שתלויים ב-NTLM, מתוכנן למחצית השנייה של 2026; שלב 3 = השבתת אימות NTLM ברשת כברירת מחדל במהדורה הגדולה הבאה); על שלוש הגדרות ה-Group Policy שצריך להגדיר לצורך הביקורת (audit NTLM authentication in this domain, audit incoming NTLM traffic, ו-outgoing NTLM traffic to remote servers = audit all) ועל בדיקת יומן NTLM/Operational; על כך שכשעוברים ל-Kerberos יש לשקול את IAKERB ואת ה-KDC המקומי, כשה-KDC המקומי אמור להגיע במחצית השנייה של 2026; על שימוש ב-Negotiate באפליקציות; ועל כך שהסיבות האופייניות לשימוש ב-NTLM הן גישה לשרת שצוינה לפי כתובת IP, הגבלות firewall על הפורטים ש-Kerberos צריך, SPN-ים שלא נרשמו, אימות מול שותפים מהימנים, ואימות בסביבות Workgroup. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12
-
Microsoft Learn, Viewing events for assessing NTLM usage. על כך שאפשר להבדיל בין NTLM V1 ל-V2 על ידי חיפוש ב-Security log אחרי “Authentication Package” באירועי ההתחברות והסתכלות על “Package Name (NTLM only)” תחת “Detailed Authentication Information”; על כך שהניתוח עלול להימשך כמה חודשים בהתאם למורכבות הפריסה; על ארבעת סוגי האפליקציות שמשתמשות ב-NTLM למרות שהן תומכות תאורטית ב-Kerberos (אפליקציות שמאפשרות לבחור את תצורת האבטחה או את ה-provider, אפליקציות שה-SPN שלהן לא מוגדר נכון, אפליקציות שמשתמשות בכתובות IP ולא בשמות DNS בגלל תצורה שגויה או תיעוד של הספק, ואפליקציות עם חלקים שתומכים רק ב-NTLM בקוד בסיס ישן); על שלוש הגדרות מדיניות הביקורת ומזהי האירועים המתאימים להן; על נוהל המעקב מאירוע 8004 בבקר הדומיין (time, secure channel name, user name, domain name, workstation name) לאירוע 8003 בשרת החבר (time, user name, domain name, workstation name, PID) ומשם לאירוע 8001 בלקוח (time, target server, specified user, specified domain, client process name, client process user identity); על כך ש-Kerberos לא ישמש אם שרת היעד אינו בצורת NetBIOS ולא בצורת FQDN; על כך שאירוע 8004 לעיתים לא נוצר בבקר הדומיין כשחשבון משתמש מקומי מתחבר לשרת קבצים; ועל כך שאפליקציות שמתקשרות דרך ה-redirector, כמו SMB, מציגות תמיד PID 4 (SYSTEM), ולכן נדרש Process Monitor כדי לזהות את התהליך הקורא בלקוח. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14 ↩15 ↩16 ↩17 ↩18 ↩19
-
Microsoft Learn, Block NTLM connections on SMB in Windows Server 2025. על כך שלקוח ה-SMB יכול לחסום אימות NTLM בחיבורים יוצאים למחשבים מרוחקים; על כך שזה מונע טכניקות שגורמות לשלוח בקשות NTLM לשרתים זדוניים ומתמודד עם תקיפות brute force, cracking ו-Pass-the-Hash; על כך שחסימת NTLM הכרחית למעבר של פרוטוקול האימות של הארגון ל-Kerberos, ובמקביל אפשר להפעיל רק את שכבת ההגנה הזאת בלי להשבית את NTLM לגמרי; על כך שהתנאים המוקדמים הם לקוח SMB ב-Windows Server 2025 ואילך או Windows 11 גרסה 24H2 ואילך, ושרת SMB שיכול להשתמש ב-Kerberos; על כך שחסימת NTLM היא תכונה של לקוח ה-SMB ושרת ה-SMB ביעד יכול להיות כל מערכת הפעלה שתומכת ב-PKU2U או ב-Kerberos; על הפעלה של “Block NTLM (LM, NTLM, NTLMv2)” תחת “Computer Configuration > Administrative Templates > Network > Lanman Workstation” ב-Group Policy; על שימוש ב-
Set-SmbClientConfiguration -BlockNTLM $trueב-PowerShell; על כך שהמדיניות “Block NTLM Server Exception List” מקבלת כתובות IP, שמות NetBIOS ו-FQDN-ים, ואין לה cmdlet מקביל ב-PowerShell ולכן את התצורה הראשונה חייבים לעשות ב-Group Policy Editor ואת החריגים הבאים אפשר להוסיף בנפרד דרך ערך ה-registryBlockNTLMServerExceptionList; ועל כך ש-NET USE \\server\share /BLOCKNTLMו-New-SmbMapping -RemotePath \\server\share -BlockNTLM $trueמאפשרים לחסום NTLM לכל מיפוי כונן בנפרד. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14 -
Microsoft Learn, Microsoft NTLM. על כך שפרטי האימות של NTLM מורכבים משם דומיין, שם משתמש ו-hash חד-כיווני של הסיסמה שמתקבל בהתחברות אינטראקטיבית; על כך שהוא מאמת בלי לשלוח את הסיסמה על הקו, באמצעות challenge/response מוצפן; על שלבי האימות הלא-אינטראקטיבי (הלקוח שולח את שם המשתמש בטקסט גלוי, השרת יוצר ושולח מספר אקראי של 8 בתים כ-challenge, הלקוח מצפין את ה-challenge עם ה-hash של הסיסמה ומחזיר את ה-response, השרת שולח את שם המשתמש, ה-challenge וה-response לבקר דומיין, ובקר הדומיין מבצע את אותו חישוב עם ה-hash שנלקח ממסד הנתונים SAM ומשווה); ועל כך שאפליקציות לא ניגשות ישירות ל-NTLM security package אלא משתמשות ב-Negotiate security package, שבוחר בין Kerberos ל-NTLM ובוחר Kerberos אלא אם אחת המערכות שמשתתפות באימות לא יכולה להשתמש בו. ↩ ↩2 ↩3 ↩4
-
Microsoft Learn, NTLM overview in Windows Server. על כך שאימות NTLM הוא משפחה של פרוטוקולי אימות שנמצאים ב-Msv1_0.dll (LAN Manager גרסאות 1 ו-2, NTLM גרסאות 1 ו-2); על כך שהוא מאמת משתמשים ומחשבים במנגנון challenge/response; על כך ששרת משאבים צריך, בכל פעם שהוא דורש access token חדש, לשאול את שירות האימות בבקר דומיין עבור חשבון דומיין או להתייעץ עם מסד החשבונות המקומי עבור חשבון מקומי; על כך ש-NTLM עדיין בשימוש וחייב להיות בשימוש עבור אימות Windows במערכות שמוגדרות כחברות ב-Workgroup ועבור אימות התחברות מקומי במערכות שאינן בקרי דומיין; על כך ש-Kerberos version 5 היא שיטת האימות המועדפת בסביבות Active Directory; ועל כך שצמצום השימוש ב-NTLM דורש גם הבנה של הדרישות של האפליקציות הפרוסות וגם צעדי תצורה לשימוש בפרוטוקולים אחרים. ↩ ↩2 ↩3
-
Microsoft Learn, Network security: Restrict NTLM: Outgoing NTLM traffic to remote servers. על ארבעת הערכים Allow all, Audit all, Deny all ו-Not Defined, כאשר Not Defined מתנהג כמו Allow all; על הנוהל המומלץ לבחור קודם ב-“Audit all”, לעבור על ה-operational log ורק אז לבנות רשימת חריגים של שרתים; על כך שההגדרה נמצאת ב-“Computer Configuration\Windows Settings\Security Settings\Local Policies\Security Options”; על כך שלא נדרש restart וההגדרה נכנסת לתוקף כששומרים אותה, בין אם מקומית ובין אם מופצת ב-Group Policy; על כך שאירועי ביקורת וחסימה נרשמים ב-operational log תחת “Applications and Services Logs\Microsoft\Windows\NTLM”, בלי שמדיניות של security audit event קיימת כדי לחשוף את הפלט הזה; על כך שאימות NTLM ו-NTLMv2 פגיע להתקפות זדוניות כולל SMB relay, man-in-the-middle ו-brute force; ועל כך שהגדרה לחסימה עלולה לגרום לכשל של בקשות אימות NTLM רבות ולפגוע בפרודוקטיביות, ולכן יש להעריך את ההשפעה בביקורת ולבנות רשימת חריגים מראש. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8
-
Microsoft Learn, Kerberos authentication overview in Windows Server. על כך ש-KDC פועל על בקר דומיין ומשתמש במסד הנתונים של Active Directory Domain Services כמסד נתוני חשבונות האבטחה שלו; על כך ש-Kerberos תומך בהאצלה על ידי שירותים (מנגנון להתחברות לשירותים אחרים בשם הלקוח) ואילו מה ש-NTLM ו-Kerberos מספקים הוא מידע ההרשאה ששירות צריך כדי להתחזות ללקוח באופן מקומי; על כך שאימות NTLM שלפני Kerberos דרש משרת אפליקציות להתחבר לבקר דומיין בכל פעם שהוא אימת לקוח או שירות, ואילו עם Kerberos כרטיסי session מתחדשים מחליפים את אימות ה-pass-through והשרת לא צריך לפנות לבקר דומיין אלא כשנדרש אימות PAC; ועל כך ש-Kerberos מאפשר לכל אחד משני קצוות החיבור לאמת את זהותו של האחר, ואילו NTLM לא מאפשר ללקוח לאמת שרת ולא לשרת אחד לאמת אחר, לאחר שתוכנן לסביבות שבהן אפשר להניח שהשרתים אמיתיים. ↩ ↩2
-
Microsoft Learn, Assessing NTLM usage. על הצורך לגלות ולבצע ביקורת על המצב הנוכחי של תעבורת אימות NTLM לפני יישום מדיניות ונוהגים לשימוש בפרוטוקולי אימות משופרים כמו Kerberos; על שלוש הנקודות שבהן יש לתפוס שימוש ב-NTLM (תעבורה יוצאת מבקרי דומיין בתוך הדומיין, תעבורה נכנסת לשרתים מרוחקים, ותעבורה נכנסת מלקוחות לשרתים מרוחקים); ועל כך שהבנת הסביבה היא משימה איטרטיבית. ↩
-
Microsoft Learn, Configuring Kerberos for IP Address. על כך שמ-Windows 10 גרסה 1507 ומ-Windows Server 2016 ואילך אפשר לגרום ללקוח Kerberos לתמוך בשמות מארח של IPv4/IPv6 ב-SPN-ים; על כך שWindows כברירת מחדל לא מנסה אימות Kerberos מול מארח ששם המארח שלו הוא כתובת IP, ונופל חזרה לפרוטוקול אימות תקף אחר כמו NTLM; על כך שאפליקציות שמקבעות כתובות IP נופלות כתוצאה מכך חזרה ל-NTLM ועלולות לגרום לבעיות תאימות בסביבות שמשביתות את NTLM; על כך שהתכונה להשתמש בכתובות IP כשמות מארח ב-SPN נוספה כדי להקטין את ההשפעה הזאת, ומופעלת על ידי הגדרת ערך ה-registry בצד הלקוח
TryIPSPN(REG_DWORD, לא קיים כברירת מחדל) תחתHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\Kerberos\Parametersל-1, כשההגדרה נדרשת בכל לקוח שצריך לגשת למשאבים מוגני Kerberos לפי כתובת IP; ועל כך שכתובות IP הן זמניות ועלולות לגרום להתנגשויות ולכשלי אימות כשההקצאות פגות ומתחדשות, ולכן בדרך כלל אין להשתמש בהן במקום שמות מארח, ורישום SPN מבוסס כתובת IP הוא עבודה ידנית שנועדה לשימוש רק כשהמעבר לשם מארח מבוסס DNS בלתי אפשרי, ונרשם עםSetspn -s <service>/<ip.address> <domain-user-account>— וכיוון ש-SPN יכול להיות רשום רק בחשבון אחד בכל רגע ב-Active Directory, מומלצת הזמנה סטטית של כתובת ה-IP כשמשתמשים ב-DHCP. ↩ ↩2 ↩3 ↩4 -
Microsoft Learn, Restricting NTLM usage. על הצורך לגלות ולבצע ביקורת על המצב הנוכחי של תעבורת אימות NTLM לפני יישום מדיניות האבטחה “Restrict NTLM”; על שלוש הנקודות שבהן מוגבלת תעבורת NTLM (תעבורת NTLM מבקרי דומיין בתוך הדומיין, תעבורת NTLM יוצאת משרתים מרוחקים, ותעבורת NTLM מלקוחות לשרתים המרוחקים שאליהם הם מתחברים); ועל הגדרת חריגים של שרתים כדי לאפשר אימות NTLM בשרתים ששפטתם אותם כקבילים. ↩
-
Microsoft Learn, Network security: Restrict NTLM: NTLM authentication in this domain. על הערכים Disable, Deny for domain accounts to domain servers, Deny for domain accounts, Deny for domain servers, Deny all ו-Not Defined; על כך שהמדיניות הזאת חלה רק על בקרי דומיין ואינה משפיעה על התחברות אינטראקטיבית לבקרי דומיין; על כך שבקשות שנחסמו מקבלות שגיאת NTLM-blocked, כאשר שרתים ברשימת החריגים של המדיניות “Add server exceptions in this domain” מוחרגים; ועל הצורך, לפני שבוחרים באפשרות חסימה, להגדיר את מדיניות הביקורת המתאימה לאותה אפשרות ולהעריך את ההשפעה באמצעות ה-operational log. ↩ ↩2 ↩3
מאמרים קשורים
מאמרים עדכניים עם אותן תגיות, להעמקה בנושאים קרובים.
SMB signing ו-LDAP channel binding — לסגור בעבודה המעשית את "החצי השני" של הגנת NTLM
SMB signing ו-LDAP signing/channel binding מגבילים את נזקי ה-relay עד שמסיימים עם NTLM. המאמר מפרט את ברירות המחדל לפי OS, איך קוראים את ...
NTLM מול Kerberos בהדגמה — למה האימות "נופל" ל-NTLM
השוואה מאוירת בין NTLM ל-Kerberos: challenge/response מול כרטיסים, TGT ו-service tickets, התנאים שבהם Negotiate נופל ל-NTLM כשאין SPN, מת...
Windows LAPS — להפסיק סיסמת Administrator מקומית משותפת לכל המחשבים
סיסמת Administrator מקומית משותפת לכל המחשבים היא כר פורה ל-Pass-the-Hash: פריצה למחשב אחד מתפשטת לכל השאר. המאמר מסביר את הסיבוב האוטומט...
למה תיקייה משותפת ב-Windows עובדת לפעמים ונכשלת בפעמים אחרות — troubleshooting של Kerberos, NTLM ו-Credentials
מאבחנים גישה לסירוגין לתיקייה משותפת ב-Windows לפי תסמינים ולוגים. בודקים שמות מול כתובות IP, כשלים רק באפליקציה, סיסמאות ריקות, שגיאה 12...
סדר name resolution ב-Windows — hosts, DNS cache, LLMNR/mDNS ו-DoH
האם hosts, ה-DNS cache, שרת DNS או LLMNR/mDNS ענו קובע למה חלק מהמחשבים נכשלים. לומדים את סדר name resolution ב-Windows, מה DoH משנה, ואי...
נושאים קשורים
העמודים האלה ממקמים את הנושא בהקשר רחב יותר של שירותים והחלטות.
נושאים טכניים ב-Windows
שער לנושאי פיתוח Windows, חקירת תקלות וניצול נכסים קיימים.
שירותים הקשורים לנושא הזה
המאמר קשור ישירות לשירותים הבאים.
פיתוח יישומי Windows
יישומים עסקיים, חיבור התקנים וכלי תקשורת, מהגדרת הדרישות ועד הפיתוח.
שאלות נפוצות
שאלות נפוצות בפניות בנושא המאמר.
- כשה-NTLM יוצא משימוש, מתי העסק שלנו ייעצר?
- הכרזה על "הוצאה משימוש" כשלעצמה לא עוצרת דבר. Microsoft הוציאה משימוש את כל גרסאות NTLM ביוני 2024, אבל בהנחיות הנלוות נאמר ששימוש ב-NTLM ימשיך לעבוד במהדורה הבאה של Windows Server ובמהדורה השנתית הבאה של Windows. השינוי הקונקרטי שכבר גרם לשבירות הוא הסרת NTLMv1 ב-Windows 11 גרסה 24H2 וב-Windows Server 2025. יש תוכנית מפורסמת להשבית אימות NTLM ברשת כברירת מחדל במהדורה עתידית, אבל גם אז נאמר שאפשר להחזיר אותו לפעולה באמצעות מדיניות. במילים אחרות, זה לא שינוי שבו החברה כולה נעצרת ביום אחד; זה שינוי שהולך ומתהדק עם כל גרסת מערכת הפעלה חדשה. בדיוק בגלל זה ההכנה הריאלית היחידה היא למפות את התלויות עם לוגי ביקורת בזמן ש-NTLM עוד עובד, ולא לחקור אחרי שמשהו כבר נשבר.
- איך מפיקים רשימה של המקומות שבהם משתמשים ב-NTLM?
- מעבירים את משפחת הגדרות ה-Group Policy של "Network security: Restrict NTLM" למצב ביקורת ואוספים את יומן NTLM/Operational. מגדירים "Audit NTLM authentication in this domain" בבקרי דומיין, ואת "Audit Incoming NTLM Traffic" יחד עם "Outgoing NTLM traffic to remote servers = Audit all" בשרתים ובלקוחות, והאירועים נרשמים תחת Applications and Services Logs > Microsoft > Windows > NTLM ב-Event Viewer. עבור אימות עם חשבון דומיין, הסדר הוא: מזהים את המשתמש ואת שרת היעד (Secure Channel Name) מאירוע 8004 בבקר הדומיין, מסתכלים על ה-PID באירוע 8003 בשרת הזה, ולבסוף מזהים "איזו אפליקציה, מול איזה שם שרת" בעזרת אירוע 8001 בלקוח. אירוע 8001 נושא את שם שרת היעד ואת שם תהליך הלקוח, כך שברגע שמגיעים לשם יודעים איזו אפליקציה אשמה. שימו לב שאימות עם חשבונות מקומיים לא עובר דרך בקר דומיין, ולכן לא יופיע 8004. מסלולים שבהם מחשב ב-Workgroup או חשבון מקומי על שרת קבצים מתחבר ל-share צריכים להיתפס מ-8003 בשרת ומ-8001 בלקוח. אל תסתכלו רק על יומני בקר הדומיין ותסיקו "כמעט לא משתמשים בזה".
- הפעלתי ביקורת וכל האירועים מציגים PID 4 (SYSTEM). אני לא מצליח לדעת איזו אפליקציה זו.
- זה קורה כי התעבורה עוברת דרך SMB (תיקיות משותפות). אימות SMB מתבצע על ידי ה-redirector במצב kernel, ולכן האפליקציה הקוראת מוסתרת מאחורי חבילות ה-SMB וה-PID שנרשם באירוע הוא תמיד 4 (SYSTEM). ההנחיה של Microsoft מתייחסת למקרה הזה במפורש וממליצה להריץ Process Monitor (ProcMon) בלקוח שבו מופיעים האירועים, לסנן נתיבים לפי שם המחשב וכתובת ה-IP של שרת העמית, ולהצליב עם חותמות הזמן של אירוע 8003 בצד השרת כדי לזהות את התהליך הקורא. בפועל המסלול המהיר הוא לצמצם קודם "איזה מחשב" בעזרת יומני האירועים, ואז לרדוף רק אחרי המחשב הזה עם ProcMon.
- למה אפליקציה שאמורה לתמוך ב-Kerberos נופלת חזרה ל-NTLM?
- כמעט תמיד זו בעיה של שמות. ההנחיה של Microsoft מפרטת ארבעה סוגי אפליקציות שמשתמשות ב-NTLM למרות שהן תומכות תאורטית ב-Kerberos: אפליקציות שמאפשרות לבחור את תצורת האבטחה או את ה-provider; אפליקציות שה-SPN (service principal name) שלהן לא נרשם כראוי; אפליקציות שמתחברות לפי כתובת IP במקום לפי שם DNS בגלל תצורה שגויה או תיעוד של הספק; ואפליקציות עם קוד בסיס ישן שעדיין מכיל חלקים שתומכים רק ב-NTLM. אם "Target Server" באירוע 8001 אינו בצורת NetBIOS ולא בצורת FQDN (כלומר כתובת IP), Kerberos לא ישמש בתצורת ברירת המחדל. שתי הפעולות הראשונות הן להחליף כתובות IP מקודדות ב-FQDN, ולרשום SPN עבור ה-alias אם הגישה משתמשת בו. יש גם דרך להגדיר TryIPSPN בלקוחות ולרשום ידנית SPN עבור כתובת ה-IP, למקרים שבהם באמת אי אפשר לשנות את השם, אבל Microsoft עצמה אומרת שיש להגביל את זה למצבים שבהם המעבר לשם DNS בלתי אפשרי, ולכן יש להתייחס לזה אך ורק כמוצא אחרון.
- מה עלינו לתקן באפליקציות Windows שאנחנו מפתחים בעצמנו?
- מחליפים כל מקום שמציין NTLM כ-authentication package ב-Negotiate. Microsoft קובעת במפורש שאפליקציות לא אמורות לגשת ישירות ל-NTLM security package אלא להשתמש ב-Negotiate package. Negotiate בוחר בין Kerberos ל-NTLM, ובוחר Kerberos אלא אם אחת המערכות שמשתתפות באימות לא יכולה להשתמש בו. ב-.NET התיקון האופייני הוא לשנות את סוג האימות שמועבר ל-CredentialCache.Add מ-"NTLM" ל-"Negotiate" (סוג האימות מצוין ב-CredentialCache.Add, לא בבנאי של NetworkCredential). לצד זה צריך גם לציין יעדים לפי FQDN ולא לפי כתובת IP או alias שכתוב ב-hosts, ואם רוצים שהשירות שלכם יקבל Kerberos — לרשום SPN על חשבון השירות הזה.