【図解】Kerberos(ケルベロス)認証とは?チケットの流れとPACを初心者向けに解説

Windowsのドメイン環境で働いていると、「Kerberos(ケルベロス)認証」という言葉を何度も目にします。ファイルサーバにつながらない、SQL Serverの統合認証が通らない、といったトラブルの調査でも「SPN」「チケット」「NTLMに落ちている」といった話がよく出てきます。それでも、チケットが何往復していて、誰が誰にどの鍵で何を暗号化して送っているのかまで説明できる人は多くないと思います。

この記事では、Kerberosが生まれた背景から始めて、6つのメッセージのやり取りを「誰から誰へ」が分かる形で1つずつ追います。そのうえで、チケットに入る所属グループの情報(PAC)、ファイルサーバやデータベースでの使われ方、ドメイン参加・未参加の端末の違い、Kerberosを狙う攻撃までを順に整理します。

この記事でわかること
  1. Kerberosとは何か、いつ・なぜ生まれ、NTLMと何が違うのか
  2. AS・TGS・APの6つのメッセージで、誰から誰へ何が送られているか
  3. PACの中身と、サーバがアクセスの許可を決める仕組み
  4. ファイルサーバ、SQL Server、Web(HTTP)でのユースケースと、ドメイン参加・未参加の違い
  5. Kerberoasting、ゴールデンチケットなどの攻撃と対策
Windows認証シリーズ

この記事は3本シリーズの2本目です。①NTLM認証 → ②Kerberos(この記事)→ ③Microsoft Entra Kerberos の順に読むと、Windowsの認証が古い方式から新しい方式へどう移ってきたかがつながります。

Kerberosを一言でいうと

Kerberosは、「チケット」を見せることで本人であることを証明するネットワーク認証プロトコルです。最初に一度だけ信頼できる窓口(KDC)で本人確認を受けてチケットをもらい、あとは使いたいサーバにチケットを見せるだけでアクセスできます。パスワードそのものはネットワークに流れません。

イベント会場の入場をイメージすると分かりやすいです。受付で身分証を見せてリストバンドをもらえば、あとは各ブースでリストバンドを見せるだけで入れます。ブースの係員は受付に毎回電話して確認したりしません。リストバンドが本物かどうかを、その場で見分けられるからです。

KDC(鍵配布センター)AS(認証サービス)TGS(チケット発行)クライアント(ユーザー・PC)サーバ(ファイル・DB・Web)① チケットをもらう② チケットを見せて使うあらかじめ鍵を共有ADではドメインコントローラ(DC)がKDC
図1 Kerberosの登場人物。クライアントはKDCからチケットをもらい、サーバに見せて使う
登場人物役割
クライアントサービスを使いたいユーザーやPC。KDCからもらったチケットを手元(チケットキャッシュ)に保管します。
KDC(Key Distribution Center)全員の鍵を知っている、信頼された第三者です。初回の本人確認をしてTGTを出すAS(Authentication Service)と、TGTと引き換えに各サービス用のチケットを出すTGS(Ticket-Granting Service)の2つの役割があります。Active Directoryでは、すべてのドメインコントローラ(DC)がKDCを兼ねています。
サーバファイルサーバ、SQL Server、Webサーバなど、アクセスされる側です。KDCとあらかじめ鍵を共有しているので、チケットを自分で開けて確かめられます。

Kerberosはいつ、なぜ生まれたのか

Kerberosは1980年代に、MIT(マサチューセッツ工科大学)のProject Athenaで開発されました。大学のキャンパスに多数の端末とサーバが並び、誰でもネットワークを盗聴できる環境で、パスワードを流さずに本人確認する方法が必要だったのが出発点です。名前は、ギリシャ神話で冥界の門を守る三つ首の犬「ケルベロス」に由来します。3つの頭を、クライアント・サーバ・KDCの3者になぞらえて説明されることもよくあります。

バージョン1〜4はProject Athenaで作られ、現在使われているバージョン5は1993年にRFC 1510として標準化されました。2005年にはRFC 4120に改訂され、これが今の基本仕様です。MicrosoftはWindows 2000でKerberos v5をドメインの既定の認証プロトコルに採用し、それ以前から使われていたNTLMは互換性のために残されました。

1980年代MITのProject Athena1993年RFC 1510(バージョン5)2000年Windows 2000の既定の認証に2005年RFC 4120(現在の仕様)2021年Microsoft EntraKerberos 登場2024年NTLMが非推奨に
図2 Kerberosとその周辺の年表

NTLMとの違い:チケットを見せるだけ

