NTLM廢除會讓業務應用程式停擺嗎 ── 稽核記錄的擷取方式,以及消除相依性的順序

· 更新日期: · · NTLM, Kerberos, Windows, Active Directory, 資安, 資訊系統, PowerShell

更新紀錄(僅初版,2026年07月26日 發布)
初次發布
引用本文(DOI(已登錄存檔): 10.5281/zenodo.22175156)

以下 DOI 指向先前登錄的存檔,內容可能與目前正文不同。引用目前正文時,請使用本頁網址。

Go Komura(2026)。〈NTLM廢除會讓業務應用程式停擺嗎 ── 稽核記錄的擷取方式,以及消除相依性的順序〉。小村軟體有限公司。 https://comcomponent.com/zh-TW/blog/ntlm-deprecation-audit-migration/

DOI(已登錄存檔)
10.5281/zenodo.22175156
DOI(上次登錄版本)
10.5281/zenodo.22175157

「聽說 NTLM 要被廢除了,我們公司沒問題嗎?」──要得出答案,第一步要做的不是在全公司封鎖,而是稽核目前正在運作的驗證。2024 年 6 月宣布 NTLM 的所有版本列為已棄用,但光靠這則公告並不會讓業務停擺。1

NTLM 的廢除,並不是「某天套上修補程式,全公司就停擺」這類變更,而是每次把 OS 換新就逐步收緊限制的變更。請趁 NTLM 還在運作的時候,把相依的電腦、應用程式與連線目標列成清單,先在小範圍試過再加以限制。先全部停掉、再去找壞掉的地方,順序正好相反。

本文是寫給管理 Windows 環境的資訊系統部門,以及維護業務應用程式的開發者的實務步驟。進行順序是稽核 → 原因分類 → 名稱・設定・程式碼的修正 → 以連線為單位的測試 → 分階段限制

至於協定機制本身(為什麼 NTLM 危險、為什麼驗證會回退到 NTLM 而不是 Kerberos),則分到對應的另一篇文章「圖解NTLM與Kerberos ── 為什麼驗證會「回退」到NTLM」。

廢除路線圖與功能提供狀況的基準時點,與原文相同,都是 2026 年 7 月。請與版面的更新日期區分開來。IAKerb、本機 KDC 等功能的提供狀況,請在實際判斷是否遷移時,查閱對象版本的版本資訊。2

從自己遇到的問題開始讀

想確認的事 首先要分清楚的 該讀的段落
廢除之後,業務會在什麼時候停擺 已棄用、NTLMv1 的移除、未來的預設停用 第 2 章: 現況三個階段
不知道哪些 PC、哪些應用程式正在使用 稽核原則的套用對象,以及實際的記錄位置 4.1 節: 稽核的準備
DC 的記錄檔很少,可以就此放心嗎 網域驗證,以及不經過 DC 的本機驗證 4.2 節: 事件的追蹤
想從大量事件中鎖定負責的應用程式 以連線目標與呼叫端處理程序彙整 4.3 節: PowerShell
找到了 NTLMv1 或 PID 4 的資料列 要優先處理的相依,以及要用 ProcMon 追的相依 4.4 節: NTLMv14.5 節: PID 4
該修 IP 位址、別名還是 SPN 影響範圍、修正的容易度、對方端的條件 第 5 章: 原因分類第 6 章: 處理方式
想試試不用 NTLM 能不能連上共用資料夾 既有工作階段的解除,以及不加旗標的對照測試 7.1 節: 用 1 台、1 個連線測試
想修自製應用程式或 IIS 端 驗證方式、進行驗證的帳戶、SPN 的註冊對象 第 8 章: 給開發者IIS 與 SPN
如何判斷全公司推行已經完成 SMB 與其他路徑、稽核期間與業務跑完一輪 第 9 章: 路線圖稽核期間

若要從頭讀到尾,請從第 1 章開始;要動手實作時,請回到第 4 章的稽核

1. 先講結論

區分變更目前走到哪一步

NTLM 已於 2024 年 6 月列為已棄用。對象是包含 LANMAN、NTLMv1、NTLMv2 在內的所有版本,這是「不再進行積極功能開發」的宣告。同時也寫明「NTLM 在下一版 Windows Server 與下一個年度發行版的 Windows 上仍會持續運作」。1

已經有部分遭到移除。NTLMv1 已在 Windows 11 版本 24H2 與 Windows Server 2025 中移除。1

廢除分三個階段進行。第一階段是使用狀況的可視化與稽核,第二階段(2026 年下半年)是提供讓場景不再非依賴 NTLM 不可的功能(IAKerb、本機 KDC),第三階段則是在下一個主要版本中將網路 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 安全性套件」(第 8 章)。5

圖中實線表示始終成立的關係,虛線表示附帶條件的關係(成立條件寫在詳細頁面中各關係的說明中)。關係的完整清單(共 29 條,附依據與可信度)以及主要概念的定義,彙整在知識地圖詳細頁面(日文)。資料:JSON-LD / Turtle

2. 「已棄用」代表什麼意思

首先整理一下用語。如果把這裡含糊帶過就對公司內部說明,「聽說已經不能用了」和「聽說還能撐好幾年」就會同時流傳,把話題弄亂。

區分已棄用的公告與已經發生的移除

Microsoft 的已棄用功能清單中關於 NTLM 的敘述,摘要起來有以下三點。1

  1. 包含 LANMAN、NTLMv1、NTLMv2 在內的所有版本 NTLM,都不再是積極功能開發的對象,並列為已棄用
  2. NTLM 的使用,在下一版 Windows Server 與下一個年度發行版的 Windows 上仍會持續運作
  3. 呼叫 NTLM 的地方應改為呼叫 Negotiate。Negotiate 會先嘗試以 Kerberos 驗證,只有在必要時才回退到 NTLM。

接著,作為更新資訊,還補充了NTLMv1 已從 Windows 11 版本 24H2 與 Windows Server 2025 中移除這一點。1

也就是說,目前所處的階段是「已棄用(deprecated)」,而不是「已移除(removed)」。不過唯獨 NTLMv1 已經跨過已棄用,進入了移除階段。若老舊的複合機或 NAS 只能以 NTLMv1 驗證,更新到 Windows 11 24H2 就會直接變成故障。這不是未來的事,而是現在正在發生的事。

需要替代手段的用途,要連對方的條件一起確認

還有一點要掌握:NTLM 仍留有「不存在替代方案的用途」。Microsoft 明確表示,在採用工作群組組態的系統上進行 Windows 驗證,以及在網域控制站以外的地方進行本機登入驗證,目前仍然使用、也必須使用 NTLM。6 第二階段預定提供的本機 KDC,正是為了填補「本機帳戶需要 NTLM」這個缺口的功能。2

2.1. 三個階段的現況

廢除的路線圖分為三個階段。由於這是與時間點相關的資訊,以下附上基準日期整理(下表是 2026 年 7 月時點的狀況)。

階段 內容 2026 年 7 月時點的狀態 自家公司要做的事
第一階段 使用狀況的可視化與稽核 現在就能立刻執行。所需的稽核原則與 Microsoft-Windows-NTLM/Operational 記錄檔,現在的 Windows 都已內建27 執行第 4 章的稽核,做出清單
第二階段 讓場景不再非依賴 NTLM 不可的功能(IAKerb、本機 KDC) 仍處於預定 2026 年下半年提供的階段2 先用版本資訊確認在對象版本上是否已正式提供、還是仍在預覽階段,再納入計畫。未確認之前,不要以「第二階段會解決」為由擱置
第三階段 在下一個主要版本中將網路 NTLM 驗證預設為停用 具體時程尚未公布。據稱即使預設變成停用,仍可透過原則重新啟用21 先把第一、第二階段做完。目的就是不要等這一步到了才開始調查

希望從這張表確認的是,現在能由自己動手推動的只有第一階段。第二階段的功能在第 6 章的判斷表中有幾處寫著「可能成為解法」,但都以確認提供狀況為前提。提供時程可能變動,因此這張表的內容,請務必在自家公司做判斷的時點重新取得。

