【図解】Windows認証の調べ方:klistとイベント4768・4769・4771・4776・4624でKerberosとNTLMを見分ける

「共有フォルダが開けない」「サインインに時間がかかる」「Kerberos ではなく NTLM になっているようだ」。認証まわりのトラブルを調べるとき、どこに何の記録が残っているかを知っていると、切り分けがぐっと早くなります。この記事では、PC で使う klist と、DC とサーバのセキュリティログのイベント(4768・4769・4771・4776・4624・4625)を組み合わせて、「どちらの方式で認証したか」「どの段階で失敗したか」を調べる方法を説明します。

この記事でわかること
  1. 認証の記録が、PC・DC・サーバのどこに残るか
  2. klist とイベントで、Kerberos と NTLM のどちらで認証したかを見分ける方法
  3. 失敗したときの結果コードの読み方と、調べる順番

記録はどこに残るか

この記事では、ドメイン corp.example.com のユーザー user01 が、PC01 から FS01 の共有フォルダを開く場面で考えます。1回のアクセスでも、記録は3台に分かれて残ります。

PC01user01 が使う PCklist持っているチケットDC01ドメインコントローラ4768TGT の発行4769サービスチケット発行4771事前認証の失敗4776NTLM の確認FS01ファイルサーバ4624ログオンの成功4625ログオンの失敗1回のアクセスの記録が、3台に分かれて残る。3台を並べて見ると、何が起きたかが分かる
図1 認証の記録が残る場所
場所記録何が分かるか
PC01klistPC01 が今持っている Kerberos のチケット。どのサーバ用のチケットをもらえたか
DC014768・4771TGT(チケットをもらうためのチケット)の発行と、事前認証の失敗。主にサインインのとき
DC014769サービスチケット(サーバに見せるチケット)の発行
DC014776NTLM の応答の確認。ドメインのアカウントなら DC に、ローカルのアカウントならそのコンピュータに残る
FS014624・4625FS01 へのログオンの成功と失敗。ログオンの種類と、使った認証方式

4768・4769・4771 は DC にしか記録されません。DC が複数あるときは、PC01 が実際に話した DC のログを見る必要があります。Kerberos のチケットの流れは「Kerberos認証とは?」、ログオンの種類は「ログオンの種類とは?」の記事で説明しています。

記録するには監査ポリシーが必要

これらのイベントは、監査ポリシーで有効にしたものだけが記録されます。対応は次のとおりです。

  • 4768・4771:Audit Kerberos Authentication Service(Kerberos 認証サービスの監査)
  • 4769:Audit Kerberos Service Ticket Operations(Kerberos サービス チケット操作の監査)
  • 4776:Audit Credential Validation(資格情報の確認の監査)
  • 4624・4625:Audit Logon(ログオンの監査)

DC には「成功と失敗」を、サーバには少なくとも 4624・4625 の記録を設定しておくと、あとから調べられます。

Kerberos で認証したときの記録

PC01 から \\fs01.corp.example.com\共有 のように名前で開くと、ふつうは Kerberos で認証します。

サインインのとき\\fs01.corp.example.com\共有 を開いたときPC01user01DC01KDCFS01TGT をください(AS)TGTDC01 に 4768 が残るcifs/fs01 のチケットをください(TGS)サービスチケットDC01 に 4769 が残るサービスチケットを見せる(AP)FS01 に 4624(種類 3・Kerberos)PC01 の klist に 2 枚のチケット
図2 Kerberos で認証したときの記録

サインインのときに TGT をもらった記録(4768)と、共有を開くときに FS01 用のサービスチケットをもらった記録(4769)が DC01 に残ります。FS01 には、ログオンの種類 3(ネットワーク)、認証パッケージ(Authentication Package)が Kerberos の 4624 が残ります。サービスチケットは一度もらえば有効期間のあいだ使い回すので、2回目以降のアクセスでは 4769 が増えないことがあります。

klist の見方

PC01 で klist を実行すると、PC01 のユーザーが今持っているチケットの一覧が表示されます。