NTLMでは、サーバはユーザーのパスワード情報を持っていないので、認証のたびにDCへ「この答えは正しいか」を問い合わせます。Kerberosでは、クライアントが最初にKDCからTGT(Ticket-Granting Ticket)をもらい、使いたいサービスが出てくるたびに、TGTを見せてそのサービス用のサービスチケットをもらいます。

サーバは、KDCと共有している自分の鍵でサービスチケットを開けて中身を確かめます。チケットに必要な情報がすべて入っているので、認証のたびにDCへ問い合わせる必要がありません。チケットは有効期限まで使い回せるので、同じサーバに何度つないでもKDCとのやり取りは増えません。

KDC(DC)最初に1回:TGTサービスごとに:サービスチケットファイルサーバSQL ServerWebアプリクライアントチケットを保管チケットを見せるだけサーバは自分の鍵でチケットを開けて確かめる(DCに聞かない)
図3 Kerberosの全体像。サーバはチケットを自分の鍵で開けて確かめる
比べる点NTLMKerberos
方式チャレンジ/レスポンスチケット(共通鍵暗号)
DCとのやり取りサーバが認証するたびにDCへ問い合わせクライアントがTGTとサービスチケットを取るときだけ。サーバはDCに聞かない
相互認証できない(サーバは確かめられない)できる(サーバもチケットを開けられることで本物と分かる)
前提条件特になし(IPアドレス指定でも動く)SPN(サービス名)とDNS、時刻同期、KDCへの到達性が必要
主なリスクNTLMリレー、Pass-the-Hashサービスアカウントの弱いパスワード、鍵の盗難によるチケット偽造

チケットのやり取りをシーケンスで追う

ここからが本題です。Kerberosのやり取りは、AS交換・TGS交換・AP交換の3段階、合計6つのメッセージでできています。まず全体をシーケンス図で見て、そのあと1つずつ「誰から誰へ、何を送っているか」を追います。メッセージ名はRFC 4120の呼び方で、Wiresharkでキャプチャするとこの名前で表示されます。

AS交換(サインイン時に1回)TGS交換(使うサービスごと)AP交換(クライアントとサーバの間)クライアントKDCAS / TGSサーバcifs/fs01 など① KRB_AS_REQユーザー名+事前認証データ(暗号化した時刻)② KRB_AS_REPTGT+ログオンセッション鍵③ KRB_TGS_REQTGT+オーセンティケータ+SPN④ KRB_TGS_REPサービスチケット+サービスセッション鍵⑤ KRB_AP_REQサービスチケット+オーセンティケータ⑥ KRB_AP_REP相互認証を求めたときだけ返る
図4 Kerberosの6つのメッセージ

まず「鍵」を押さえる

シーケンスを追う前に、登場する鍵を整理しておきます。Kerberosの仕組みは、「誰がどの鍵を持っているか」が分かれば、ほとんど理解できます。長く使う鍵が3種類、その場限りで作る鍵が2種類あります。

鍵中身持っている人
ユーザー鍵ユーザーのパスワードから作った鍵ユーザー(入力したパスワードから計算)とKDC
krbtgtの鍵ADのkrbtgtアカウントの鍵。TGTの暗号化に使うKDCだけ
サーバの鍵サービスを動かしているアカウント(コンピュータアカウントやサービスアカウント)の鍵サーバとKDC
ログオンセッション鍵AS交換でKDCが作る一時的な鍵クライアントとKDC(TGTの中)
サービスセッション鍵TGS交換でKDCが作る一時的な鍵クライアントとサーバ(サービスチケットの中)

ポイントは、チケットは「受け取る相手の鍵」で暗号化されていることです。TGTはKDC(krbtgt)の鍵、サービスチケットはサーバの鍵で暗号化されているので、クライアントは中身を読めず、改ざんもできません。クライアントは、一緒に届くセッション鍵を使って「チケットの正当な持ち主は自分だ」と示します。

以下の図では、上の段に「誰から誰へ送るか」と、運ばれるもの(チケットは券の形、暗号化した包みは封筒の形)を描き、下の段にそれぞれの中身を並べています。関係しない登場人物は薄く表示しています。

KRB_AS_REQ:クライアントがKDCに名乗る

Windowsにサインインすると、クライアントはKDCのAS(UDP/TCP 88番)にKRB_AS_REQを送ります。中身はユーザー名と、「TGTが欲しい」という要求です。

あわせて、今の時刻をユーザー鍵で暗号化した「事前認証データ」を付けます。KDCは自分が持っているユーザー鍵で開け、時刻が正しければ「この人はパスワードを知っている本人だ」と判断します。RFC 4120では事前認証は使うべき(SHOULD)という扱いですが、Active Directoryでは既定で必須になっています。