3. 為什麼會消失 ── 只花 3 分鐘

作為遷移的判斷材料,這裡只掌握最低限度。詳細的圖解交給對應的另一篇文章

Microsoft 在原則設定的文件中明白寫著,NTLM 與 NTLMv2 驗證對包含 SMB 中繼、中間人攻擊、暴力破解攻擊在內的各種惡意攻擊都很脆弱7 根源在於下列這些與 Kerberos 對比時會談到的性質。8

沒有相互驗證

在 NTLM 中,用戶端無法驗證伺服器的身分,伺服器也無法驗證另一台伺服器的身分。NTLM 是為了可以假設「伺服器是真的」的網路環境所設計。Kerberos 則不做這個假設。這個差異,正是讓認證資訊被送往假伺服器的中繼攻擊得以成立的條件。

網域驗證時,伺服器要向 DC 查詢

在 NTLM 中,應用程式伺服器每次驗證網域帳戶的用戶端時,都必須連線到網域控制站(若是伺服器本機的帳戶,則由伺服器查自己的帳戶資料庫來判定)。6 在 Kerberos 中,可更新的工作階段票證取代了這種傳遞驗證,除非需要驗證 PAC(特殊權限屬性憑證),否則伺服器不需要連往網域控制站。

就算不知道密碼,偷到的雜湊值也會被濫用

NTLM 的認證資訊由網域名稱與使用者名稱,加上密碼的單向雜湊值所組成(被雜湊的只有密碼),用戶端會用這個雜湊值加密挑戰值並回傳回應。5 只要偷到雜湊值,即使不知道明文密碼也能冒充他人,這個性質就是從這裡來的。

「沒有相互驗證」在實務上的意思是,光是想連上 SMB 共用資料夾,就可能把認證資訊交給假的伺服器。Microsoft 之所以準備 SMB 用戶端側的 NTLM 封鎖功能,理由也被說明為「防止讓惡意伺服器誘導送出 NTLM 要求的手法」。4

4. 稽核 ── 列出 NTLM 在哪裡被使用

這裡才是正題。Microsoft 的指南也明確寫著,在實作限制原則之前,必須先發現並稽核目前 NTLM 驗證流量的狀態9

4.1. 啟用稽核模式

注意: 稽核模式只會記錄,不會封鎖任何東西。另一方面,在機器數量多的環境中,記錄量會一口氣暴增。若沒有使用事件收集(WEF),請先重新檢視記錄檔大小上限與保留期間,再行啟用。Microsoft 的指南也表示,依環境的複雜程度,分析有可能長達數個月3

稽核期間要從設定送達對象電腦之後開始計算。為了不漏掉月次處理或故障時才會走的路徑,請先一併確認 9.2 節的「業務跑完一輪」

設定位置與三個原則

要設定的是三個原則。位置都在 電腦設定\Windows 設定\安全性設定\本機原則\安全性選項,而且不需要重新啟動。無論是儲存在本機,還是透過群組原則發布,設定套用的當下就會生效。7

不要把儲存 GPO 的時刻當成稽核的起算時刻

不過「不需要重新啟動」和「立刻對所有機器生效」是兩回事。用網域的 GPO 發布時,儲存 GPO 當下更新的只有 AD/SYSVOL 上的原則,各台電腦實際開始稽核,要等到下一次背景更新,或是執行 gpupdate /force 之後。稽核期間的起點不是「儲存 GPO 的日期時間」,而是「套用已送達對象電腦的日期時間」,請這樣計算。若在這裡弄錯,結果就會以「只有第一次彙整的對象台數偏少」的形式被扭曲。

原則 套用對象 設定值
網路安全性: 限制 NTLM: 稽核這個網域中的 NTLM 驗證 網域控制站 全部啟用
網路安全性: 限制 NTLM: 稽核傳入的 NTLM 流量 所有伺服器與用戶端 對所有帳戶啟用稽核
網路安全性: 限制 NTLM: 傳送到遠端伺服器的 NTLM 流量 所有伺服器與用戶端 全部稽核

第三個「傳送到遠端伺服器的 NTLM 流量」有全部允許 / 全部稽核 / 全部拒絕 / 未定義四種值,未定義的處理方式與「全部允許」相同。Microsoft 的建議也很明確:不要一開始就選「全部拒絕」,先設為「全部稽核」並確認運作記錄檔,掌握哪些伺服器正在接收驗證要求之後,再建立例外清單7

要看的是 NTLM/Operational,而不是安全性記錄檔

記錄位置是事件檢視器 > 應用程式與服務記錄檔 > Microsoft > Windows > NTLM(Microsoft-Windows-NTLM/Operational)。這項稽核沒有對應的安全性稽核事件原則,因此要看的是這個通道,而不是安全性記錄檔。7

讓機器的角色與要記錄的事件相互對應

現場最容易搞錯的,就是「要在哪台機器放哪個原則、又要看哪個事件」的對應關係。把上表的三個原則當成①②③,整理成檢查清單。

機器種類 要啟用的原則 要看的事件 從中能知道什麼
網域控制站 (DC 專用)
此外也要設定②③。因為 DC 自己也會以伺服器與用戶端的身分通訊
8004 在網域帳戶的驗證中,哪位使用者對哪台伺服器(安全通道名稱)以 NTLM 驗證
成員伺服器
(檔案伺服器、業務伺服器)
②③ 8003(傳入)
8001(該伺服器自己的傳出)
是從哪個用戶端收到的。若 PID 是 4(SYSTEM)就是經由 SMB(4.5 節)
用戶端電腦 ②③ 8001(傳出) 目標伺服器與用戶端處理程序名稱。在這裡就能確定原因
工作群組主機・以本機帳戶存取共用資料夾 ②③(若對方是 Windows 就兩邊都設) 只有80038001 因為不經過 DC,所以不會出現 8004。這條路徑只能從伺服器與用戶端的記錄檔看到3

不論哪台機器,記錄檔都是同一個 Microsoft-Windows-NTLM/Operational①只對網域控制站有效,而漏掉②③的電腦不會是「沒有使用 NTLM 的電腦」,而是「沒有記錄的電腦」。這個差異是讓彙整結果失真的最大原因。

4.2. 追蹤要「從網域控制站往下游走」

首先,把驗證所使用的帳戶分開。若是網域帳戶就從 DC 往下游走,若是本機帳戶就從伺服器與用戶端追蹤。3

另外,也有網域控制站不會出現 8004 的情況。因為以本機使用者帳戶連線檔案伺服器時,該驗證不會經過網域控制站。3 不可以因為「看了 DC 的記錄檔覺得很少」就判斷沒問題。

網域帳戶要依 8004 → 8003 → 8001 追蹤

Microsoft 的指南所示的網域帳戶追蹤路徑如下。3

安全通道名稱 =應調查的伺服器工作站名稱 =應調查的用戶端用戶端處理程序名稱若 PID 為 4 (SYSTEM)則是經由 SMB網域控制站事件 8004成員伺服器事件 8003用戶端事件 8001造成原因的應用程式

圖 1: NTLM 稽核事件的追蹤順序

各個事件要看的項目如下。3

事件 記錄的位置 主要項目 讀法
8004 網域控制站 日期時間 / 安全通道名稱 / 使用者名稱 / 網域名稱 / 工作站名稱 「安全通道名稱」就是用戶端所連線的成員伺服器。接著去看那台伺服器的 8003
8003 成員伺服器 日期時間 / 使用者名稱 / 網域名稱 / 工作站名稱 / PID 若 PID 是 4(SYSTEM)就是經由核心模式(=SMB)。到「工作站名稱」那台用戶端去看 8001
8001 用戶端 日期時間 / 目標伺服器 / 指定的使用者 / 指定的網域 / 用戶端處理程序名稱 / 用戶端處理程序的使用者 ID 在這裡就能確定原因。若「目標伺服器」既不是 NetBIOS 名稱也不是 FQDN 格式(=IP 位址),在預設組態下就不會使用 Kerberos

最後要看的是連線目標與處理程序名稱