klist の結果に並ぶチケット#0Server: krbtgt/CORP.EXAMPLE.COM→ TGT(サインインでもらった)#1Server: cifs/fs01.corp.example.com→ FS01 の共有用#2Server: ldap/dc01.corp.example.com→ DC01 の LDAP 用各チケットの主な項目ClientだれのチケットかServerどのサービス用か(SPN)KerbTicket Encryption Type暗号化タイプ(AES など)Start Time / End Time有効な期間Ticket Flagsチケットの性質
図3 klist の見方

見分けるのは Server の欄です。krbtgt/CORP.EXAMPLE.COM が TGT、cifs/fs01.corp.example.com が FS01 の共有用のサービスチケットです。cifs は共有フォルダ(SMB)のサービスの名前です。KerbTicket Encryption Type では、チケットの暗号化タイプ(AES など)が分かります。

FS01 用のチケットがなければ、共有を開いたときに Kerberos を使えていない可能性があります。klist get cifs/fs01.corp.example.com で、その場でチケットを頼んでみると、もらえない理由がエラーで表示されます。

NTLM で認証したときの記録

同じ共有でも、\\10.1.0.21\共有 のように IP アドレスで開くと、Kerberos は使えず NTLM になります。Kerberos ではサーバの名前(SPN)でチケットを頼むので、既定では IP アドレスでは頼めないからです。

\\10.1.0.21\共有 のように IP アドレスで開いたときPC01user01FS01DC01NEGOTIATECHALLENGEAUTHENTICATE(応答)この応答は正しい?DC01 に 4776正しいFS01 に 4624(種類 3・NTLM)klist に cifs/… のチケットは増えない
図4 NTLM で認証したときの記録

NTLM では、FS01 がチャレンジと応答を DC01 に渡して確かめてもらいます。このとき DC01 に 4776 が残ります。4776 の Source Workstation(ワークステーション)は PC01 で、FS01 の名前は入りません。FS01 には、認証パッケージが NTLM の 4624 が残り、パッケージ名(NTLM のみ)の欄に NTLM V2 などのバージョンが入ります。PC01 の klist には、FS01 用のチケットは増えません。

Kerberos か NTLM かを見分ける

「Kerberos で認証しているはずなのに NTLM になっている」ことは、よくあります。次の3か所で確かめます。

Kerberos のときNTLM のときPC01:klistcifs/fs01… のチケットがあるサーバ用のチケットがないDC01:イベント4769(サービス名が FS01)4776(ワークステーションが PC01)FS01:4624認証パッケージ:Kerberos認証パッケージ:NTLMパッケージ名:NTLM V2
図5 Kerberos か NTLM かを確かめる3か所

NTLM になる主な原因は、IP アドレスでアクセスしている、サーバの SPN が登録されていない(または重複している)、DC に届かない、の3つです。SPN がないときは、DC01 に 4769 の失敗(結果コード 0x7)が記録され、そのあと NTLM に切り替わって 4776 が記録されます。利用者から見ると問題なく開けているので、気づきにくい点に注意してください。SPN については「SPNとは?」の記事で説明しています。

失敗したときの結果コード

失敗のイベントには、理由を表す結果コードが入ります。Kerberos のコード(4768・4769・4771)は RFC 4120 で決められた番号で、NTLM のコード(4776・4625)は Windows のエラーコードです。よく見るものを、どの段階で起きるかに分けてまとめます。

① TGT(サインイン)記録先:DC47680x6ユーザー名がない47710x18パスワードが違う4768 / 47710x12無効・ロックアウトなど4768 / 47710x17パスワードの期限切れ4768 / 47710x25時計のずれ② サービスチケット記録先:DC47690x7SPN が見つからない47690xE暗号化タイプが合わない③ NTLM記録先:DC47760xC000006Aパスワードが違う47760xC0000234ロックアウト47760xC0000064ユーザー名がない④ サーバ記録先:FS0146250xC000015Bログオンの種類が許可されていない
図6 よく見る失敗の記録
コード意味と、まず確かめること
0x6そのユーザー名が AD にない。ユーザー名やドメイン名の打ち間違い、削除されたアカウント
0x18事前認証の失敗。多くはパスワードの間違い。古いパスワードを覚えたままの PC やサービスがないか
0x12アカウントが使えない状態(無効、ロックアウト、有効期限切れ、ログオン時間外など)
0x17パスワードの有効期限切れ。パスワードを変えてもらう
0x25PC と DC の時計のずれが大きすぎる(既定で5分を超えた)
0x7サービスチケットを頼んだ SPN が見つからない。サーバの SPN の登録を確かめる
0xE暗号化タイプが合わない。アカウントや DC で許可している暗号化タイプを確かめる
0xC000006ANTLM でパスワードが違う
0xC0000234NTLM でアカウントがロックアウトされている
0xC0000064NTLM でユーザー名がない
0xC000015Bサーバ側で、そのログオンの種類が許可されていない(4625)