① KRB_AS_REQ:クライアント → KDCクライアントKDC(DC)サーバ① KRB_AS_REQユーザー名事前認証データ平文の部分・ユーザー名(例:user01@CORP.EXAMPLE)・欲しいもの:krbtgt(TGT)だれがTGTを欲しがっているか事前認証データ:ユーザー鍵で暗号化・今の時刻KDCが同じ鍵で開けて時刻を確認開ければパスワードを知る本人
図5 KRB_AS_REQ(クライアント → KDC)

KRB_AS_REP:KDCがTGTを返す

本人確認ができると、KDCはログオンセッション鍵を作り、2つの包みに入れてクライアントに返します。1つはkrbtgtの鍵で暗号化したTGTで、中にはユーザー名、ログオンセッション鍵、有効期限、そしてPAC(ユーザーと所属グループの情報。後で詳しく説明します)が入っています。もう1つはユーザー鍵で暗号化した包みで、中身はクライアント用のログオンセッション鍵です。

クライアントはパスワードから作った鍵で2つめの包みを開け、ログオンセッション鍵を取り出します。TGTは開けられないので、そのまま保管します。ここから先はパスワードの鍵を使わず、ログオンセッション鍵だけでやり取りを進めます。ADの既定では、TGTの有効期限は10時間、更新できる期間は7日です。

② KRB_AS_REP:KDC → クライアントクライアントKDC(DC)サーバ② KRB_AS_REPTGTセッション鍵の包みTGT:krbtgt の鍵で暗号化・ユーザー名・ログオンセッション鍵・有効期限(既定10時間)・PAC(ユーザーとグループの情報)クライアントには開けられないそのままTGSに見せる「引換券」セッション鍵の包み:ユーザー鍵で暗号化・ログオンセッション鍵・有効期限などパスワードから作った鍵で開ける以後はこのセッション鍵を使う
図6 KRB_AS_REP(KDC → クライアント)

KRB_TGS_REQ:クライアントがサービスチケットを頼む

ファイル共有を開くなど、サービスにアクセスするときは、クライアントからKDCのTGSにKRB_TGS_REQを送ります。中身は3つです。欲しいサービスを表すSPN(Service Principal Name、例:cifs/fs01.corp.example)、STEP 2でもらったTGT、そしてログオンセッション鍵で「ユーザー名と今の時刻」を暗号化したオーセンティケータです。

KDCはkrbtgtの鍵でTGTを開け、中からログオンセッション鍵を取り出します。その鍵でオーセンティケータを開けて、ユーザー名がTGTと一致し、時刻が新しければ正当な要求と判断します。ネットワーク上でTGTだけを盗み見た人はログオンセッション鍵を知らないので、正しいオーセンティケータを作れません。

③ KRB_TGS_REQ:クライアント → KDCクライアントKDC(DC)サーバ③ KRB_TGS_REQSPNTGTオーセンティケータSPN:平文・欲しいサービスの名前  (例:cifs/fs01.corp.example)どのサーバのチケットが欲しいかTGT:krbtgt の鍵で暗号化・②でもらったものをそのままKDCが開けてセッション鍵を取り出すオーセンティケータ:ログオンセッション鍵・ユーザー名・今の時刻TGTの持ち主である証明TGTを盗み見ただけでは作れない
図7 KRB_TGS_REQ(クライアント → KDC)

KRB_TGS_REP:KDCがサービスチケットを返す

KDCはSPNから、そのサービスを動かしているアカウントを探します。見つかれば、クライアントとサーバが共有するためのサービスセッション鍵を作り、ここでも2つの包みにしてクライアントに返します。

1つはサーバの鍵で暗号化したサービスチケットで、ユーザー名、サービスセッション鍵、有効期限、TGTから引き継いだPACが入っています。もう1つはログオンセッション鍵で暗号化した包みで、クライアント用のサービスセッション鍵が入っています。SPNがどのアカウントにも登録されていなければ、ここでエラー(KDC_ERR_S_PRINCIPAL_UNKNOWN)になります。

④ KRB_TGS_REP:KDC → クライアントクライアントKDC(DC)サーバ④ KRB_TGS_REPサービスチケットセッション鍵の包みサービスチケット:サーバの鍵で暗号化・ユーザー名・サービスセッション鍵・有効期限・PAC(TGTから引き継ぐ)クライアントには開けられないサーバに渡すためのものセッション鍵の包み:ログオンセッション鍵・サービスセッション鍵・有効期限などクライアントが開けてサーバとの共通の鍵を手に入れる
図8 KRB_TGS_REP(KDC → クライアント)