這條路徑上特別有價值的,是8001 的「目標伺服器」與「用戶端處理程序名稱」。前者直接告訴你「為什麼沒有變成 Kerberos」,後者直接告訴你「是誰的問題」。Microsoft 的指南也說明,從這些資訊可以判定使用者是連到 Web 伺服器的 IP 位址,而沒有使用原本可以走 Kerberos 的 NetBIOS 名稱或 FQDN3

4.3. 用 PowerShell 彙整

步驟 1: 數一數那台機器上記錄了哪些事件識別碼

用事件檢視器的 GUI 一筆一筆看數千件並不實際,所以用 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: 以連線目標 × 呼叫端處理程序彙整

搞清楚結構之後,就用 XML 的 Name 屬性取出來彙整。屬性名稱會因 OS 版本而有差異,所以用名稱去取,比用位置指定更不容易壞。

# 將最近 7 天的 8001 以「連線目標 × 呼叫端處理程序」彙整
$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, ...) 最危險的模式。預設情況下,主機名稱是 IP 位址時不會嘗試 Kerberos 驗證,因此這一列在結構上就不可能變成 Kerberos10 把連線目標改成 FQDN(第 6 章)。從件數多的資料列開始處理,整體就會一口氣減少
前半段是 NetBIOS 名稱或 FQDN 就名稱而言是正常的。即使如此仍變成 NTLM,就是 SPN 未註冊、別名或路徑的問題 用第 5 章的表把原因分類
後半段是 System 之類的系統端處理程序 很可能是經由 SMB(PID 4)。呼叫端應用程式只能查到這裡 到伺服器端的 8003 確認 PID 是不是 4,再對那一台電腦掛上 ProcMon(4.5 節)
後半段是執行檔名稱(例: MyBizApp.exe) 造成原因的應用程式已經確定。最容易修 清查那個應用程式的連線目標設定(8.2 節)
Name 的後半段是空的,或全部資料列都是空的 彙整所用的欄位名稱與實際的結構描述不合 把前一個步驟確認到的名稱加進候選陣列

件數的絕對值本身沒什麼意義。請看「IP 位址為目標的資料列有沒有排在前面」與「已經查到執行檔名稱的資料列有幾列」這兩點。前者是只要修就一定會減少的相依,後者是可以指派負責人的相依。

若彙整結果是空白或 PID,就重新檢視項目名稱

欄位名稱會因 OS 版本而有差異,所以寫成把候選排成有優先順序的陣列,只取實際存在的項目。這裡如果用 -match 'Process' 這種部分比對,連 ClientProcessId 這種 PID 欄位都會被撈到,結果就可能不是用執行檔名稱、而是用每次都會變的 PID 來彙整(雜湊表的鍵順序不固定,所以會取到哪一個也不穩定)。如果 Process 欄位全部變成空白,就是候選名稱與實際結構描述不合的徵兆,請把前一個步驟確認到的名稱加進陣列。

擴大到多台之前,先在 1 台上統一讀法

若要從多台機器收集,用 PowerShell Remoting 平行執行會比較快(「PowerShell Remoting(WinRM)入門」)。Get-WinEvent 的篩選是否使用 -FilterHashtable,所需時間會差上好幾個數量級,這方面的要領整理在「使用 Get-WinEvent 有效率地調查事件記錄」。

4.4. 從安全性記錄檔這一側看 ── 確認是否還在使用 NTLMv1

除了 NTLM/Operational 之外,也有從安全性記錄檔的登入事件確認 NTLM 版本的方法。步驟是在安全性記錄檔中搜尋「驗證套件」,再查看各事件的「詳細驗證資訊」。3

詳細驗證資訊:
    登入處理程序:               NtLmSsp
    驗證套件:                   NTLM
    已轉換的服務:               -
    套件名稱 (僅限 NTLM):       NTLM V1
    金鑰長度:                   128

NTLM V1 的記錄要另外歸類、優先處理

這個「套件名稱 (僅限 NTLM)」會指出使用的是 NTLM 協定群中的哪一個子協定。3 出現 NTLM V1 的主機,就是直接升級到 Windows 11 24H2 / Windows Server 2025 之後驗證會過不了的候選。因為 NTLMv1 已在這些版本中移除。1 執行稽核時,唯獨這個觀點請提高優先順序去撈。

4.5. 當 PID 幾乎都是 4(SYSTEM),進度卡住時

一開始稽核,幾乎一定會撞上這道牆。像 SMB(共用資料夾)這種經由重新導向器通訊的應用程式,要求驗證的主體是核心模式的重新導向器,因此事件中留下的 PID 永遠是 4(SYSTEM)3

用記錄檔鎖定電腦,再用 ProcMon 追那一台

Microsoft 的指南所示的處理方式如下。3

  1. 在正在送出 NTLM 認證資訊的用戶端(8001 的「電腦」)上,安裝處理程序監控工具。
  2. 以對方伺服器的電腦名稱與 IP 位址兩者篩選路徑。若需要長時間採集,就以背景模式執行。
  3. 把採集結果與伺服器端事件 8003 的時間戳記比對。使用者、路徑、驗證識別碼會互相對應,由此就能鎖定呼叫端應用程式。

工具是 Process Monitor(ProcMon)。篩選條件的設法與讀法,整理在「Process Monitor(ProcMon)實戰指南」。

再補一個實務上的訣竅:在這個階段之前,先只用事件記錄檔把「是哪一台電腦」完全鎖定,再只對那一台電腦掛上 ProcMon,速度會快得多。把 ProcMon 發給所有機器並不實際。

5. 回退到 NTLM 的典型模式

稽核查出位置之後,接下來就是原因的分類。Microsoft 的指南舉出了理論上支援 Kerberos、實際卻會使用 NTLM 的應用程式四種。3

  • 可以選擇各種安全性組態或提供者的應用程式
  • SPN(服務主體名稱)未正確組態的應用程式
  • 因設定錯誤或廠商文件的緣故,使用 IP 位址而非 DNS 名稱的應用程式
  • 擁有舊有程式碼庫,其中仍殘留 NTLM 專用部分的應用程式

Microsoft 日本的支援部落格則舉出使用 NTLM 的代表性原因,包括以 IP 位址指定存取伺服器、防火牆限制了 Kerberos 所需的通訊埠、SPN 未註冊、對信任關係對象的驗證,以及工作群組環境中的驗證。2

把原因與修正的優先順序記在同一張表

把這些整理成現場會遇到的形式,就成了下面這張表。右邊兩欄是用來排優先順序的基準。「影響範圍」代表停擺時會困擾到多廣,「修正容易度」代表能不能只靠自家公司的判斷就修好。只要掌握這兩點,就能直接變成計畫書的著手順序。

症狀・組態 變成 NTLM 的原因 確認方式 分類 影響範圍 修正容易度
\\192.168.1.10\share 這樣以 IP 位址連線共用資料夾 預設情況下,主機名稱是 IP 位址時不會嘗試 Kerberos 驗證10 事件 8001 的「目標伺服器」是 IP 位址 馬上就能修 大(件數多) (自家公司即可完成)
業務應用程式的連線目標設定是 IP 位址 同上。廠商操作手冊常常寫成指定 IP 用事件 8001 的「用戶端處理程序名稱」鎖定該應用程式 馬上就能修 中~大 (只需變更設定)
以 DNS 的別名(CNAME)或 hosts 的自訂名稱存取 該名稱沒有註冊對應的 SPN 確認該服務帳戶的 SPN 清單 註冊 SPN 就能修好 中(需要 AD 端的作業與協調)
自行開發的服務/IIS 網站以專用帳戶執行 服務帳戶未註冊 SPN 同上 註冊 SPN 就能修好 中(需要確認是否重複註冊)
跨據點或透過 VPN 無法連到網域控制站 Kerberos 所需的通訊不通,因而回退 防火牆規則與 DC 的可達性 路徑的問題 大(整個據點) 低(要變更網路架構)
NAS・複合機・掃描器的 SMB 傳送目標是 Windows 共用資料夾 裝置端不支援 Kerberos,或是以本機帳戶驗證 裝置的驗證設定,以及伺服器端的 8003 取決於裝置 中(業務範圍明確) 低(取決於廠商回覆與裝置汰換)
工作群組主機、以本機帳戶存取共用資料夾(兩端都是新版 Windows) 因為不是網域帳戶,所以根本不在 Kerberos 的場域內 網域控制站不會出現 8004 第二階段可望解決 低(等待功能提供。2.1 節)
同上,但對象是舊版 Windows 或其他廠商的裝置 同上。不過本機 KDC 必須是相互支援的 Windows 之間才有效 確認對方的 OS 版本/機型 要自己動手處理(加入網域・汰換・改用其他協定・列入例外) 低(牽涉汰換的預算與時程)
對其他公司網域、沒有信任關係的對象進行驗證 無法發行 Kerberos 的票證 事件 8001 的「指定的網域」 需要設計上的判斷 小~中 低(要與對方協調)
可以選擇驗證方式的舊版套裝產品 設定被固定成 NTLM 產品的驗證設定畫面 變更設定 or 洽詢廠商 中(若改設定就能解決則為高)