アカウントのロックアウトの原因を探すときは、0x18 や 0xC000006A の失敗がどこから来ているかを見ます。4771 には Client Address(接続元の IP アドレス)が、4776 には Source Workstation(接続元の名前)が入るので、古いパスワードのまま動いている PC やサービスを見つけられます。

失敗に見えても問題ないもの

Kerberos では、PC が最初に事前認証なしで TGT を頼み、DC が「事前認証が必要」(KDC_ERR_PREAUTH_REQUIRED)と返してから、あらためて頼み直すのがふつうの流れです。ネットワークのキャプチャでこのエラーを見ても、正常な動きなので気にしなくてかまいません。

調べる順番

認証のトラブルは、次の順番で調べると迷いにくくなります。

① 時刻と場所を決めるいつ、どの PC から、どのサーバに、だれが② PC で klistTGT はあるか。サーバ用のチケットはあるか③ どの DC かklist query_bind や nltest /dsgetdc で、話した DC を知る④ DC のイベント4768・4771・4769・4776 の成功と失敗、結果コード⑤ サーバのイベント4624・4625 のログオンの種類と認証パッケージ
図7 認証の調べ方の順番

最初に「いつ、どの PC から、どのサーバに、だれが」を決めておくことが大切です。イベントは数が多いので、時刻とアカウント名で絞り込まないと、関係ない記録に埋もれてしまいます。DC が複数あるときは、PC が話した DC を先に確かめてから、その DC のログを見ます。

確認に使うコマンド

PC01(コマンドプロンプト):持っているチケットの一覧を表示する

klist

PC01(コマンドプロンプト):TGT の詳細を表示する

klist tgt

PC01(コマンドプロンプト):FS01 の共有用のチケットを、その場で頼んでみる

klist get cifs/fs01.corp.example.com

PC01(コマンドプロンプト):最近話した DC を表示する

klist query_bind

PC01(コマンドプロンプト):チケットを消して、取り直す状態にする

klist purge

DC01(PowerShell・管理者):直近30分の 4768・4769・4771・4776 のうち、user01 に関するものを表示する

Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4768,4769,4771,4776; StartTime=(Get-Date).AddMinutes(-30)} | Where-Object Message -match 'user01'

FS01(PowerShell・管理者):直近30分の 4624・4625 のうち、user01 に関するものを表示する

Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4624,4625; StartTime=(Get-Date).AddMinutes(-30)} | Where-Object Message -match 'user01'

DC01・FS01(コマンドプロンプト・管理者):監査ポリシーの設定をすべて表示する

auditpol /get /category:*

klist purge を実行すると、そのユーザーのチケットがすべて消えます。次にサーバにアクセスするときにチケットを取り直すので、グループを変えた直後に新しいグループを反映させたいときなどに使います。ただし、チケットを取り直せないと、サインインし直すまでアクセスできなくなることがあります。

まとめ

項目ひとことで
klistPC が持っているチケット。Server の欄で TGT とサーバ用のチケットを見分ける
4768・4771DC での TGT の発行と事前認証の失敗。サインインのトラブルはここ
4769DC でのサービスチケットの発行。SPN の問題(0x7)はここ
4776NTLM の確認。これが出ていれば NTLM で認証している
4624・4625サーバへのログオン。認証パッケージで Kerberos か NTLM かが分かる
調べる順番時刻と場所を決める → klist → どの DC か → DC のイベント → サーバのイベント

認証の記録は1台にまとまっていないので、最初は追いかけるのが大変です。PC・DC・サーバのどこに何が残るかを図1のように頭に入れておくと、「次はどこを見ればよいか」が分かるようになります。

コメント