KRB_AP_REQ:クライアントがサーバにチケットを見せる

クライアントは、サーバに直接KRB_AP_REQを送ります。中身はサービスチケットと、サービスセッション鍵で暗号化したオーセンティケータです。単独のメッセージとして送るのではなく、SMBのセッション確立やHTTPのヘッダなど、各プロトコルの認証の中に入れて運ばれます。

サーバは自分の鍵でサービスチケットを開け、サービスセッション鍵とPACを取り出します。その鍵でオーセンティケータを開け、ユーザー名と時刻を確かめます。図のとおり、このステップにKDCは関わっていません。

⑤ KRB_AP_REQ:クライアント → サーバクライアントKDC(DC)サーバ⑤ KRB_AP_REQサービスチケットオーセンティケータサービスチケット:サーバの鍵で暗号化・④でもらったものをそのままサーバが自分の鍵で開けてサービスセッション鍵とPACを取り出すオーセンティケータ:サービスセッション鍵・ユーザー名・今の時刻チケットの中身と照合時刻のずれが大きければ拒否
図9 KRB_AP_REQ(クライアント → サーバ)

KRB_AP_REP:サーバが本物だと示す

クライアントが相互認証を求めた場合(AP-REQにMUTUAL-REQUIREDのフラグを立てた場合)、サーバはクライアントにKRB_AP_REPを返します。中身は、受け取ったオーセンティケータの時刻などを、サービスセッション鍵で暗号化したものです。

サービスセッション鍵は、サーバの鍵でサービスチケットを開けなければ手に入りません。つまり、正しいAP-REPを返せること自体が、相手がKDCに登録された本物のサーバである証拠になります。NTLMにはない、この「サーバ側の本人確認」がKerberosの大きな特徴です。

⑥ KRB_AP_REP:サーバ → クライアントクライアントKDC(DC)サーバ⑥ KRB_AP_REP確認の応答サービスセッション鍵で暗号化・⑤で受け取った時刻など開けて中身が合えば、相手はチケットを開けられた=本物のサーバ
図10 KRB_AP_REP(サーバ → クライアント)
時刻のずれに注意

オーセンティケータの時刻は、使い回し(リプレイ)を防ぐために確認されます。RFC 4120では許容するずれを5分程度の例として挙げていて、Active Directoryの既定も5分です。クライアントとDCの時刻が5分以上ずれていると認証に失敗するので、Kerberosのトラブルでは最初にNTPの状態を確かめます。

クライアントでチケットを確かめる

Windowsでは、klist コマンドで手元のチケットを確認できます。動作確認やトラブルの切り分けでは、次のコマンドをよく使います。

クライアント(コマンドプロンプト)

C:\> klist
C:\> klist get cifs/fs01.corp.example
C:\> klist purge
コマンド何がわかるか
klistキャッシュにあるチケットの一覧。krbtgt/… がTGT、cifs/… などがサービスチケットです。有効期限や暗号化方式(AESなど)も表示されます。
klist get <SPN>指定したSPNのサービスチケットを取りにいきます。SPNの登録漏れや重複を切り分けるときに使います。
klist purgeキャッシュのチケットを消します。グループを変えたあと、新しいPACで取り直したいときなどに使います。

PAC:チケットに入る「所属グループの証明」

RFC 4120のKerberosは「この人は誰か」を確かめる仕組みで、「この人に何を許すか」に使う情報は決めていません。Active Directoryでは、チケットの中にPAC(Privilege Attribute Certificate)というMicrosoft独自のデータを入れて、ユーザーのSIDや所属グループの情報を運んでいます。ファイルサーバのアクセス権がグループで決まるのは、このPACのおかげです。

PACはチケットのどこに入っているか

チケットには、レルム名やSPNのような平文の部分と、受け取る相手の鍵で暗号化された部分があります。PACは暗号化された部分の中の、authorization-data(認可データ)という欄に入っています。そのため、クライアントはPACを読んだり書き換えたりできません。PACの形式は、Microsoftの仕様書MS-PACで公開されています。

チケット(TGT・サービスチケット)・平文:レルム名、SPN受け取る相手の鍵で暗号化された部分・セッション鍵、ユーザー名、有効期限・authorization-data 欄PACMicrosoftの拡張(MS-PAC)RFC 4120 が決めていること・だれか(ユーザー名)・いつまで有効かPAC が足していること・ユーザーのSID・所属グループのSID・アカウントの属性、UPN、クレーム・改ざんを見つける署名
図11 PACはチケットの暗号化された部分に入っている