把 NTLMv1 列為最優先,長期協調則同時開始

著手順序可以從這兩欄機械式地決定。

  1. 不論影響範圍,最優先的都是只會說 NTLMv1 的裝置,以及記錄到 NTLM V1 的主機(4.4 節)。只有這一項是因為「期限已經到了」,所以放在優先度計算之外。1
  2. 其次是影響範圍=大且修正容易度=高,也就是直接寫死 IP 位址。件數多,而且只靠自家公司的判斷就能修。第一個月請集中在這裡。
  3. 再其次是修正容易度=中的 SPN 相關項目。與名稱的統一一起推進。
  4. 修正容易度=低的項目(取決於裝置、路徑、等待第二階段),並不是著手時間晚,而只是前置時間長,所以至少要把向廠商洽詢與編列預算,與第 1~3 項並行地提早開始。

被分類為「馬上就能修」與「註冊 SPN 就能修好」的項目,應該會占稽核結果的大半。光是把這些處理掉,剩下的例外就會少很多。

6. 修正方式的判斷表

依第 5 章標上的分類選擇處理方式。先推進改成 FQDN 與確認 SPN,TryIPSPN 則當成無法改為名稱時的最後手段。IIS 的 SPN 註冊對象有例外,作業前請確認 8.3 節的「解密票證的識別」

分類 要做的事 注意事項
直接寫死 IP 位址 把連線目標改成 FQDN。共用資料夾的捷徑、磁碟機對應、應用程式的設定檔、批次檔、工作排程器的引數,全部都要清查 先確認名稱解析確實有效。網路磁碟機與 UNC 路徑周邊的陷阱,整理在另一篇文章
直接寫死 IP 位址,但無論如何都無法改成名稱 在用戶端設定 TryIPSPN,並以 Setspn -s <服務類別>/<IP 位址> <帳戶> 手動註冊 IP 位址的 SPN 最後手段。要註冊的是用戶端實際要求的服務類別。共用資料夾等對應到 HOST 的服務用 host/192.168.1.1 就夠,但 Web 是 HTTP/192.168.1.1,SQL Server 則是 MSSQLSvc/192.168.1.1:1433,需要連通訊埠都包含在內的另一組 SPN,只註冊 host/ 會不相符而回退到 NTLM。Microsoft 自己也表示,IP 位址是暫時性的,通常不會用在 SPN 上,只有在無法改為 DNS 名稱時才該做這項手動作業。若使用 DHCP,前提是要設定靜態保留。設定必須在每一台要存取的用戶端上進行10
SPN 未註冊 對執行服務的帳戶,以存取所用的名稱註冊 SPN SPN 重複註冊會破壞 Kerberos 驗證本身。註冊前務必確認既有的重複
以別名(CNAME)存取 為別名也註冊 SPN,或把存取統一成 FQDN 原因就在於「原本的名稱」與「實際使用的名稱」不一致,所以要先決定往哪一邊靠
連不到 DC 的據點 讓 Kerberos 所需的通訊能通。若是永久無法連到的架構,第二階段的 IAKerb 可能成為解法 IAKerb 與本機 KDC 預定在 2026 年下半年提供。自家公司的對象版本實際上能不能用,請查閱版本資訊2
本機帳戶的運作 先依對方的身分分類。若是相互支援的 Windows 之間,第二階段的本機 KDC 可能成為解法,但舊版 Windows 或其他廠商的裝置(NAS、複合機等)不在其對象範圍。後者要從加入網域、汰換裝置、改用其他協定、列入例外清單之中擇一 不要把「因為是本機帳戶所以等第二階段」整包擱置。IAKerb 解的是與 DC 的可達性,而不是本機帳戶或其他廠商裝置能不能支援。在本機登入驗證與工作群組組態中,NTLM 今後仍會被需要62
NAS・複合機 向製造商確認韌體的支援狀況。若無法支援 Kerberos,就改用 SMB 以外的傳送路徑(SMTP、FTPS、專用資料夾),或是更新裝置 只會說 NTLMv1 的裝置最優先。在 Windows 11 24H2 / Server 2025 上已經移除1
可以選擇驗證方式的產品 在設定中選擇 Negotiate/Kerberos。若無法選擇,就向廠商確認路線圖 「沒有支援計畫」的回覆,可以作為更新計畫的材料
自行開發的應用程式 把直接指名 NTLM 的地方換成 Negotiate(第 8 章) 要修的不只是程式碼,還有連線目標的寫法
無論如何都會殘留的項目 註冊到伺服器例外清單,並每年清點其台數 例外是「刪掉之前的緩衝」,不是解決。要以台數有沒有減少作為指標7

7. SMB 的 NTLM 封鎖 ── 實地確認的最短路徑

稽核記錄檔能告訴你「正在被使用」,卻不會告訴你「停掉會怎樣」。這時派得上用場的,就是Windows Server 2025 與 Windows 11 版本 24H2 新增的 SMB 用戶端側 NTLM 封鎖4

這項功能會封鎖 SMB 用戶端在對遠端的傳出連線中使用 NTLM 驗證。Microsoft 表示,藉此可以防止讓惡意伺服器誘導送出 NTLM 要求的手法,並對抗暴力破解、破解與 Pass-the-Hash 攻擊,並且把它定位為組織要把驗證協定切換到 Kerberos 時必要的一環。同時也寫著,即使不完全停用 NTLM,也能單獨啟用這一層保護4

注意: 這項功能是SMB 用戶端側的功能4 SMB 以外的路徑(自家應用程式的 HTTP 通訊、對 SQL Server 的連線、WinRM 等)上的 NTLM,靠這個是擋不住的。那些要依第 5 章的分類個別處理。

前提條件有以下兩項。4

  • SMB 用戶端是 Windows Server 2025(含)以後,或 Windows 11 版本 24H2(含)以後
  • 連線目標的 SMB 伺服器能夠使用 Kerberos(SMB 伺服器端的 OS 只要能用 PKU2U 或 Kerberos 即可)

7.1. 先只用 1 台、1 個連線測試

不要一開始就發布原則,而是善用可以逐一連線指定封鎖這一點。不過,要下判斷需要解除既有工作階段,以及確認不加旗標時可以連上。下面兩個命令只是指定方式的範例,實際測試請依這下面的四個步驟進行。

# 只在這個連線禁用 NTLM 並嘗試連線(若連得上,表示該共用資料夾不需要 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 <伺服器名稱> 成功就會建立對應,失敗則以錯誤結束,不會留下對應
失敗是否起因於 NTLM 下面步驟 3 所做的、與不加旗標的連線之比較 若不加旗標也失敗,就是名稱解析、認證資訊、存取權等別的問題
實際的驗證方式是什麼 klist 中該伺服器的 cifs/ 票證,或伺服器端的安全性記錄檔 把「沒有使用 NTLM」與「使用了 Kerberos」分開。詳情見本節末尾

避免誤判的四個步驟

