NTLM廃止で業務アプリは止まるか ── 監査ログの取り方と、依存を潰す順番
· 更新日: · 小村 豪 · NTLM, Kerberos, Windows, Active Directory, セキュリティ, 情報システム, PowerShell
「NTLMが廃止されるらしい。うちは大丈夫か」──2024年6月にマイクロソフトがNTLMの全バージョンを非推奨(deprecated)と発表して以来、この質問を受ける機会が増えました。答えは、大丈夫かどうかは調べれば分かるし、いま調べれば間に合うです。
NTLMの廃止は「ある日パッチが当たって全社が止まる」種類の変更ではありません。OSを新しくするたびに少しずつ締まっていく変更で、しかもまだNTLMが動いているいまだけ、「自社のどこがNTLMに依存しているか」を安全に一覧化できます。全部止めてから壊れた場所を探すのは、いちばんやってはいけない順番です。
この記事は、その一覧を作って潰していくための実務手順に絞ります。プロトコルの仕組みそのもの(なぜNTLMが危ないのか、なぜKerberosに落ちないのか)は、対になる記事「図解でわかるNTLMとKerberos ── なぜNTLMに「落ちる」のか」に分けました。
1. まず結論
- NTLMは2024年6月に非推奨になりました。対象はLANMAN・NTLMv1・NTLMv2を含む全バージョンで、「もう積極的な機能開発はしない」という宣言です。同時に「次期Windows Serverと次の年次リリースのWindowsでもNTLMの利用は動作し続ける」とも書かれています。1
- すでに削除された部分があります。NTLMv1は、Windows 11 バージョン24H2とWindows Server 2025で削除されました。1
- 廃止は3フェーズで進みます。フェーズ1が利用状況の可視化と監査、フェーズ2(2026年後半)がNTLMに頼らざるを得ない場面をなくすための機能(IAKerb、ローカルKDC)、フェーズ3が次期メジャーリリースでのネットワークNTLM認証の既定無効化です。2
- いまやるべきことは1つだけです。監査モードを回して「どの端末の、どのアプリが、どのサーバーに対して」NTLMを使っているかの一覧を作ることです(4章)。
- ドメインアカウントの調査は、ドメインコントローラーから始めます。イベント8004 → メンバーサーバーの8003 → クライアントの8001、という順にたどると、最後にアプリ名まで届きます(4.2節)。ただしローカルアカウントでの認証はドメインコントローラーを経由しないので8004が出ません。この経路はサーバー側の8003とクライアント側の8001から拾います。3
- 原因の大半は「名前」です。IPアドレス直打ちとSPN未登録が二大要因で、どちらもアプリを作り直さずに直せます(5章)。32
- 1台だけで安全に試す方法があります。Windows 11 24H2 / Windows Server 2025なら
NET USE \\server\share /BLOCKNTLMで、ポリシーを一切変えずに「NTLMなしで繋がるか」を確認できます(7章)。4 - 自作アプリは、NTLMを名指ししている箇所をNegotiateに変えます。マイクロソフト自身が「NTLMセキュリティパッケージに直接アクセスするな」と書いています(8章)。5
2. 「非推奨」は何を意味するのか
最初に用語を整理しておきます。ここを曖昧にしたまま社内に説明すると、「もう使えないらしい」と「まだ何年も平気らしい」が同時に流れて話が混乱します。
マイクロソフトの非推奨機能一覧に載っているNTLMの記述は、要約すると次の3点です。1
- LANMAN、NTLMv1、NTLMv2を含むすべてのバージョンのNTLMが、積極的な機能開発の対象外であり、非推奨である。
- NTLMの利用は、次期Windows Serverと次の年次リリースのWindowsでも動作し続ける。
- NTLMの呼び出しはNegotiateの呼び出しに置き換えるべきである。NegotiateはKerberosでの認証を試み、必要なときだけNTLMにフォールバックする。
そして更新情報として、NTLMv1はWindows 11 バージョン24H2およびWindows Server 2025で削除されたことが追記されています。1
つまり現在地は「非推奨(deprecated)」であって「削除(removed)」ではありません。ただしNTLMv1だけは、非推奨を通り越してすでに削除フェーズに入っています。古い複合機やNASがNTLMv1でしか認証できない場合、Windows 11 24H2への更新がそのまま障害になります。これは将来の話ではなく、いま起きている話です。
もうひとつ押さえておきたいのは、NTLMには「代替が存在しない用途」が残っていることです。マイクロソフトは、ワークグループ構成のシステムでのWindows認証と、ドメインコントローラー以外でのローカルログオン認証には、依然としてNTLMが使われ、使われなければならないと明記しています。6 フェーズ2で予定されているローカルKDCは、まさにこの「ローカルアカウントのためにNTLMが必要」という穴を埋めるための機能です。2
3. なぜ消えるのか ── 3分だけ
移行の判断材料として最低限だけ押さえます。詳しい図解は対になる記事に譲ります。
マイクロソフトはポリシー設定のドキュメントで、NTLMおよびNTLMv2認証は、SMBリレー、中間者攻撃、総当たり攻撃を含むさまざまな悪意ある攻撃に対して脆弱であると、はっきり書いています。7 根っこにあるのは、Kerberosとの比較で語られる次の性質です。8
- 相互認証がない。NTLMでは、クライアントがサーバーの身元を検証することも、サーバーが別のサーバーの身元を検証することもできません。NTLMは「サーバーは本物である」と仮定できるネットワーク環境向けに設計されたものです。Kerberosはその仮定を置きません。この差が、偽サーバーへ認証情報を送らせるリレー攻撃の成立条件になります。
- サーバーが毎回ドメインコントローラーに問い合わせる(ドメインアカウントの場合)。NTLMでは、アプリケーションサーバーはドメインアカウントのクライアントを認証するたびにドメインコントローラーへ接続する必要があります(サーバーにローカルなアカウントなら、サーバーが自分のアカウントデータベースを引いて判定します)。6 Kerberosでは更新可能なセッションチケットがこのパススルー認証を置き換え、サーバーはPAC(特権属性証明書)の検証が必要な場合を除きドメインコントローラーへ行く必要がありません。
- 認証材料がパスワードのハッシュそのもの。NTLMの資格情報は、ドメイン名・ユーザー名・パスワードの一方向ハッシュで構成され、クライアントはこのハッシュでチャレンジを暗号化して応答を返します。5 ハッシュを盗めば、平文パスワードを知らなくてもなりすませる、という性質がここから出てきます。
「相互認証がない」の実務的な意味は、SMB共有に繋ごうとしただけで、偽のサーバーに認証情報を渡してしまい得るということです。マイクロソフトがSMBクライアント側のNTLMブロック機能を用意した理由も、「悪意あるサーバーにNTLM要求を送らせる手口を防ぐ」と説明されています。4
4. 監査 ── どこでNTLMが使われているかを一覧にする
ここが本題です。マイクロソフトのガイドも、制限ポリシーを実装する前に現在のNTLM認証トラフィックの状態を発見し監査することが必要であると明記しています。9
4.1. 監査モードを有効にする
設定するのは3つのポリシーです。場所はいずれも コンピューターの構成\Windowsの設定\セキュリティの設定\ローカル ポリシー\セキュリティ オプション で、再起動は不要です。ローカルに保存した場合も、グループポリシーで配布した場合も、設定が適用された時点で有効になります。7
ただし「再起動が不要」と「すぐ全台に効く」は別の話です。ドメインのGPOで配る場合、GPOを保存した時点で更新されるのはAD/SYSVOL上のポリシーだけで、各端末が実際に監査を始めるのは次のバックグラウンド更新か gpupdate /force を打ったあとです。監査期間の起点は「GPOを保存した日時」ではなく「対象端末に適用が行き渡った日時」として数えてください。ここを取り違えると、最初の1回の集計だけ対象台数が少ない、という形で結果が歪みます。
| ポリシー | 適用先 | 設定値 |
|---|---|---|
| ネットワーク セキュリティ: NTLM を制限する: このドメインでの NTLM 認証を監査する | ドメインコントローラー | すべて有効にする |
| ネットワーク セキュリティ: NTLM を制限する: 受信 NTLM トラフィックを監査する | すべてのサーバーとクライアント | すべてのアカウントに対して監査を有効にする |
| ネットワーク セキュリティ: NTLM を制限する: リモート サーバーへの送信 NTLM トラフィック | すべてのサーバーとクライアント | すべて監査する |
3つ目の「リモートサーバーへの送信NTLMトラフィック」にはすべて許可する / すべて監査する / すべて拒否する / 未定義の4つの値があり、未定義は「すべて許可する」と同じ扱いです。マイクロソフトの推奨も明快で、いきなり「すべて拒否する」を選ばず、まず「すべて監査する」にして運用ログを確認し、どのサーバーが認証要求を受けているかを把握してから例外リストを作れ、というものです。7
記録先はイベントビューアー > アプリケーションとサービス ログ > Microsoft > Windows > NTLM(Microsoft-Windows-NTLM/Operational)です。この監査には対応するセキュリティ監査イベントポリシーが存在しないため、セキュリティログではなくこのチャネルを見ます。7
注意: 監査モードは記録するだけで何もブロックしません。一方で、台数が多い環境ではログ量が一気に増えます。イベント収集(WEF)を使っていない場合は、ログサイズの上限と保存期間を先に見直してから有効にしてください。マイクロソフトのガイドも、環境の複雑さによっては分析に数か月かかりうるとしています。3
4.2. 追跡は「ドメインコントローラーから下流へ」
集まったイベントをどう読むかには、決まった順番があります。マイクロソフトのガイドが示す追跡経路は次のとおりです。3
flowchart TD
DC["ドメインコントローラー<br/>イベント 8004"]
MS["メンバーサーバー<br/>イベント 8003"]
CL["クライアント<br/>イベント 8001"]
APP["原因のアプリケーション"]
DC -->|"セキュア チャネル名 =<br/>調べるべきサーバー"| MS
MS -->|"ワークステーション名 =<br/>調べるべきクライアント"| CL
CL -->|"クライアント プロセス名"| APP
MS -.->|"PID が 4 (SYSTEM) なら<br/>SMB 経由"| CL
図1: NTLM監査イベントの追跡順序
各イベントで見るべき項目は次のとおりです。3
| イベント | 記録される場所 | 主な項目 | 読み方 |
|---|---|---|---|
| 8004 | ドメインコントローラー | 日時 / セキュア チャネル名 / ユーザー名 / ドメイン名 / ワークステーション名 | 「セキュア チャネル名」が、クライアントが接続したメンバーサーバー。次はそのサーバーの8003を見る |
| 8003 | メンバーサーバー | 日時 / ユーザー名 / ドメイン名 / ワークステーション名 / PID | PIDが4(SYSTEM)ならカーネルモード経由(=SMB)。「ワークステーション名」のクライアントで8001を見る |
| 8001 | クライアント | 日時 / ターゲット サーバー / 指定されたユーザー / 指定されたドメイン / クライアント プロセス名 / クライアント プロセスのユーザーID | ここで原因が確定する。「ターゲット サーバー」がNetBIOS名でもFQDNでもない形式(=IPアドレス)なら、既定の構成ではKerberosは使われない |
この経路で特に価値があるのは、8001の「ターゲット サーバー」と「クライアント プロセス名」です。前者は「なぜKerberosにならなかったか」を、後者は「誰が悪いか」を直接教えてくれます。マイクロソフトのガイドも、この情報からユーザーがWebサーバーのIPアドレスに接続していて、Kerberosが使えたはずのNetBIOS名やFQDNを使っていないことを特定できると説明しています。3
なお、ドメインコントローラーに8004が出ないケースもあります。ローカルユーザーアカウントでファイルサーバーに接続している場合、その認証はドメインコントローラーを経由しないためです。3 「DCのログを見たら少なかったので大丈夫」と判断してはいけません。
4.3. PowerShellで集計する
イベントビューアーの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 } }
イベントが出ていることを確認したら、クライアント側の8001を「接続先サーバー × 呼び出し元プロセス」で束ねます。イベントのフィールド構成はイベントIDごとに違うので、まず1件を Format-List で開いて構造を確認してからインデックスを決めるのが安全です。
# まず1件だけ中身を確認する
$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'
構造が分かったら、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
フィールド名はOSのバージョンによって差があるため、候補を優先順位つきの配列で並べ、実在するものだけを拾う形にしています。ここで -match 'Process' のような部分一致を使うと、ClientProcessId のようなPIDのフィールドまで引っかかり、実行ファイル名ではなく毎回変わるPIDで集計してしまうことがあります(ハッシュテーブルのキー順は不定なので、どちらが取れるかも安定しません)。Process 列が全部空になったら、候補名が実際のスキーマと合っていないサインなので、前の手順で確認した名前を配列に足してください。
複数台から集めるなら、PowerShell Remotingで並列に回すのが早いです(「PowerShell Remoting(WinRM)入門」)。Get-WinEvent の絞り込みは -FilterHashtable を使うかどうかで所要時間が桁違いになるので、その勘所は「Get-WinEventでイベントログを実務的に調べる」にまとめています。
4.4. セキュリティログ側から見る ── NTLMv1がまだ使われていないか
NTLM/Operationalとは別に、セキュリティログのログオンイベントからNTLMのバージョンを確認する方法もあります。手順は、セキュリティログで「認証パッケージ」を検索し、各イベントの「詳細な認証情報」を見る、というものです。3
詳細な認証情報:
ログオン プロセス: NtLmSsp
認証パッケージ: NTLM
移行されたサービス: -
パッケージ名 (NTLM のみ): NTLM V1
キーの長さ: 128
この「パッケージ名 (NTLM のみ)」が、NTLMプロトコル群のどのサブプロトコルが使われたかを示します。3 NTLM V1 が出ているホストは、そのままWindows 11 24H2 / Windows Server 2025に上げると認証が通らなくなる候補です。NTLMv1はこれらのバージョンで削除されているためです。1 監査を回すとき、この観点だけは優先度を上げて拾ってください。
4.5. PIDが4(SYSTEM)ばかりで進めないとき
監査を始めると、ほぼ必ずこの壁に当たります。SMB(共有フォルダ)のようにリダイレクター経由で通信するアプリでは、認証を要求する主体がカーネルモードのリダイレクターになるため、イベントに残るPIDは常に4(SYSTEM)になります。3
マイクロソフトのガイドが示す対処は次のとおりです。3
- NTLM資格情報を送っているクライアント(8001の「コンピューター」)に、プロセス監視ツールを入れる。
- 相手サーバーのコンピューター名とIPアドレスの両方でパスをフィルターする。長時間の採取が必要ならバックグラウンドモードで回す。
- 採取結果を、サーバー側イベント8003のタイムスタンプと突き合わせる。ユーザー・パス・認証識別子が対応するので、そこから呼び出し元アプリケーションが特定できる。
ツールはProcess Monitor(ProcMon)です。フィルターの当て方と読み方は「Process Monitor(ProcMon)実践ガイド」にまとめてあります。
実務的なコツを1つ足すと、この段階までイベントログだけで「どの端末か」を絞り切ってから、その端末1台にだけProcMonを仕掛けるのが圧倒的に速いです。全台にProcMonを配るのは現実的ではありません。
5. NTLMに落ちる典型パターン
監査で場所が分かったら、次は原因の分類です。マイクロソフトのガイドは、理屈のうえではKerberosに対応していても、NTLMを使ってしまうアプリケーションとして次の4つを挙げています。3
- さまざまなセキュリティ構成やプロバイダーを選択できるアプリケーション
- SPN(サービスプリンシパル名)が正しく構成されていないアプリケーション
- 設定ミスやベンダーのドキュメントのせいで、DNS名ではなくIPアドレスを使っているアプリケーション
- レガシーなコードベースを持ち、NTLM専用の部分が残っているアプリケーション
マイクロソフト日本のサポートブログは、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登録で直る |
| 自社開発のサービス/IISサイトを専用アカウントで動かしている | サービスアカウントにSPNが未登録 | 同上 | SPN登録で直る |
| 拠点やVPN越しでドメインコントローラーに到達できない | Kerberosに必要な通信が通らずフォールバックする | ファイアウォールのルールとDC到達性 | 経路の問題 |
| NAS・複合機・スキャナのSMB送信先がWindows共有 | 機器側がKerberosに対応していない、またはローカルアカウントで認証している | 機器の認証設定と、サーバー側の8003 | 機器依存 |
| ワークグループ機、ローカルアカウントでの共有アクセス(両端が新しいWindows) | ドメインアカウントではないため、そもそもKerberosの土俵にない | ドメインコントローラーに8004が出ない | フェーズ2で解決しうる |
| 同上だが、古いWindowsや他社製機器が相手 | 同上。ただしローカルKDCは対応するWindows同士でないと効かない | 相手のOSバージョン/機種を確認する | 自分で手を打つ(ドメイン参加・更改・別プロトコル・例外) |
| 他社ドメイン・信頼関係のない相手への認証 | Kerberosのチケットが発行できない | イベント8001の「指定されたドメイン」 | 設計判断が必要 |
| 認証方式を選べる古いパッケージ製品 | 設定でNTLM固定になっている | 製品の認証設定画面 | 設定変更 or ベンダー確認 |
「すぐ直せる」と「SPN登録で直る」に分類されたものが、監査結果の大半を占めるはずです。ここを潰すだけで、残る例外はかなり少なくなります。
6. 直し方の判断表
| 分類 | やること | 注意点 |
|---|---|---|
| IPアドレス直打ち | 接続先をFQDNに変更する。共有フォルダのショートカット、ドライブマッピング、アプリの設定ファイル、バッチ、タスクスケジューラの引数まで洗う | 名前解決が確実に効くことを先に確認する。ネットワークドライブとUNCパスまわりの落とし穴は別記事にまとめている |
| IPアドレス直打ちだが、どうしても名前に変えられない | クライアントに TryIPSPN を設定し、IPアドレスのSPNを Setspn -s <サービスクラス>/<IPアドレス> <アカウント> で手動登録する |
最後の手段。登録するのはクライアントが実際に要求するサービスクラス。共有フォルダなど HOST にマップされるサービスは host/192.168.1.1 で足りるが、Webは HTTP/192.168.1.1、SQL Serverは MSSQLSvc/192.168.1.1:1433 のようにポートまで含めた別のSPNが必要で、host/ だけ登録しても一致せずNTLMに落ちる。マイクロソフト自身が、IPアドレスは一時的なものなのでSPNには通常使わず、DNS名に変更できない場合にのみ使うべき手動作業だとしている。DHCPなら静的な予約が前提。設定はアクセスする側の各クライアントに必要10 |
| SPN未登録 | サービスを実行しているアカウントに対し、アクセスに使う名前でSPNを登録する | SPNの重複登録はKerberos認証そのものを壊す。登録前に必ず既存の重複を確認する |
| 別名(CNAME)でのアクセス | 別名でもSPNを登録するか、アクセスをFQDNに統一する | 「本来の名前」と「実際に使われている名前」が食い違っているのが原因なので、どちらに寄せるかを先に決める |
| DCに到達できない拠点 | Kerberosに必要な通信を通す。恒久的に到達できない構成なら、フェーズ2のIAKerbが解になりうる | IAKerbとローカルKDCの提供は2026年後半の予定。自社の対象バージョンで実際に使えるかはリリースノートで確認する2 |
| ローカルアカウント運用 | まず相手の素性で仕分ける。対応するWindows同士ならフェーズ2のローカルKDCが解になりうるが、古いWindowsや他社製機器(NAS・複合機など)はその対象にならない。後者はドメイン参加・機器更改・別プロトコルへの切り替え・例外リストのいずれかを選ぶ | 「ローカルアカウントだからフェーズ2待ち」とまとめて棚上げしないこと。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認証を使うことをブロックします。マイクロソフトは、これによって悪意あるサーバーへNTLM要求を送らせる手口を防ぎ、総当たり・クラッキング・Pass-the-Hash攻撃に対抗できるとし、さらに組織の認証プロトコルをKerberosへ切り替えるうえでNTLMブロックが必要だと位置づけています。同時に、NTLMを完全に無効化しなくてもこの保護層だけを有効にできるとも書かれています。4
前提条件は次の2つです。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依存箇所です。ポリシーを一切変えずに、1接続ずつ「本番で止まるかどうか」を確認できるので、監査ログの裏取りに向いています。
ただし、この確認には手順が要ります。何も考えずに実行すると、両方向に誤判定します。
$server = 'fileserver.corp.example.com'
# 1. そのサーバーへのマッピングを「1つ残らず」外す
# 別の共有が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 つまり成功の理由がKerberosではなくPKU2Uである可能性が残ります。ドメイン参加済みのファイルサーバーが相手ならまず問題になりませんが、実際に何で認証したかまで確定させたいときは、接続後にクライアントで 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コマンドレットは用意されていないため、初回はグループポリシーエディターで設定する必要がありますが、いったん作ったあとの個別追加はレジストリ操作でできます。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
注意: マイクロソフトのドキュメントに載っているサンプルは、値がまだ存在しない場合の分岐が
@("")を設定するだけになっており、追加したかったエントリがそのまま捨てられます。4 初回実行では例外が1件も入らず、2回目の実行でようやく入る、という挙動になるので、上のコードでは未作成の場合も追加対象をそのまま書き込むようにしています。とはいえ、そもそもこのレジストリ値はグループポリシーが管理する領域です。恒久的な例外はグループポリシー側で管理し、この操作は緊急時の一時対応に留めてください。次のポリシー適用で上書きされます。
注意: この機能はSMBクライアント側の機能です。4 SMB以外の経路(自社アプリのHTTP通信、SQL Serverへの接続、WinRMなど)でのNTLMは、これでは止まりません。そちらは5章の分類に従って個別に潰す必要があります。
8. 開発者から見たNTLM ── Negotiateを使う
自社でWindowsアプリを作っている場合、直す箇所ははっきりしています。マイクロソフトは次のように明記しています。5
アプリケーションはNTLMセキュリティパッケージに直接アクセスすべきではありません。代わりにNegotiateセキュリティパッケージを使うべきです。Negotiateは、認証に関わるシステムがサポートしていれば、より高度なセキュリティプロトコルを利用できるようにします。現在、NegotiateセキュリティパッケージはKerberosとNTLMのどちらかを選択します。Negotiateは、認証に関わるシステムのいずれかがKerberosを使えない場合を除き、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 で包まない、生成パターン、タイムアウト設計)は「HttpClientをusingで包むな」に整理しています。
SSPIを直接扱う必要がある場合は、.NET 7以降で追加された System.Net.Security.NegotiateAuthentication を使うと、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を登録する必要があります。SPNが登録されていないアプリケーションは、Kerberos対応をうたっていてもNTLMに落ちる、という代表例としてマイクロソフト自身が挙げているとおりです。3
登録先を「サービスを実行しているアカウント」と単純に考えると、IISでつまずきます。IISのWindows認証は既定でカーネルモード認証が有効で、このときKerberosチケットを復号するのはアプリケーションプールのIDではなくHTTP.sysが使うマシンアカウントです。専用のドメインアカウントでアプリケーションプールを動かしているからといって、そのアカウントにサイトのHTTP SPNを登録すると、SPNの持ち主と実際に復号するアカウントが食い違い、NTLMに落ちるどころか KRB_AP_ERR_MODIFIED で認証そのものが失敗します。
要点は「SPNの登録先と、チケットを復号するIDを一致させる」ことです。取れる形は次の2つです。
- マシンアカウントで復号する(既定のまま):サイトをホスト名で公開しているなら、そのホスト名のHTTP SPNをマシンアカウントに登録する。
- アプリケーションプールのIDで復号する:
useAppPoolCredentialsを有効にしたうえで、HTTP SPNをアプリケーションプールのアカウントに登録する。
どちらを選ぶかは、複数サーバーで同じサービスアカウントを共有しているか(共有しているならプールIDに寄せる形が扱いやすい)で決まります。なおSPNは1つのアカウントにしか登録できないので、切り替えるときは古い登録の削除を忘れないでください。重複登録はKerberos認証そのものを壊します。
クライアントに偽装して他のサーバーへアクセスする設計(委任)を採っている場合は、NTLMとKerberosで扱いが変わります。Kerberosは、サービスがクライアントの代理として他のサービスへ接続する委任メカニズムをサポートしていますが、NTLMが提供するのはローカルでの偽装に必要な認可情報までです。8 偽装まわりの実装は「Windowsの偽装(Impersonation)とトークン」で扱っています。
9. 段階的に締めていくロードマップ
以上をまとめると、進め方は次の順番になります。どの段階も「戻せる」ことが条件です。
| 段階 | やること | 完了の判断 |
|---|---|---|
| 0. 準備 | イベントログのサイズと保存期間を見直す。収集の仕組み(WEF等)があれば経路を確認する | 監査を有効にしてもログが上書きで消えない |
| 1. 可視化 | 3つの監査ポリシーを有効化し、業務が一巡するまで集める(最低でも月次締めを1回またぐ) | 「端末 × 接続先 × プロセス」の一覧ができ、低頻度の処理も走り終えた |
| 2. 分類 | 5章の表で原因を仕分ける。NTLMv1が出ているホストは別枠で最優先 | すべての行に担当と分類がついた |
| 3. 名前を直す | IPアドレス直打ちをFQDNへ。SPNを登録する | 該当する8001イベントが出なくなった |
| 4. 裏取り(SMB) | NET USE /BLOCKNTLM で1接続ずつ確認する(7.1節の手順で) |
主要な共有がNTLMなしで繋がる |
| 5. パイロット(SMB) | 情シス端末など数台で Set-SmbClientConfiguration -BlockNTLM $true |
締め処理を1回またいで、業務に影響が出ない |
| 6. 展開(SMB) | グループポリシーでSMBのNTLMブロックを配布。例外リストは最小限で作る | 例外リストの件数が管理できる規模 |
| 6b. SMB以外 | HTTP・SQL Server・WinRM・自作アプリの残りを、「リモートサーバーへの送信NTLMトラフィック」を監査 → 例外登録 → 拒否の順で締める。ドメイン全体は「このドメインでのNTLM認証」で同じ順に進める | SMB以外の8001イベントも出なくなった |
| 7. 継続 | SMBの例外リストと、Restrict NTLMのサーバー例外リストの両方の件数を定期的に数える。フェーズ2の機能提供を追う | 毎年、例外が減っている |
9.1. SMBを止めても、それはNTLM対策の半分
段階4〜6が扱うのはSMBだけです。7章で触れたとおり、SMBクライアントのNTLMブロックはSMBクライアント側の機能であり、4 それ以外の経路には効きません。段階2で「HTTPで認証している」「SQL ServerがNTLMになっている」「WinRMがNTLMを使っている」と分類したものは、段階6まで進めても手つかずのまま残ります。しかもSMBの例外リストにも載らないので、件数を数えても見えません。
そこを締めるのが段階6bです。使うのは4章で監査モードにした、あの3つのポリシーそのものです。手順は同じ形をたどります。
- 「リモートサーバーへの送信NTLMトラフィック」をすべて監査するのまま、残っている接続先を洗い出す
- どうしても必要な相手を「リモートサーバーの例外を追加する」に登録する
- パイロット端末ですべて拒否するに切り替え、業務が一巡するのを待つ
- 問題がなければ展開する
ドメイン全体に対しては「このドメインでのNTLM認証」を、同じく監査 → 例外(「このドメインでのサーバー例外を追加する」)→ 拒否の順で進めます。11 マイクロソフトも、拒否オプションを選ぶ前に対応する監査ポリシーを同じオプションに設定して影響を評価すべきだとしています。11
「SMBをブロックしたからNTLM対策は完了」ではありません。完了の指標にするなら、SMBの例外リストとRestrict NTLMのサーバー例外リストの両方を数えてください。
9.2. 監査期間は「日数」ではなく「業務の一巡」で決める
段階1でいちばん失敗しやすいのが、期間の決め方です。「2週間集めたから完了」としてしまうと、その2週間に走らなかった処理は一覧に載りません。そして載らなかったものは、段階6でブロックを配ったあとに初めて壊れます。
具体的に取りこぼしやすいのは次のようなものです。
- 月次・四半期の締め処理。月末バッチが共有フォルダやDBへIPアドレス直打ちで繋いでいる、というのは典型例です。
- 年次処理。棚卸し、年度切り替え、決算関連。
- 障害時にしか通らない経路。バックアップからの復旧手順、代替サーバーへの切り替え、DR訓練。
- 長期間オフラインの端末。持ち出しPC、長期休暇中の担当者の端末、普段は電源が入っていない予備機。
- 年に数回しか使わない業務アプリ。
マイクロソフトのガイド自身も、分析は配備の複雑さによっては数か月に及びうるとしています。3 現実的な線引きは次のどちらかです。
- 業務が一巡するまで監査を回し続ける。最低でも月次締めを1回、できれば四半期をまたぐ。
- 低頻度の処理を洗い出して、意図的に実行する。期間を待てない場合は、締め処理やDR手順を検証環境で走らせ、その結果を一覧に足す。「実行していないから出ていないだけ」の処理を、担当者への聞き取りで先に列挙しておくのが要点です。
どちらの場合も、「イベントが出なかった」と「まだ実行されていない」を区別できる状態にしてから次の段階へ進んでください。
9.3. 一気に拒否へ振らない
ここで「送信NTLMトラフィック=すべて拒否する」に一気に振らないのが要点です。マイクロソフトも、このポリシーを拒否に設定すると多数のNTLM認証要求が失敗して生産性を下げうるため、実装前に「すべて監査する」でログを確認し、サーバーの分析を行い、除外する例外リストを作るべきだとしています。7 ドメイン全体を対象とする「このドメインでのNTLM認証」ポリシーについても同様の警告が書かれています。11
10. まとめ
- NTLMは2024年6月に全バージョンが非推奨になりました。ただちに停止する変更ではなく、次期Windows Server・次の年次リリースのWindowsでも動作し続けるとされています。1
- 一方でNTLMv1はすでに削除されています(Windows 11 24H2 / Windows Server 2025)。NTLMv1しか話せない機器と、
NTLM V1が記録されているホストが、いちばん近い期限です。1 - 廃止は3フェーズで、フェーズ1は監査、フェーズ2(2026年後半)がIAKerbとローカルKDC、フェーズ3が既定無効化です。2
- 監査は3つのポリシーを監査モードにして
Microsoft-Windows-NTLM/Operationalを集めます。ドメインアカウントならDCの8004 → メンバーサーバーの8003 → クライアントの8001の順で、最後にアプリ名まで届きます。ローカルアカウントでの認証は8004が出ないので、サーバーとクライアントのイベントから拾います。37 - SMB経由はPIDが常に4(SYSTEM)になります。イベントログで端末まで絞ってから、その1台をProcMonで追ってください。3
- 原因の大半は「名前」です。IPアドレス直打ちとSPN未登録を潰すだけで、残る例外は大きく減ります。32
NET USE \\server\share /BLOCKNTLMは、ポリシーを変えずに1接続だけで裏取りできる、いちばん安全な確認手段です。4- 自作アプリはNTLM名指しをNegotiateに置き換え、接続先の書き方をFQDNに揃えます。5
- 例外リストは解決ではなく猶予です。件数が毎年減っているかどうかを指標にしてください。
関連記事
- 図解でわかるNTLMとKerberos ── なぜNTLMに「落ちる」のか
- ネットワークドライブとUNCパスの落とし穴 ── 業務アプリでファイルサーバー(共有フォルダ)を扱う実務
- Get-WinEventでイベントログを実務的に調べる ── 絞り込みの速さが調査時間を決める
- Process Monitor(ProcMon)実践ガイド ── 「設定が読まれない」「ACCESS DENIED」の原因を10分で見つける
- PowerShell Remoting(WinRM)入門 ── 複数台のWindowsを一括管理する
- PowerShellでの資格情報の安全な扱い ── 平文パスワードをスクリプトから追放する
- WinForms/WPFアプリにEntra ID認証を組み込む ── MSAL.NETとWAMブローカーの実務構成
- WindowsのTPMとは何か ── 図解でわかる「鍵を外に出さない金庫」と測定起動
関連する相談領域
合同会社小村ソフトでは、NTLM依存の棚卸しやKerberos前提への移行にともなう業務アプリの改修、認証まわりの不具合調査を扱っています。
参考リンク
</content> </invoke>
-
Microsoft Learn, Deprecated features in the Windows client. LANMAN、NTLMv1、NTLMv2を含むすべてのバージョンのNTLMが積極的な機能開発の対象外であり非推奨であること、NTLMの利用は次期Windows Serverと次の年次リリースのWindowsでも動作し続けること、NTLMの呼び出しはKerberosでの認証を試み必要なときだけNTLMにフォールバックするNegotiateの呼び出しに置き換えるべきこと、非推奨の告知が2024年6月であること、そして2024年11月の更新としてNTLMv1がWindows 11 バージョン24H2およびWindows Server 2025から削除されたことについて。あわせて、非推奨(deprecated)と削除(removed)が別の段階であり、非推奨とされた機能は積極的に開発されておらず将来の更新で削除される可能性があるという位置づけについて。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9
-
Microsoft Japan Windows Technology Support Blog, NTLM の廃止に向けた対応について. NTLM廃止が3つのフェーズ(フェーズ1=利用状況の可視化と監査、フェーズ2=2026年後半に予定されるNTLM依存シナリオへの対応機能、フェーズ3=次期メジャーリリースでのネットワークNTLM認証の既定無効化)で進むこと、監査のために設定する3つのグループポリシー(このドメイン内のNTLM認証を監査する、着信NTLMトラフィックを監査する、リモートサーバーへの送信NTLMトラフィック=すべて監査する)とNTLM/Operationalログでの確認、Kerberos移行時にIAKERBとローカルKDCの活用を検討すべきこととローカルKDCの提供が2026年後半に予定されていること、アプリケーションではNegotiateを使うこと、そしてNTLMが使われる代表的な原因としてIPアドレス指定でのサーバーアクセス、Kerberosに必要なポートのファイアウォールによる制限、SPN未登録、信頼関係先への認証、ワークグループ環境での認証が挙げられることについて。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8
-
Microsoft Learn, Viewing events for assessing NTLM usage. セキュリティログのログオンイベントで「認証パッケージ」を検索し「詳細な認証情報」の「パッケージ名 (NTLM のみ)」からNTLM V1かV2かを判別できること、分析が配備の複雑さによっては数か月に及びうること、理屈のうえではKerberosに対応していてもNTLMを使うアプリケーションの4類型(セキュリティ構成やプロバイダーを選択できるアプリ、SPNが正しく構成されていないアプリ、設定ミスやベンダーのドキュメントによりDNS名ではなくIPアドレスを使うアプリ、レガシーなコードベースにNTLM専用部分を持つアプリ)、監査に使う3つのポリシー設定と対応するイベント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
-
Microsoft Learn, Block NTLM connections on SMB in Windows Server 2025. SMBクライアントがリモートへの送信接続でNTLM認証をブロックできること、これにより悪意あるサーバーへNTLM要求を送らせる手口を防ぎ総当たり・クラッキング・Pass-the-Hash攻撃に対抗できること、組織の認証プロトコルをKerberosへ切り替えるうえでNTLMブロックが必要であり、一方で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コマンドレットが存在しないため初回はグループポリシーエディターでの設定が必要で以降はレジストリ値BlockNTLMServerExceptionListへの追加で個別に例外を足せること、そして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資格情報が対話型ログオン時に得られるドメイン名・ユーザー名・パスワードの一方向ハッシュで構成されること、暗号化されたチャレンジ/レスポンスによりパスワードを回線に流さずに認証すること、非対話型認証の手順(クライアントがユーザー名を平文で送る、サーバーが8バイトの乱数=チャレンジを生成して送る、クライアントがパスワードのハッシュでチャレンジを暗号化して応答を返す、サーバーがユーザー名・チャレンジ・応答の3点をドメインコントローラーへ送る、ドメインコントローラーがSAMデータベースから取り出したハッシュで同じ計算をして突き合わせる)、そしてアプリケーションはNTLMセキュリティパッケージに直接アクセスすべきではなくNegotiateセキュリティパッケージを使うべきであり、NegotiateはKerberosとNTLMのどちらかを選択し、認証に関わるシステムのいずれかがKerberosを使えない場合を除いてKerberosを選択することについて。 ↩ ↩2 ↩3 ↩4
-
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
-
Microsoft Learn, Network security: Restrict NTLM: Outgoing NTLM traffic to remote servers. 設定値が「すべて許可する」「すべて監査する」「すべて拒否する」「未定義」の4つで、未定義は「すべて許可する」と同じであること、推奨手順としてまず「すべて監査する」を選び運用ログを確認してからサーバー例外リストを作るべきこと、設定場所が「コンピューターの構成\Windowsの設定\セキュリティの設定\ローカル ポリシー\セキュリティ オプション」であること、再起動が不要でローカル保存でもグループポリシー配布でも保存時に有効になること、監査およびブロックのイベントが「アプリケーションとサービス ログ\Microsoft\Windows\NTLM」の運用ログに記録され、この出力を見るためのセキュリティ監査イベントポリシーは存在しないこと、NTLMおよびNTLMv2認証がSMBリレー・中間者攻撃・総当たり攻撃を含む悪意ある攻撃に対して脆弱であること、拒否に設定すると多数のNTLM認証要求が失敗し生産性を下げうるため事前に監査で影響を評価し例外リストを作るべきことについて。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7
-
Microsoft Learn, Kerberos authentication overview in Windows Server. KDCがドメインコントローラー上で動作しActive Directory Domain Servicesのデータベースをセキュリティアカウントデータベースとして使うこと、Kerberosがサービスによる委任(クライアントの代理として他のサービスへ接続する仕組み)をサポートする一方、NTLMとKerberosが提供するのはサービスがローカルでクライアントを偽装するための認可情報であること、Kerberos以前のNTLM認証ではアプリケーションサーバーがクライアントやサービスを認証するたびにドメインコントローラーへ接続する必要があったのに対し、Kerberosでは更新可能なセッションチケットがパススルー認証を置き換え、PACの検証が必要な場合を除きサーバーがドメインコントローラーへ行く必要がないこと、そしてKerberosでは接続の両端が相手の身元を検証できるのに対し、NTLMはクライアントによるサーバーの検証も、あるサーバーによる別のサーバーの検証も可能にせず、サーバーが本物であると仮定できる環境向けに設計されたものであることについて。 ↩ ↩2
-
Microsoft Learn, Assessing NTLM usage. Kerberosのような改善された認証プロトコルを使うためのポリシーや運用を実装する前に、現在のNTLM認証トラフィックの状態を発見し監査することが必要であること、NTLM利用を捕捉すべき3つの地点(ドメイン内のドメインコントローラーからの送信トラフィック、リモートサーバーへの受信トラフィック、クライアントからリモートサーバーへの受信トラフィック)、および環境の把握が反復的な作業であることについて。 ↩
-
Microsoft Learn, Configuring Kerberos for IP Address. Windows 10 バージョン1507およびWindows Server 2016以降、KerberosクライアントをSPN内のIPv4/IPv6ホスト名に対応させられること、既定ではホスト名がIPアドレスの場合Windowsはそのホストに対してKerberos認証を試みず、NTLMなど有効な他の認証プロトコルにフォールバックすること、アプリケーションがIPアドレスを直書きしているためにNTLMへフォールバックし、NTLMを無効化していく環境で互換性の問題を起こしうること、その影響を減らすためにSPNのホスト名としてIPアドレスを使える機能が導入され、クライアント側のレジストリ値
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内で一度に1つのアカウントにしか登録できないためDHCP利用時はIPアドレスを静的に予約することが推奨されることについて。 ↩ ↩2 ↩3 -
Microsoft Learn, Network security: Restrict NTLM: NTLM authentication in this domain. 設定値が「無効にする」「ドメイン アカウントからドメイン サーバーへを拒否する」「ドメイン アカウントを拒否する」「ドメイン サーバーを拒否する」「すべて拒否する」「未定義」であること、このポリシーがドメインコントローラーにのみ適用されドメインコントローラーへの対話型ログオンには影響しないこと、拒否された要求にはNTLMブロックのエラーが返り「このドメインでのサーバー例外を追加する」ポリシーの例外リストに載っているサーバーは除外されること、拒否オプションを選ぶ前に対応する監査ポリシーを同じオプションに設定して運用ログで影響を評価すべきことについて。 ↩ ↩2 ↩3
関連する記事
同じタグを共有する最新の記事です。さらに近い話題で知識を深められます。
図解でわかるNTLMとKerberos ── なぜ認証はNTLMに「落ちる」のか
NTLMとKerberosの違いを図解で整理します。チャレンジ/レスポンス、TGTとサービスチケット、SPNが引けないときにNegotiateがNTLMへ落ちる条件、リレー攻撃とPass-the-Hashが成立する理由、NTLMv1の削除までを公式ドキュメントの裏付けつきで...
PowerShellのセキュリティ強化 ── ログ・AMSI・言語モード・JEA
PowerShellを禁止せずに安全に使うための実務をまとめます。スクリプトブロックログとトランスクリプションの有効化、AMSIと古いバージョンの無効化、言語モードによる制限、JEAによる権限委任までを解説します。
WindowsのTPMとは何か ── 図解でわかる「鍵を外に出さない金庫」と測定起動
TPMを図解で解説します。鍵をチップの外へ出さない仕組み、PCRと測定起動、BitLockerやWindows Helloでの使われ方、dTPM・fTPM・Plutonの違い、Get-Tpmでの確認方法、回復キーを求められたときの対処までを実務目線で整理します。
winget + PowerShellでPCキッティングを自動化する ── 手順書を実行可能にする
新入社員PCのセットアップを再現可能にする方法をまとめます。wingetによるアプリ導入とexport/import、WinGet Configurationの宣言的な構成、PowerShellで補う設定、無人実行時の注意点までを解説します。
Get-WinEventでイベントログを実務的に調べる ── 絞り込みの速さが調査時間を決める
Windowsのイベントログ調査をPowerShellで効率化する方法をまとめます。Where-Objectで絞ると遅い理由、FilterHashtableとXPathの使い分け、再起動やログオン・アプリ異常終了の調査レシピ、複数台からの収集までを解説します。
関連トピック
このテーマと近いトピックページです。記事を起点に、関連するサービスや他の記事へ進めます。
Windows技術トピック
Windows 開発、不具合調査、既存資産活用の技術トピックをまとめた入口です。
このテーマがつながるサービス
この記事は次のサービスページにつながります。近い入口からご覧ください。
Windowsアプリ開発
業務アプリ、装置連携、通信ツールなどの Windows ソフト開発を支援します。
よくある質問
この記事のテーマについて、相談時によくある質問をまとめています。
- NTLMが廃止されると、いつから業務が止まりますか?
- 「非推奨(deprecated)」の告知だけでは何も止まりません。マイクロソフトは2024年6月にNTLMの全バージョンを非推奨としましたが、そのときの案内は「次期Windows Serverと次の年次リリースのWindowsでもNTLMの利用は動作し続ける」というものでした。すでに動かなくなった具体的な変更は、Windows 11 バージョン24H2とWindows Server 2025でのNTLMv1の削除です。将来のリリースでネットワークNTLMが既定で無効になる計画は公表されていますが、その時点でもポリシーで再度有効にできるとされています。つまり「ある日いきなり全社が止まる」種類の変更ではなく、OSを新しくするたびに少しずつ締まっていく種類の変更です。だからこそ、止まってから調べるのではなく、まだNTLMが動いているうちに監査ログで依存箇所を洗い出しておくのが唯一の現実的な備えになります。
- NTLMを使っている場所は、どうすれば一覧にできますか?
- グループポリシーの「ネットワークセキュリティ: NTLMを制限する」系の設定を監査モードにして、NTLM/Operationalログを集めます。ドメインコントローラーに「このドメインでのNTLM認証を監査する」、サーバーとクライアントに「受信NTLMトラフィックを監査する」と「リモートサーバーへの送信NTLMトラフィック=すべて監査する」を設定すると、イベントビューアーの「アプリケーションとサービスログ > Microsoft > Windows > NTLM」にイベントが記録されます。ドメインアカウントでの認証なら、追い方は、ドメインコントローラーのイベント8004でユーザーと接続先サーバー(セキュアチャネル名)を特定し、そのサーバーのイベント8003でプロセスIDを見て、最後にクライアントのイベント8001で「どのアプリが、どのサーバー名で」要求したかを確定させる、という順番です。イベント8001にはターゲットサーバー名とクライアントプロセス名が入るので、ここまで来れば原因のアプリが分かります。ただしローカルアカウントでの認証はドメインコントローラーを経由しないため8004が出ません。ワークグループ機やファイルサーバーのローカルアカウントで共有に繋いでいる経路は、サーバー側の8003とクライアント側の8001から拾う必要があります。ドメインコントローラーのログだけを見て「うちは少ない」と判断しないでください。
- 監査したらイベントのPIDが4(SYSTEM)ばかりで、どのアプリか分かりません。
- SMB(共有フォルダ)経由の通信だからです。SMBの認証はカーネルモードのリダイレクターが行うため、呼び出し元のアプリはSMBパケットの向こう側に隠れてしまい、イベントに残るPIDは常に4(SYSTEM)になります。マイクロソフトのガイドもこのケースを明記していて、対処として、イベントが出ているクライアント上でProcess Monitor(ProcMon)を動かし、相手サーバーのコンピューター名とIPアドレスでパスをフィルターし、サーバー側イベント8003のタイムスタンプと突き合わせて呼び出し元プロセスを特定する、という手順を案内しています。実務では、まず「どの端末か」までをイベントログで絞り、その端末だけをProcMonで追うのが速いです。
- Kerberosに対応しているはずのアプリがNTLMに落ちるのはなぜですか?
- ほとんどが名前の問題です。マイクロソフトのガイドは、理屈のうえではKerberosに対応していてもNTLMを使ってしまうアプリとして、セキュリティ構成やプロバイダーを選択できるアプリ、SPN(サービスプリンシパル名)が正しく登録されていないアプリ、設定ミスやベンダーの手順書のせいでDNS名ではなくIPアドレスで接続しているアプリ、レガシーなコードベースにNTLM専用の部分が残っているアプリ、の4つを挙げています。イベント8001の「ターゲットサーバー」がNetBIOS名でもFQDNでもない形式(つまりIPアドレス)なら、既定の構成ではKerberosは使われません。IPアドレス直打ちをFQDNに直す、別名でアクセスしているならその名前でSPNを登録する、というのが最初にやる二手です。なお、どうしても名前に変えられない場合に備えて、クライアントにTryIPSPNを設定してIPアドレスのSPNを手動登録する方法も用意されていますが、マイクロソフト自身がDNS名への変更が不可能な場合に限るべきとしているので、あくまで最後の手段です。
- 自分たちで作っているWindowsアプリは、何を直せばよいですか?
- 認証パッケージにNTLMを名指ししているところを、Negotiateに置き換えます。マイクロソフトは「アプリケーションはNTLMセキュリティパッケージに直接アクセスすべきではなく、Negotiateパッケージを使うべき」と明記しています。NegotiateはKerberosとNTLMのどちらかを選び、認証に関わるシステムのいずれかがKerberosを使えない場合を除いてKerberosを選びます。.NETであれば、CredentialCache.Add に渡す認証タイプを "NTLM" から "Negotiate" に変える、というのが典型的な修正です(認証タイプを指定するのは CredentialCache.Add であって、NetworkCredential のコンストラクターではありません)。あわせて、接続先をIPアドレスやhostsに書いた別名ではなくFQDNで指定すること、自作サービスをKerberosで受けるならそのサービスアカウントにSPNを登録することも必要になります。
著者プロフィール
記事の著者プロフィールページです。
小村 豪
合同会社小村ソフト 代表
Windows ソフト開発、技術相談、不具合調査を中心に、既存資産が残る案件や原因が見えにくい障害調査に強みがあります。
公開リンク