PACの中身

PACは、種類ごとに分かれた複数のデータの集まりです。中心になるのは「ログオン情報」で、ユーザーのSID、プライマリグループ、所属するグループの一覧が入っています。グループは「ドメインのSID+グループの番号(RID)」の形で持ち、ほかのドメインのグループなどはExtraSidsという欄に入ります。パスワードの最終変更日時やアカウントの属性も含まれます。

PACの中身(主なもの)ログオン情報ユーザーSID、プライマリグループ、所属グループ、他ドメインのグループ(ExtraSids)、アカウントの属性クライアント情報ユーザー名とチケットの発行時刻UPN・DNS情報user01@corp.example、ドメインのDNS名クレーム・デバイス情報ダイナミックアクセス制御の属性、端末の情報要求者のSIDこのPACをだれのために作ったか署名(4種類)サーバ署名・KDC署名・チケット署名・拡張KDC署名
図12 PACの中身(主なもの)
データ中身と使い道
ログオン情報ユーザーSID、所属グループ、アカウントの属性。サーバはこれでアクセストークンを作ります。NTLMでDCがサーバに返すユーザー情報と同じ系統の構造です。
クライアント情報ユーザー名とチケットの発行時刻。チケットとPACの組み合わせが正しいかの確認に使います。
UPN・DNS情報ユーザーのUPNと、ドメインのDNS名。
クレーム・デバイス情報ダイナミックアクセス制御で使うユーザーや端末の属性。使っている環境でだけ入ります。
要求者のSIDこのPACをどのアカウントのために作ったか。2021年のセキュリティ更新で追加され、なりすましによる権限昇格を防いでいます。
署名(4種類)サーバ署名、KDC署名、チケット署名、拡張KDC署名。PACやチケットが書き換えられていないことを確かめるために使います。

PACはいつ作られ、どう運ばれるか

PACを作るのはKDCです。STEP 1〜2のAS交換で、KDCはADからユーザーの所属グループなどを読み出してPACを作り、TGTの中に入れます。STEP 3〜4のTGS交換では、KDCがTGTのPACを検証してサービスチケットに引き継ぎ、サーバ向けの署名を付け直します(サーバのドメイン側の情報が加わることもあります)。

このため、ユーザーを新しいグループに追加しても、すでに持っているTGTのPACには反映されません。新しいグループの権限が効くのは、TGTを取り直したとき(サインインし直す、klist purge でチケットを消すなど)です。「グループに入れたのにアクセスできない」という問い合わせの多くは、これが原因です。

ADグループ情報を読み出すKDCAS交換でPACを作るTGTPACが入る(10時間有効)サービスチケットTGS交換でPACを引き継ぐサーバPACを読んでトークンを作るグループの変更は、TGTを取り直すまでチケットに反映されない(サインインし直す、klist purge でチケットを消す など)
図13 PACの流れ

サーバはPACでアクセスを決める

サーバはSTEP 5でサービスチケットを開け、中のPACからアクセストークンを作ります。アクセストークンには、ユーザーのSIDと所属グループのSIDが並んでいて、フォルダやデータベースのACL(アクセス制御リスト)と照合することで、許可するかどうかを決めます。グループの情報がチケットに入っているので、認証のたびにDCへ所属グループを聞きに行く必要がありません。

サービスチケットPACユーザーSIDグループSIDサーバ鍵で開けてPACを読むアクセストークンuser01営業部 / Domain Users共有フォルダACL:営業部=変更可ACLと照合して許可・拒否を決める(認証の瞬間にDCへ聞かない)
図14 PACの役割。サーバはPACからアクセストークンを作り、ACLと照合する

PACの署名と検証

PACには、書き換えを見つけるための署名が付いています。サーバ署名はサーバの鍵で、KDC署名はkrbtgtの鍵で作られます。サーバは自分の鍵でサーバ署名を確かめられますが、krbtgtの鍵は持っていないので、KDC署名は自分では確かめられません。必要なときは、NetlogonでDCにKDC署名の確認を頼みます。これをPAC検証といい、行うかどうかはサービスの種類や設定によって変わります。

チケット署名と拡張KDC署名は、チケットやPACが途中で組み替えられていないかを確かめるために、あとから追加されたものです。過去には、KDCが署名を正しく確認しないためにPACを偽造できる脆弱性(2014年のMS14-068)もありました。PACは「この人は管理者グループのメンバーだ」という情報そのものなので、署名と検証が守りの要になっています。