不過,這項確認需要照步驟來。什麼都不想就執行,兩個方向都會誤判。

$server = 'fileserver.corp.example.com'

# 1. 把對該伺服器的對應「一個不留」地解除
#    只要還留著任何一個別的共用資料夾,以伺服器為單位的工作階段就會繼續存活
net use | Select-String $server              # 先看看目前連著什麼
net use \\$server\share  /delete
net use \\$server\other  /delete             # 同一台伺服器的其他共用資料夾也全部解除

# 2. 確認工作階段真的消失了(沒有變空就不要進到下一步)
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: 不只是共用資料夾,連對伺服器的工作階段都要解除

SMB 的工作階段是以伺服器為單位,而不是以共用資料夾為單位。若對該伺服器的已驗證工作階段還留著,重新導向器就不會重做驗證,而是直接重複使用它。/BLOCKNTLM 生效的只有為了那個對應所進行的驗證,並不會回頭去驗證已經建立的工作階段(可能是用 NTLM 建立的)。

也就是說,只把測試對象的共用資料夾 /delete 並不夠。如果同一台伺服器的其他共用資料夾還連著,即使存在 NTLM 相依也會測試成功。請一直解除到 Get-SmbConnection 什麼都不傳回為止。除了自己的對應之外,常駐應用程式或備份作業也可能握著工作階段。若要確保萬無一失,從一台從未連過該伺服器的電腦上測試,是最快的做法。

步驟 3: 把不加旗標的成功當成比較的基準

名稱解析失敗、認證資訊錯誤、對共用資料夾本身的存取權不足,都會讓加上 /BLOCKNTLM 的執行失敗。若不加旗標也失敗,那就不是相依 NTLM,而是別的問題。

即使成功,也不代表驗證方式就自動確定了

請注意,這裡能說的只到「不需要 NTLM」,還說不到「以 Kerberos 完成驗證」。這項功能的前提條件是「能使用 Kerberos 的 SMB 伺服器」,但連線目標也可以是能使用 PKU2U 的 OS。4 也就是說,成功的理由是 PKU2U 而不是 Kerberos 的可能性仍然存在。若對象是已加入網域的檔案伺服器,基本上不會有問題,但若想確定實際上是用什麼驗證的,請在連線後於用戶端執行 klist,查看是否取得了該伺服器的 cifs/ 票證,或是在伺服器端的安全性記錄檔中確認登入事件的驗證套件(4.4 節)。

7.2. 以電腦為單位啟用

佐證完成之後,就在試行電腦上進入整台電腦的封鎖。4

# 在整個 SMB 用戶端上封鎖 NTLM(系統管理員權限)
Set-SmbClientConfiguration -BlockNTLM $true

若用群組原則,則啟用 電腦設定 > 系統管理範本 > 網路 > Lanman 工作站 中的 「封鎖 NTLM (LM、NTLM、NTLMv2)」4

7.3. 無論如何都會殘留的對象,列入例外清單

未加入網域的 SMB 伺服器等等,無論如何都需要 NTLM 的對象可以列為例外。啟用群組原則的 Lanman 工作站 > 封鎖 NTLM 伺服器例外清單,並列舉要允許的對象的 IP 位址、NetBIOS 名稱、FQDN。4

把永久性的例外與緊急時的登錄檔操作分開

由於沒有準備用來建立例外清單本身的 PowerShell Cmdlet,第一次必須用群組原則編輯器設定,但建立之後要個別新增,則可以用登錄檔操作完成。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 第一次執行時一個例外都不會進去,要到第二次執行才終於會進去,因此上面的程式碼在尚未建立的情況下也會直接寫入要新增的對象。話雖如此,這個登錄值本來就是群組原則管理的區域。永久性的例外請在群組原則端管理,這項操作請僅限於緊急時的暫時處置。下一次套用原則時就會被覆寫。

8. 從開發者角度看 NTLM ── 使用 Negotiate

若自家公司有在開發 Windows 應用程式,要修的地方非常明確。Microsoft 明白寫著以下內容。5

應用程式不應直接存取 NTLM 安全性套件,而應改用 Negotiate 安全性套件。只要參與驗證的系統有支援,Negotiate 就能讓應用程式使用更先進的安全性協定。目前,Negotiate 安全性套件會在 Kerberos 與 NTLM 之間擇一。除非參與驗證的系統中有一方無法使用 Kerberos,否則 Negotiate 會選擇 Kerberos。

也就是說,原則就是把寫著「NTLM」的地方改成「Negotiate」。已棄用功能清單上的敘述也一樣,表示呼叫 NTLM 的地方應改為呼叫 Negotiate。1

8.1. .NET 中常見的「直接指名 NTLM」

不要變更進行驗證的帳戶,只替換驗證類型

// 不好的範例: 在驗證類型中直接指名 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 包起來、產生模式、逾時設計),整理在「不要用 using 包住 HttpClient」。

直接操作 SSPI 時,也要指定 Negotiate

若必須直接操作 SSPI,使用 .NET 7 之後新增的 System.Net.Security.NegotiateAuthentication,就能從受控碼處理透過 Negotiate 的驗證。這裡的重點同樣是不要在套件名稱中指定 NTLM。

8.2. 比程式碼更該先檢查的「連線目標寫法」

就算修了程式碼,只要連線目標還是 IP 位址,結果還是會回退到 NTLM。因為在預設情況下,當主機名稱是 IP 位址時,Windows 不會對該主機嘗試 Kerberos 驗證,而是回退到 NTLM 等其他有效的協定。10 具體來說請清查以下項目。

  • 設定檔(appsettings.jsonApp.config、ini 檔)中寫的伺服器名稱
  • SQL Server 連線字串中的伺服器指定(Data Source)
  • 組出 UNC 路徑的地方。有沒有寫死的 IP 位址
  • 安裝程式或裝機手冊中的預設值
  • 過去處理故障時因為「名稱解析不穩定」而改成 IP、之後沒有改回來的地方

最後一項真的很常找到。直接寫死 IP 位址在當時是正確的應急處置,但現在已經是技術債。

8.3. 若是在開發服務端

若想讓自製的 Windows 服務或 IIS 應用程式以 Kerberos 接受驗證,就必須對解密票證的帳戶,以用戶端存取時所用的名稱註冊 SPN。正如 Microsoft 自己所舉的代表例:未註冊 SPN 的應用程式,即使號稱支援 Kerberos 也會回退到 NTLM。3

在 IIS 上,應用程式集區的識別與解密的識別未必相同

如果把註冊對象單純想成「執行服務的帳戶」,在 IIS 上就會跌倒。IIS 的 Windows 驗證預設啟用核心模式驗證,此時負責解密 Kerberos 票證的不是應用程式集區的識別,而是HTTP.sys 所使用的電腦帳戶。即使是以專用的網域帳戶執行應用程式集區,若把網站的 HTTP SPN 註冊到該帳戶,SPN 的持有者與實際解密的帳戶就會不一致,結果不只是回退到 NTLM,而是會以 KRB_AP_ERR_MODIFIED 讓驗證本身失敗。

重點是「讓 SPN 的註冊對象與解密票證的識別一致」。可採取的形式有以下兩種。

解密票證的識別 需要的設定與 SPN 的註冊對象
電腦帳戶(維持預設) 若網站是以主機名稱對外公開,就把該主機名稱的 HTTP SPN 註冊到電腦帳戶
應用程式集區的識別 啟用 useAppPoolCredentials,並把 HTTP SPN 註冊到應用程式集區的帳戶

要選哪一種,取決於是否有多台伺服器共用同一個服務帳戶(若有共用,靠向應用程式集區識別的做法比較好處理)。另外SPN 只能註冊在一個帳戶上,所以切換時別忘了刪除舊的註冊。重複註冊會破壞 Kerberos 驗證本身。

對其他伺服器的委派,要與協定變更一起確認