PACログオン情報・グループ などサーバ署名KDC署名チケット署名・拡張KDC署名サーバ自分の鍵でサーバ署名を確かめられるDCKDC署名は krbtgt の鍵がないと確かめられないので、必要なときNetlogonで確認を頼む(PAC検証)
図15 PACの署名と検証
PACが大きくなりすぎると

所属グループが非常に多いユーザーはPACが大きくなり、チケットが既定のサイズ上限(MaxTokenSize、Windows Server 2012以降は48,000バイト)を超えて認証に失敗することがあります。目安として、ユニバーサルグループに120以上所属すると問題が出やすいとされています。グループの入れ子を整理するのが根本的な対策です。

エンタープライズでの主なユースケース

ADのドメイン環境では、Windowsの統合認証(Windows Integrated Authentication)を使うサービスの多くが、裏でKerberosを使っています。どのサービスでも、クライアントがSPNを組み立ててサービスチケットを要求し、サーバに見せるという流れは同じです。違うのは、SPNの形と、チケットを運ぶプロトコルです。

KDC(DC)ファイルサーバcifs/fs01.corp.exampleSMBSQL ServerMSSQLSvc/sql01.corp.example:1433TDSWebアプリ/プロキシHTTP/web.corp.exampleHTTP(Negotiate)クライアントSPNを指定してサービスチケットを要求
図16 主なユースケースとSPN

ファイルサーバ(SMB)

いちばん身近な例です。\\fs01.corp.example\share を開くと、クライアントはSPN cifs/fs01.corp.example のサービスチケットを取り、SMBのセッション確立の中でサーバに渡します。Windowsのファイルサーバでは、ドメイン参加時にコンピュータアカウントへ登録される HOST/… のSPNが cifs を兼ねるので、個別に登録しなくても動きます。

認証の結果できたセッション鍵は、SMB署名やSMB暗号化の鍵を作る材料にも使われます。Windows Server 2025では、SMBの送信側の接続で署名が既定で必須になりました。

データベース(SQL Server)

SQL Serverの「Windows認証」もKerberosを使います。アプリケーションの接続文字列にパスワードを書かずに、実行しているユーザーやサービスアカウントの権限で接続できます。SPNは MSSQLSvc/sql01.corp.example:1433 のように、ホスト名とポート番号で表します。

SPNは、SQL Serverのサービスを動かしているアカウントに登録します。サービスアカウントを変えたのにSPNが古いアカウントに残っていると、Kerberosが使えずにNTLMで接続されたり、「Cannot generate SSPI context」のエラーになったりします。

WebアプリとプロキシのHTTP認証(Negotiate)

IISの統合Windows認証や、社内のWebプロキシの認証でもKerberosが使われます。HTTPでは、SPNEGO(Negotiate)という仕組みでKerberosのトークンをHTTPヘッダに入れて運びます。RFC 4559に、この「Negotiate」認証の形式が書かれています。

ブラウザ(PC)KDCWebサーバHTTP/web.corp.example① GET /② 401 UnauthorizedWWW-Authenticate: Negotiate③ KRB_TGS_REQSPN:HTTP/web.corp.example④ KRB_TGS_REPサービスチケット⑤ GET /Authorization: Negotiate <AP-REQを含むトークン>⑥ 200 OK相互認証のトークンが付くこともある
図17 HTTPでのKerberos(Negotiate)

サーバが 401 Unauthorized と WWW-Authenticate: Negotiate を返すと、ブラウザは HTTP/web.corp.example のサービスチケットを取り、AP-REQを含むトークンを Authorization: Negotiate ヘッダに入れて送り直します。ブラウザのイントラネットゾーンの設定によっては自動で送られないこともあり、その場合はユーザー名とパスワードの入力画面が出ます。プロキシの認証でNTLMが残りやすい理由は、NTLMの記事で解説しています。

SPNが合わないとNTLMに落ちる

Windowsの多くのアプリは、認証方式を直接指定せずにNegotiateを使います。Negotiateはまず Kerberos を試し、使えなければ黙ってNTLMで認証します。つながってはいるけれど実はNTLMだった、ということが起きやすいのはこのためです。よくある原因を表にまとめます。

状況起きること確認すること
IPアドレスでアクセスWindowsは既定でIPアドレス宛てにKerberosを試さず、NTLMになりますFQDNで指定しているか。IPで使う必要があるなら TryIPSPN 設定とIPのSPN登録を検討します
SPNが未登録TGS交換でエラーになり、NTLMになりますsetspn -Q <SPN> で登録先を確認します
SPNが重複KDCが1つに決められずエラーになりますsetspn -X で重複を探します
別名(CNAME)でアクセスクライアントが組み立てるSPNと登録したSPNが食い違うことがあります別名のSPNを登録するか、実ホスト名でアクセスします
時刻がずれているKRB_AP_ERR_SKEWなどで失敗しますクライアント・サーバ・DCの時刻を確認します