若採用偽裝成用戶端去存取其他伺服器的設計(委派),NTLM 與 Kerberos 的處理方式就不一樣。Kerberos 支援讓服務代表用戶端連線到其他服務的委派機制,而 NTLM 提供的僅止於在本機偽裝所需的授權資訊。8 偽裝相關的實作,在「Windows 的偽裝(Impersonation)與權杖」中有說明。

9. 分階段收緊的路線圖

把以上內容整理起來,推進的順序如下。每個階段都以「可以退回」為條件。

階段 要做的事 完成的判斷
0. 準備 重新檢視事件記錄檔的大小與保留期間。若有收集機制(WEF 等)就確認其路徑 啟用稽核後記錄檔不會因覆寫而消失
1. 可視化 啟用三個稽核原則,收集到業務跑完一輪為止(至少要跨過一次月結) 做出「電腦 × 連線目標 × 處理程序」的清單,低頻率的處理也都跑完了
2. 分類 用第 5 章的表把原因分類。出現 NTLMv1 的主機另外歸類為最優先 所有資料列都標上了負責人與分類
3. 修正名稱 把直接寫死的 IP 位址改成 FQDN。註冊 SPN 對應的 8001 事件不再出現
4. 佐證(SMB) NET USE /BLOCKNTLM 逐一連線確認(依 7.1 節的步驟) 主要的共用資料夾不用 NTLM 也能連上
5. 試行(SMB) 在資訊部門的電腦等數台上執行 Set-SmbClientConfiguration -BlockNTLM $true 跨過一次結算處理,業務沒有受到影響
6. 推行(SMB) 用群組原則發布 SMB 的 NTLM 封鎖。例外清單建得越精簡越好 例外清單的件數處於可管理的規模
6b. SMB 以外 把 HTTP、SQL Server、WinRM、自製應用程式的剩餘部分,依「傳送到遠端伺服器的 NTLM 流量」的稽核 → 註冊例外 → 拒絕順序收緊。整個網域則用「這個網域中的 NTLM 驗證」依相同順序推進 SMB 以外的 8001 事件也不再出現
7. 持續 定期清點SMB 的例外清單與 Restrict NTLM 的伺服器例外清單兩者的件數。追蹤第二階段的功能提供狀況 每年例外都在減少

9.1. 就算擋住 SMB,那也只是 NTLM 對策的一半

階段 4~6 處理的只有 SMB。如第 7 章所述,SMB 用戶端的 NTLM 封鎖是 SMB 用戶端側的功能,4 對其他路徑沒有效果。在階段 2 分類為「以 HTTP 驗證」「SQL Server 變成 NTLM」「WinRM 使用 NTLM」的項目,就算推進到階段 6 也會原封不動地留著。而且它們不會出現在 SMB 的例外清單上,所以清點件數也看不到。

SMB 以外要用 Restrict NTLM,依稽核 → 例外 → 拒絕推進

負責收緊那些項目的是階段 6b。使用的就是第 4 章切換到稽核模式的那三個原則。步驟遵循相同的形式。11

  1. 維持「傳送到遠端伺服器的 NTLM 流量」為全部稽核,清查還殘留的連線目標
  2. 把無論如何都必要的對象註冊到「新增遠端伺服器的例外」
  3. 在試行電腦上切換為全部拒絕,等待業務跑完一輪
  4. 沒有問題就推行出去

整個網域也要先用對應的稽核確認影響,再切到拒絕

對整個網域則是把「這個網域中的 NTLM 驗證」同樣依稽核 → 例外(「新增這個網域中的伺服器例外」)→ 拒絕的順序推進。12 Microsoft 也表示,在選擇拒絕選項之前,應先把對應的稽核原則設為相同選項來評估影響。12

「擋住 SMB 就等於 NTLM 對策完成」是不對的。若要當成完成的指標,請把 SMB 的例外清單與 Restrict NTLM 的伺服器例外清單兩者都清點。

9.2. 稽核期間不是用「天數」,而是用「業務跑完一輪」來決定

階段 1 最容易失敗的,就是期間的決定方式。若認定「收集了兩週就完成」,那兩週內沒有跑到的處理就不會列入清單。而沒有列入清單的東西,會在階段 6 發布封鎖之後才第一次壞掉。

不只是月次處理,連復原、離線電腦都要清查

具體來說,容易漏掉的是以下這些。

  • 月次・季度的結算處理。月底批次以直接寫死的 IP 位址連線共用資料夾或資料庫,就是典型的例子。
  • 年度處理。盤點、年度切換、決算相關作業。
  • 只有故障時才會走的路徑。從備份復原的程序、切換到備援伺服器、DR 演練。
  • 長期離線的電腦。外帶 PC、長假中的負責人的電腦、平常沒有開機的備用機。
  • 一年只用幾次的業務應用程式。

等不了的話,就刻意執行低頻率的處理

Microsoft 的指南本身也表示,依部署的複雜程度不同,分析有可能長達數個月3 實際可行的界線是以下兩者之一。

  1. 持續執行稽核,直到業務跑完一輪。至少跨過一次月結,可以的話跨過一季。
  2. 清查低頻率的處理,並刻意執行它們。若等不了那麼久,就在驗證環境中跑一次結算處理或 DR 程序,把結果加進清單。重點在於先透過向負責人訪談,把「只是因為沒有執行才沒出現」的處理列舉出來。

無論哪一種情況,都請在能區分「沒有出現事件」與「還沒有執行」的狀態下,再進入下一個階段。

9.3. 不要一口氣切到拒絕

這裡的重點是不要一口氣把「傳送 NTLM 流量=全部拒絕」切下去。Microsoft 也表示,把這項原則設為拒絕會導致大量 NTLM 驗證要求失敗、可能降低生產力,因此應在實作前以「全部稽核」確認記錄檔、分析伺服器,並建立要排除的例外清單。7 對於以整個網域為對象的「這個網域中的 NTLM 驗證」原則,也寫著相同的警告。12

10. 總結

  • NTLM 已於 2024 年 6 月全版本列為已棄用。這不是會立即停止的變更,據稱在下一版 Windows Server、下一個年度發行版的 Windows 上仍會持續運作。1
  • 另一方面,NTLMv1 已經遭到移除(Windows 11 24H2 / Windows Server 2025)。只會說 NTLMv1 的裝置,以及記錄到 NTLM V1 的主機,是最近的期限。1
  • 廢除分三個階段,第一階段是稽核,第二階段(2026 年下半年)是 IAKerb 與本機 KDC,第三階段是預設停用。2
  • 稽核是把三個原則切換為稽核模式,蒐集 Microsoft-Windows-NTLM/Operational。若是網域帳戶,依「DC 的 8004 → 成員伺服器的 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 為前提所需的業務應用程式改修,以及驗證相關的缺陷調查等服務。