ドメイン参加・未参加で何が変わるか

同じファイルサーバにアクセスする場合でも、クライアントがドメインに参加しているかどうかで、TGTを取るタイミングや、そもそもKerberosが使えるかが変わります。

ADドメイン参加端末

ドメイン参加端末は、Kerberosがいちばん素直に動く形です。端末自身もコンピュータアカウントとしてADに登録されていて、起動時にDCと通信しています。ユーザーがパスワードやスマートカードでサインインすると、LSASS(ローカルセキュリティ機関)がKRB_AS_REQを送ってTGTを取り、メモリに保管します。

あとは共有フォルダを開くたびに、LSASSが裏でTGS交換をしてサービスチケットを取り、SMBの中でサーバに渡します。ユーザーは何も入力しません。これがドメイン環境のシングルサインオンの正体です。DCに届かないとき(社外で、VPNもつないでいないときなど)は、キャッシュされた資格情報でWindowsへのサインインはできますが、新しいチケットは取れません。

Windowsにサインインしたとき\\fs01.corp.example\share を開いたときドメイン参加PCLSASSDC(KDC)ファイルサーバfs01.corp.example① KRB_AS_REQパスワードから作った鍵で事前認証② KRB_AS_REP(TGT)TGTをメモリに保管③ KRB_TGS_REQSPN:cifs/fs01.corp.example④ KRB_TGS_REP(サービスチケット)⑤ SMBセッション確立の中で AP-REQ⑥ AP-REP(接続完了)
図18 ドメイン参加端末のシーケンス

ドメインに参加していない端末

ワークグループのPCや、持ち込みのPCなど、ドメインに参加していない端末は、サインイン時にTGTを持っていません。ローカルアカウントでサインインしているので、ADのKDCとは何の関係もない状態です。

この端末からファイルサーバにアクセスすると、多くの場合はNTLMで認証されます。ドメインのアカウントを明示して(例:net use \\fs01.corp.example\share /user:corp.example\user01)、サーバをFQDNで指定し、端末がDNSでDCを見つけて通信できる場合は、その場でAS交換からやり直してKerberosが使われることもあります。どちらになったかは、klist でチケットがあるかを見ると確かめられます。

ドメイン未参加PC\\サーバ\共有 を開くドメインのアカウントを指定した?いいえNTLMサーバのローカルアカウントはい名前(FQDN)で指定した?IPNTLMSPNを作れないため(既定)はいDNSでDCを見つけて通信できる?いいえNTLMサーバ経由でDCが確認はいKerberosチケットを取得して提示
図19 ドメイン未参加端末でKerberosになるか、NTLMになるか

ドメインのアカウントの形は、CORP\user01 のようなNetBIOS名より、corp.example\user01 や user01@corp.example のようにDNSのドメイン名を使う方が、ドメインに参加していない端末からDCを見つけやすくなります。

Entra参加の端末は?

オンプレミスのADには参加せず、Microsoft Entra IDにだけ参加している端末でも、オンプレミスのファイルサーバへKerberosでシングルサインオンできます。Windows Hello for BusinessやFIDO2でサインインした場合は、Entra IDがチケットの発行に関わる「Microsoft Entra Kerberos」という仕組みを使います。詳しくは次の記事 【図解】Microsoft Entra Kerberosとは? で解説します。

Kerberosを狙う攻撃と対策

Kerberosの仕組みそのものは堅牢ですが、攻撃者は「パスワードから作った鍵で暗号化されたデータ」と「チケットを作るための鍵」を狙います。前者は持ち帰って総当たりし、後者を盗めばチケットとPACを好きなように偽造できます。代表的な4つの攻撃を見ていきます。

Kerberoasting一般ユーザーSPNを指定してTGS-REQKDC持ち帰ってパスワードを総当たりAS-REP Roasting一般ユーザー事前認証なしでAS-REQKDC持ち帰ってパスワードを総当たりゴールデンチケットkrbtgtの鍵を入手偽造したTGTKDC好きなPACでどこにでもアクセスシルバーチケットサーバの鍵を入手偽造したチケットサーバDCには問い合わせないDCを通らずにそのサーバへアクセス
図20 Kerberosを狙う4つの攻撃

Kerberoasting