參考連結

  1. Microsoft Learn, Deprecated features in the Windows client。關於包含 LANMAN、NTLMv1、NTLMv2 在內的所有版本 NTLM,都不再是積極功能開發的對象、並列為已棄用;NTLM 的使用在下一版 Windows Server 與下一個年度發行版的 Windows 上仍會持續運作;呼叫 NTLM 的地方應改為呼叫 Negotiate,Negotiate 會先嘗試以 Kerberos 驗證,只有在必要時才回退到 NTLM;已棄用的公告時間為 2024 年 6 月;以及作為 2024 年 11 月的更新,NTLMv1 已從 Windows 11 版本 24H2 與 Windows Server 2025 中移除等內容。同時,關於已棄用(deprecated)與已移除(removed)是不同的階段,已棄用的功能不再進行積極開發、且有可能在未來的更新中移除,這樣的定位。  2 3 4 5 6 7 8 9 10 11 12

  2. Microsoft Japan Windows Technology Support Blog, NTLM の廃止に向けた対応について。關於 NTLM 廢除分三個階段進行(第一階段=使用狀況的可視化與稽核、第二階段=預定於 2026 年下半年提供的 NTLM 依賴情境對應功能、第三階段=在下一個主要版本中將網路 NTLM 驗證預設為停用);為了稽核而設定的三個群組原則(稽核這個網域中的 NTLM 驗證、稽核傳入的 NTLM 流量、傳送到遠端伺服器的 NTLM 流量=全部稽核)與 NTLM/Operational 記錄檔的確認方式;遷移到 Kerberos 時應考慮運用 IAKERB 與本機 KDC,以及本機 KDC 預定於 2026 年下半年提供;應用程式應使用 Negotiate;以及使用 NTLM 的代表性原因,包括以 IP 位址指定伺服器存取、防火牆限制了 Kerberos 所需的通訊埠、SPN 未註冊、對信任關係對象的驗證,以及工作群組環境中的驗證等內容。  2 3 4 5 6 7 8 9 10 11 12

  3. Microsoft Learn, Viewing events for assessing NTLM usage。關於在安全性記錄檔的登入事件中搜尋「驗證套件」,可從「詳細驗證資訊」的「套件名稱 (僅限 NTLM)」判斷是 NTLM V1 還是 V2;依部署的複雜程度不同,分析可能長達數個月;理論上支援 Kerberos、實際卻使用 NTLM 的應用程式四種類型(可選擇安全性組態或提供者的應用程式、SPN 未正確組態的應用程式、因設定錯誤或廠商文件而使用 IP 位址而非 DNS 名稱的應用程式、舊有程式碼庫中仍有 NTLM 專用部分的應用程式);稽核所使用的三個原則設定與對應的事件 ID;從網域控制站的事件 8004(日期時間・安全通道名稱・使用者名稱・網域名稱・工作站名稱),到成員伺服器的事件 8003(日期時間・使用者名稱・網域名稱・工作站名稱・PID),再到用戶端的事件 8001(日期時間・目標伺服器・指定的使用者・指定的網域・用戶端處理程序名稱・用戶端處理程序的使用者 ID)的追蹤程序;若目標伺服器既非 NetBIOS 格式也非 FQDN 格式,就不會使用 Kerberos;以本機使用者帳戶連線檔案伺服器時,網域控制站的事件 8004 有時不會發生;以及像 SMB 這種經由重新導向器通訊的應用程式,PID 永遠是 4(SYSTEM),必須用 Process Monitor 鎖定用戶端的呼叫端處理程序等內容。  2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

  4. Microsoft Learn, Block NTLM connections on SMB in Windows Server 2025。關於 SMB 用戶端可以在對遠端的傳出連線中封鎖 NTLM 驗證;藉此可防止讓惡意伺服器誘導送出 NTLM 要求的手法,並對抗暴力破解、破解攻擊與 Pass-the-Hash 攻擊;NTLM 封鎖是組織把驗證協定切換到 Kerberos 時的必要條件,同時即使不完全停用 NTLM 也能單獨啟用這一層保護;前提條件是 Windows Server 2025(含)以後或 Windows 11 版本 24H2(含)以後的 SMB 用戶端,以及能夠使用 Kerberos 的 SMB 伺服器;NTLM 封鎖是 SMB 用戶端側的功能,連線目標的 SMB 伺服器只要能使用 PKU2U 或 Kerberos 的 OS 即可;群組原則要啟用「電腦設定 > 系統管理範本 > 網路 > Lanman 工作站」中的「封鎖 NTLM (LM、NTLM、NTLMv2)」;PowerShell 則使用 Set-SmbClientConfiguration -BlockNTLM $true;用來設定例外的「封鎖 NTLM 伺服器例外清單」原則,要列舉 IP 位址、NetBIOS 名稱、FQDN,由於沒有對應的 PowerShell Cmdlet,第一次必須用群組原則編輯器設定,之後則可透過新增登錄值 BlockNTLMServerExceptionList 逐一新增例外;以及可透過 NET USE \\server\share /BLOCKNTLMNew-SmbMapping -RemotePath \\server\share -BlockNTLM $true,以磁碟機對應為單位封鎖 NTLM 等內容。  2 3 4 5 6 7 8 9 10 11 12 13 14

  5. Microsoft Learn, Microsoft NTLM。關於 NTLM 認證資訊是由互動式登入時取得的網域名稱、使用者名稱以及密碼的單向雜湊值所組成;透過加密的挑戰/回應,在不讓密碼流經線路的情況下完成驗證;非互動式驗證的程序(用戶端以明文傳送使用者名稱、伺服器產生 8 位元組的亂數作為挑戰值並傳送、用戶端以密碼的雜湊值加密挑戰值並回傳回應、伺服器把使用者名稱・挑戰值・回應三項傳送給網域控制站、網域控制站以從 SAM 資料庫取出的雜湊值做相同計算並比對);以及應用程式不應直接存取 NTLM 安全性套件,而應使用 Negotiate 安全性套件,Negotiate 會在 Kerberos 與 NTLM 之間擇一,除非參與驗證的系統中有一方無法使用 Kerberos,否則一律選擇 Kerberos 等內容。  2 3 4

  6. Microsoft Learn, NTLM overview in Windows Server。關於 NTLM 驗證是包含在 Msv1_0.dll 中的一組驗證協定(LAN Manager 版本 1、2,NTLM 版本 1、2);透過挑戰/回應機制驗證使用者與電腦;資源伺服器每次需要新的存取權杖時,若是網域帳戶就向網域控制站的驗證服務查詢,若是本機帳戶則參照本機的帳戶資料庫;在組態為工作群組成員的系統上進行 Windows 驗證,以及在網域控制站以外進行本機登入驗證時,目前仍然使用、也必須使用 NTLM;在 Active Directory 環境中,Kerberos version 5 是建議採用的驗證方式;以及要減少 NTLM 的使用,必須同時掌握已部署應用程式的需求,並完成改用其他協定所需的組態步驟等內容。  2 3

  7. Microsoft Learn, Network security: Restrict NTLM: Outgoing NTLM traffic to remote servers。關於設定值有「全部允許」「全部稽核」「全部拒絕」「未定義」四種,未定義的處理方式與「全部允許」相同;建議的步驟是先選擇「全部稽核」,確認運作記錄檔之後,再建立伺服器例外清單;設定位置在「電腦設定\Windows 設定\安全性設定\本機原則\安全性選項」;不需要重新啟動,無論是本機儲存還是群組原則發布,儲存當下就會生效;稽核與封鎖的事件會記錄在「應用程式與服務記錄檔\Microsoft\Windows\NTLM」的運作記錄檔中,且沒有用來查看此輸出的安全性稽核事件原則;NTLM 與 NTLMv2 驗證對包含 SMB 中繼、中間人攻擊、暴力破解攻擊在內的惡意攻擊都很脆弱;以及設為拒絕會導致大量 NTLM 驗證要求失敗、可能降低生產力,因此應事先以稽核評估影響並建立例外清單等內容。  2 3 4 5 6 7 8

  8. Microsoft Learn, Kerberos authentication overview in Windows Server。關於 KDC 在網域控制站上運作,並使用 Active Directory Domain Services 的資料庫作為安全性帳戶資料庫;Kerberos 支援由服務進行的委派(代表用戶端連線到其他服務的機制),而 NTLM 與 Kerberos 提供的則是讓服務在本機偽裝用戶端所需的授權資訊;在 Kerberos 出現之前的 NTLM 驗證中,應用程式伺服器每次驗證用戶端或服務時都必須連線到網域控制站,相對地在 Kerberos 中,可更新的工作階段票證取代了這種傳遞驗證,除非需要驗證 PAC,否則伺服器不需要連往網域控制站;以及在 Kerberos 中,連線的雙方都能驗證對方的身分,而 NTLM 既不讓用戶端驗證伺服器,也不讓某台伺服器驗證另一台伺服器,是為了可以假設伺服器為真的環境所設計等內容。  2

  9. Microsoft Learn, Assessing NTLM usage。關於在實作用於改用 Kerberos 等改良驗證協定的原則與作業之前,必須先發現並稽核目前 NTLM 驗證流量的狀態;應擷取 NTLM 使用狀況的三個地點(網域內網域控制站的傳出流量、遠端伺服器的傳入流量、從用戶端到遠端伺服器的傳入流量);以及掌握環境是一項反覆進行的作業等內容。 

  10. Microsoft Learn, Configuring Kerberos for IP Address。關於 Windows 10 版本 1507 與 Windows Server 2016(含)以後,可以讓 Kerberos 用戶端支援 SPN 內的 IPv4/IPv6 主機名稱;在預設情況下,當主機名稱是 IP 位址時,Windows 不會對該主機嘗試 Kerberos 驗證,而是回退到 NTLM 等其他有效的驗證協定;應用程式因為寫死 IP 位址而回退到 NTLM,可能在逐步停用 NTLM 的環境中造成相容性問題;為了減少這種影響,導入了可將 IP 位址用作 SPN 主機名稱的功能,只要把用戶端登錄值 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\Kerberos\Parameters 底下的 TryIPSPN(REG_DWORD,預設不存在)設為 1 即可啟用,且需要在每一台必須用 IP 位址存取 Kerberos 保護資源的用戶端上設定;以及 IP 位址是暫時性的,可能因租約到期與更新而引發衝突或驗證失敗,因此通常不應取代主機名稱使用,以 IP 位址為基礎的 SPN 註冊,應僅限於無法以人工方式切換為以 DNS 為基礎的主機名稱時採用;註冊時使用 Setspn -s <service>/<ip.address> <domain-user-account>,由於 SPN 在 Active Directory 中一次只能註冊在一個帳戶上,因此建議在使用 DHCP 時將 IP 位址設為靜態保留等內容。  2 3 4

  11. Microsoft Learn, Restricting NTLM usage。關於在實作「限制 NTLM」安全性原則之前,必須先發現並稽核目前 NTLM 驗證流量的狀態;限制 NTLM 流量的三個地點(網域內網域控制站的 NTLM 流量、來自遠端伺服器的傳出 NTLM 流量、從用戶端到連線目標遠端伺服器的 NTLM 流量);以及在判斷為可以接受的伺服器上,組態伺服器例外以允許 NTLM 驗證等內容。 

  12. Microsoft Learn, Network security: Restrict NTLM: NTLM authentication in this domain。關於設定值有「停用」「拒絕從網域帳戶到網域伺服器」「拒絕網域帳戶」「拒絕網域伺服器」「全部拒絕」「未定義」;這項原則僅套用於網域控制站,不會影響對網域控制站的互動式登入;遭到拒絕的要求會傳回 NTLM 封鎖錯誤,列在「新增這個網域中的伺服器例外」原則例外清單中的伺服器則會被排除;以及在選擇拒絕選項之前,應先把對應的稽核原則設為相同選項,並以運作記錄檔評估其影響等內容。  2 3

共用相同標籤的最新文章。能以相近的主題延伸理解。

與本文相近的主題頁面。以本文為起點,可進一步連到相關服務與其他文章。

本文連結到以下服務頁面,歡迎從最接近的入口查看。

常見問題

整理諮詢這個主題時常見的問題。

NTLM 廢除之後,業務會從什麼時候開始停擺?
光是「已棄用(deprecated)」的公告本身,並不會讓任何東西停止運作。Microsoft 在 2024 年 6 月將 NTLM 的所有版本列為已棄用,但當時的說明是「NTLM 在下一版 Windows Server 與下一個年度發行版的 Windows 上仍會持續運作」。目前實際上已經停止運作的具體變更,是 Windows 11 版本 24H2 與 Windows Server 2025 中 NTLMv1 的移除。雖然已公布未來版本會將網路 NTLM 預設為停用的計畫,但即使到了那個時間點,仍可透過原則重新啟用。也就是說,這並非「某天突然全公司停擺」的變更,而是每次 OS 更新就會逐步收緊的變更。正因如此,與其等停擺後才調查,唯一實際可行的準備方式,就是趁 NTLM 還在運作時,透過稽核記錄盤點出相依之處。
要如何列出使用 NTLM 的位置?
把群組原則中「網路安全性: 限制 NTLM」系列的設定切換為稽核模式,並蒐集 NTLM/Operational 記錄檔。只要在網域控制站設定「稽核這個網域中的 NTLM 驗證」,並在伺服器與用戶端設定「稽核傳入的 NTLM 流量」與「傳送到遠端伺服器的 NTLM 流量=全部稽核」,事件檢視器的「應用程式與服務記錄檔 > Microsoft > Windows > NTLM」中就會記錄相關事件。若是網域帳戶的驗證,追蹤順序是:先用網域控制站的事件 8004 鎖定使用者與連線目標伺服器(安全通道名稱),再看該伺服器事件 8003 的處理程序識別碼(PID),最後用用戶端的事件 8001 確定「哪個應用程式,以哪個伺服器名稱」提出要求。事件 8001 中會包含目標伺服器名稱與用戶端處理程序名稱,追到這一步就能鎖定原因應用程式。不過,本機帳戶的驗證不會經過網域控制站,因此不會出現 8004。工作群組主機或檔案伺服器上以本機帳戶連線共用資料夾的路徑,必須從伺服器端的 8003 與用戶端的 8001 擷取。請不要只看網域控制站的記錄檔,就判斷「我們公司的量很少」。
稽核之後,事件的 PID 幾乎都是 4(SYSTEM),看不出是哪個應用程式。
這是因為通訊經由 SMB(共用資料夾)。SMB 的驗證是由核心模式的重新導向器進行,呼叫端的應用程式因而隱藏在 SMB 封包的另一側,事件中留下的 PID 永遠是 4(SYSTEM)。Microsoft 的指南也明確提到這種情況,並提出對策:在有出現事件的用戶端上執行 Process Monitor(ProcMon),以對方伺服器的電腦名稱與 IP 位址篩選路徑,再與伺服器端事件 8003 的時間戳記比對,藉此鎖定呼叫端處理程序。實務上,先用事件記錄檔把範圍縮小到「哪一台電腦」,再只針對那一台電腦執行 ProcMon,是最快的做法。
應該支援 Kerberos 的應用程式,為什麼還是會落回 NTLM?
大多是名稱的問題。Microsoft 的指南列舉了理論上支援 Kerberos、實際卻使用 NTLM 的應用程式,共有四種:可以選擇安全性組態或提供者的應用程式、SPN(服務主體名稱)未正確註冊的應用程式、因設定錯誤或廠商操作手冊而以 IP 位址(而非 DNS 名稱)連線的應用程式,以及舊有程式碼庫中仍殘留 NTLM 專用部分的應用程式。若事件 8001 的「目標伺服器」既不是 NetBIOS 名稱也不是 FQDN 格式(也就是 IP 位址),在預設組態下就不會使用 Kerberos。最先該做的兩件事,是把直接輸入的 IP 位址改成 FQDN,以及若是以別名存取,就替該名稱註冊 SPN。另外,若真的無法改成名稱,也備有在用戶端設定 TryIPSPN、手動註冊 IP 位址 SPN 的方法,不過 Microsoft 自己也表示這應僅限於無法改為 DNS 名稱的情況,終究只是最後手段。
自行開發的 Windows 應用程式,應該修正哪裡?
把在驗證套件中直接指名 NTLM 的地方,換成 Negotiate。Microsoft 明確表示「應用程式不應直接存取 NTLM 安全性套件,而應使用 Negotiate 套件」。Negotiate 會在 Kerberos 與 NTLM 之間擇一,除非參與驗證的系統中有一方無法使用 Kerberos,否則一律選擇 Kerberos。以 .NET 為例,典型的修正方式是把傳給 CredentialCache.Add 的驗證類型從 "NTLM" 改成 "Negotiate"(指定驗證類型的是 CredentialCache.Add,而不是 NetworkCredential 的建構函式)。同時,也需要把連線目標從 IP 位址或寫在 hosts 中的別名改為 FQDN 指定,若是要讓自製服務以 Kerberos 接受驗證,還需要替該服務帳戶註冊 SPN。

作者檔案

本文作者的個人檔案頁面。

Go Komura

小村軟體有限公司 代表

以 Windows 軟體開發、技術諮詢與故障調查為中心,在難以重現的故障調查與既有資產仍在運作的專案上具有優勢。

回到部落格一覽