ドメインの一般ユーザーなら誰でも、SPNを指定してサービスチケットを取れます。サービスチケットはサービスアカウントの鍵で暗号化されているので、攻撃者はこれを持ち帰り、サービスアカウントのパスワードを総当たりで割り出そうとします。人が決めた短いパスワードのサービスアカウントは、特に狙われます。

対策は、SPNを持つユーザーアカウントに長くランダムなパスワードを設定することです。可能ならgMSA(グループの管理されたサービスアカウント)を使い、パスワードの生成と更新をADに任せます。gMSAのパスワードは240バイトのランダムな値で、30日ごとに自動で変わります。暗号化はRC4ではなくAESにそろえます(Windows Server 2025では、KerberosでのRC4の利用が非推奨になりました)。

AS-REP Roasting

事前認証を無効にしたアカウント(「Kerberos事前認証を不要とする」が有効)は、パスワードを知らなくてもAS-REQに応答が返ります。応答の中のユーザー鍵で暗号化された部分を持ち帰れば、Kerberoastingと同じように総当たりできます。事前認証は既定の「必須」のままにし、無効になっているアカウントがないか定期的に確認します。

ゴールデンチケット

krbtgtの鍵を盗まれると、攻撃者はKDCを通さずにTGTを自分で作れます。TGTの中のPACも好きなように書けるので、存在しないユーザーをDomain Adminsのメンバーにする、有効期限を長くする、といったことができてしまいます。krbtgtの鍵を盗むにはドメイン管理者の権限が必要なので、侵入の最終段階で、居座り続けるために使われます。

対策は、DCとドメイン管理者アカウントを最も重要な資産として守ることです。侵害が疑われるときは、krbtgtのパスワードを2回リセットします。チケットの有効期限(既定10時間)より長い間隔をあけて2回変えることで、古い鍵で作られたチケットを使えなくします。Microsoft Defender for Identityなどの製品は、ゴールデンチケットの特徴を持つ通信を検知できます。

シルバーチケット

サービスアカウントやサーバのコンピュータアカウントの鍵を盗まれると、攻撃者はそのサービス向けのサービスチケットを自分で作れます。サービスチケットはDCを通らずにサーバへ直接渡すので、DCのログに残りにくいのが特徴です。中のPACも偽造できるため、そのサーバの中では管理者として振る舞えます。

対策は、サービスアカウントの鍵を強くし、定期的に変えることです(gMSAならパスワードが自動で変わります)。重要なサービスでは、PAC検証でKDC署名をDCに確認させることも有効です。

攻撃狙うもの主な対策
Kerberoastingサービスチケット(サービスアカウントの鍵で暗号化)長くランダムなパスワード、gMSA、AESへの統一
AS-REP Roasting事前認証を無効にしたアカウントのAS-REP事前認証を必須のままにする
ゴールデンチケットkrbtgtの鍵(TGTとPACを偽造)DCと特権アカウントの保護、krbtgtのパスワードを2回リセット、検知製品
シルバーチケットサービスの鍵(サービスチケットとPACを偽造)サービスアカウントの鍵の強化と定期変更、PAC検証

まとめ

Kerberosは、最初に一度だけKDCで本人確認を受け、あとはチケットを見せてサービスを使う認証です。チケットは受け取る相手の鍵で暗号化され、一時的なセッション鍵で持ち主であることを示すので、パスワードを流さず、サーバはDCに問い合わせずに、互いに本物だと確かめられます。

項目押さえておくこと
AS交換(①②)クライアント ⇄ KDC。サインイン時に1回。事前認証で本人確認し、TGTとログオンセッション鍵をもらう
TGS交換(③④)クライアント ⇄ KDC。サービスごと。TGTとSPNを見せて、サービスチケットとサービスセッション鍵をもらう
AP交換(⑤⑥)クライアント ⇄ サーバ。サーバは自分の鍵で開けて確認し、求められればAP-REPで自分も本物だと示す
PACKDCがAS交換で作り、TGTからサービスチケットへ引き継がれる所属グループの情報。サーバはこれでACLを判断する
SPNとFQDNサービスをSPNで特定する。IP指定やSPNの不備はNTLMへのフォールバックの原因になる
ドメイン参加・未参加参加端末はサインイン時にTGTを取る。未参加端末は多くがNTLM
攻撃弱いサービスアカウントのパスワードと、krbtgt・サービスの鍵の盗難に注意する

Kerberosのトラブルは、「どのSPNのチケットを取ろうとして、どこで失敗したか」をシーケンスに当てはめると切り分けやすくなります。次の記事では、オンプレミスのADに参加していないEntra参加端末が、どうやってこのチケットを手に入れるのかを見ていきます。

コメント