ケルベロスについてのQ&A

🔑 Kerberos とは?
Kerberos は、ネットワーク上で安全にユーザ認証を行うためのプロトコルです。特に、パスワードを盗まれずに安全にログインしたり、サービスにアクセスしたりするための仕組みとして使われます。
名前の由来は、ギリシャ神話の「ケルベロス(3つの頭を持つ冥界の番犬)」です。3つの頭は、次の3つの役割にたとえられます。
- クライアント(利用者やPC)
- 認証サーバ(AS: Authentication Server)
- サービスサーバ(メールサーバやファイルサーバなど、利用したいサービス)
⚙️ 何がすごいの?
通常、ユーザがパスワードを使ってログインすると、ネットワーク上にパスワードが流れてしまいます。これだと、悪意ある第三者がパスワードを盗み見て不正アクセスする危険があります。
でも Kerberos は、次のような工夫で安全性を確保しています:
- チケット(Ticket)を使う
→ パスワードそのものを送らず、「チケット」と呼ばれる一時的な証明書を発行します。このチケットを使ってアクセスします。 - 暗号化
→ データは暗号化されてやり取りされるので、途中で盗み見られても内容は読めません。 - タイムスタンプ
→ チケットにはタイムスタンプが含まれ、一定時間を過ぎると無効になります。これで「リプレイ攻撃」(過去の通信を再利用する攻撃)を防ぎます。
🚀 Kerberos の流れ(ざっくり版)
- ログインリクエスト(クライアント→認証サーバ)
→ クライアントが認証サーバにログインを要求。 - TGT(Ticket Granting Ticket)発行
→ 認証サーバは、パスワードから生成した鍵で暗号化された「TGT」をクライアントに渡します。これは「サービスチケット発行のための許可証」です。 - サービスチケット取得
→ クライアントは、TGT を使って「TGS(チケット発行サーバ)」からサービス用のチケットを取得します。 - サービスへのアクセス
→ クライアントはサービスサーバにチケットを提出し、正しければアクセスが許可されます。
これなら、ネットワーク上にパスワードが流れず、安全にサービスを利用できます!
🎯 一言で言うと?
Kerberos は「チケット制の認証システム」で、暗号化とタイムスタンプを活用して、ネットワーク上で安全にログインできる仕組みです!
たとえば、遊園地で「入場券(チケット)」をもらい、アトラクションごとにチケットを見せて乗る、みたいなイメージです!パスワード(現金)は直接出さず、チケットでやり取りするので安全、という感じです。

🏢 認証サーバ(AS)とチケット発行サーバ(TGS)はどういう関係性は?
実は、AS と TGS は物理的には同じサーバーに置かれることが多いんです!ただし、論理的には「役割」が分かれています。
- AS(Authentication Server)認証サーバ → パスワードを確認し、TGT を発行する
- TGS(Ticket Granting Server)チケット発行サーバ → TGT を確認して、サービスチケットを発行する
この2つは 同じ物理サーバー 上に動くことが多くて、まとめて KDC(Key Distribution Center: 鍵配布センター) と呼ばれます。
つまり、AS と TGS は「別の役割だけど、同じ場所にいることが多い」と考えてOKです!
🛜 ネットワーク構成のイメージ
例えば、会社のネットワークではこんな感じです!
[クライアントPC]
↓
[認証サーバ (AS) + チケット発行サーバ (TGS)] ← (ここが KDC)
↓
[ファイルサーバ、メールサーバなどのサービスサーバ]
- 最初のログイン → 認証サーバ(AS)が確認して、TGT を発行
- サービスアクセス時 → クライアントが TGT を持って TGS にリクエストして、サービスチケット発行
AS と TGS は同じ場所にあって、ポート 88 番 で Kerberos プロトコルの通信を待ち受けています。
⚙️ なんで役割が分かれてるの?
役割が分かれているのは、セキュリティを強化するためです。
- AS はパスワードの確認だけを行い、直接サービスチケットを発行しない
- TGS は TGT を受け取ってサービスチケットを発行するが、パスワードは扱わない
こうすると、パスワードが盗まれるリスクを減らしつつ、TGT をうまく使ってシングルサインオンを実現できます!
🎯 結論:AS と TGS は…
- 論理的には別物だけど、物理的には同じサーバーに置かれることが多い
- 両方合わせて KDC(Key Distribution Center: 鍵配布センター) と呼ぶ
- サービス提供側のネットワーク内(例えば Active Directory のドメインコントローラー)に設置される

クライアントはどうやってケルベロスを使うかどうかを判断するの?
クライアントは、「普段の通信」からいきなり「Kerberos を使う通信」に切り替えたりするわけではありません。実は、クライアントは事前に 設定ファイルや環境情報 をもとに、どのサービスが Kerberos を使うかを知ります。
具体的には次のような方法があります!
🏢 1. DNS(ドメインネームシステム)を使う
Kerberos は通常、DNS を使って KDC(認証サーバ) の場所を特定します。クライアントがサービスにアクセスするとき、まず DNS でサービス名を解決し、同時に Kerberos 関連のレコードを見に行きます。
🔧 SRV レコードの例
_kerberos._tcp.example.com IN SRV 0 100 88 kdc.example.com
これを見ると:
example.com
ドメインは Kerberos を使ってる!- 認証サーバ(KDC)は
kdc.example.com
で、ポート 88 で待ち受けている
この情報があれば、クライアントは「じゃあ Kerberos 認証が必要だ!」と判断します。
🗃 2. サービス自体が「401 Unauthorized」で返してくる
たとえば Web サービスの場合、最初のリクエストで普通にアクセスしたときに、サーバーが HTTP 401 Unauthorized を返して、「Negotiate」ヘッダで Kerberos を要求することがあります。
🔧 レスポンス例
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Negotiate
これを受け取ったクライアントは、「あ、このサービスは Kerberos 使ってるんだな」と気づいて、Kerberos チケットを取得し、再度リクエストを送ります。
⚙️ 3. OS の設定やクライアントの設定ファイル
クライアントマシン自体に Kerberos の設定ファイル(例:Linux の /etc/krb5.conf
)があって、ここで「どのドメインが Kerberos を使うか」をあらかじめ決めておくこともできます。
🔧 krb5.conf の例
[libdefaults]
default_realm = EXAMPLE.COM
[realms]
EXAMPLE.COM = {
kdc = kdc.example.com
admin_server = kdc.example.com
}
この設定があると、クライアントは example.com
のサービスにアクセスするとき、自動的に Kerberos 認証を試みます。
🧠 じゃあ Kerberos を使っていない場合は?
もしサービス側が Kerberos に対応していない場合は:
- DNS に Kerberos 関連のレコードがない
- サービスから
401 Unauthorized
とか Kerberos を要求するレスポンスが返ってこない
この場合、クライアントは普通の通信(例:ユーザー名・パスワードでのログイン)にフォールバックします。つまり、「Kerberos ある? → いないなら普通のやり方でアクセス」という流れです。
🎯 まとめると?
- クライアントは自動で Kerberos を検出する
- DNS SRV レコード
- サービスの HTTP 応答ヘッダ(
WWW-Authenticate: Negotiate
) - OS やクライアントの設定ファイル
- 使わないときは普通の通信に戻る
- Kerberos のサーバーが見つからなかったり、サービスが Kerberos を要求しなければ、普通のパスワード認証などに切り替わる
例えば、Windows ドメイン環境では、クライアント PC はドメイン参加時に自動的に KDC の場所を DNS で探します。ユーザーは何もしなくても、必要なときだけ Kerberos 認証に切り替わるんです!

パスワードがネットワーク上を流れないってどういう仕組みで認証しているの?
ケルベロス認証は「パスワードを直接流さないから安全」って言っておきながら、最初にパスワードでログインするなら結局流れてるじゃん?って思いますよね。
でも実は、パスワードそのものはネットワーク上に直接流れていません!ここが Kerberos のすごいポイントなんです。順番に説明しますね!
🧠 最初の認証時のパスワード処理
クライアントがログインするとき、実際に KDC に送るのは パスワードのハッシュ値 を使った暗号化データです。これによって、パスワードの生データがネットワーク上を流れることはありません!
(パスワードのハッシュ値:パスワードをハッシュ関数に入れて算出された値のこと)
具体的にはこうなります:
- クライアントがユーザーのパスワードから共通鍵を生成
- パスワード自体ではなく、パスワードから ハッシュ関数 を使って鍵を作成
- KDC からのチャレンジメッセージを暗号化
- KDC は「ランダムなデータ」(ノンス)をクライアントに送信
- クライアントはこのノンスを、パスワードハッシュで暗号化して返す
- KDC 側で検証
- KDC はユーザーごとにパスワードハッシュを持っている
- 送られてきた暗号化データを復号し、ノンスが一致すれば認証成功!
🔑 なぜ安全なのか?
- パスワード自体は一切ネットワーク上に流れない
- 流れるのは暗号化済みのデータだけ
- 盗聴されてもパスワードの逆算は難しい(辞書攻撃や総当たり攻撃が必要)
- ノンスでリプレイ攻撃を防止
- 毎回ランダムなデータ(ノンス)を使うので、過去のやりとりを盗んでも使えない
- チケットはクライアントとサーバー間でのみ利用可能
- TGT やサービスチケットは、それぞれ固有の鍵で暗号化されていて、盗まれてもすぐ使えない
⚠️ でも完全無敵ではない!
たとえば、クライアントマシンが既にマルウェアに感染している場合は、キー生成の前段階でパスワードを盗まれる可能性はあります。でもこれは Kerberos に限らず、あらゆるシステムの共通課題ですね。
このため、Kerberos を運用するときは:
- クライアントとサーバーの時刻同期(タイムスタンプチェック)
- 安全なクライアント環境の維持(ウイルス対策・OS の更新)
- ネットワーク暗号化(例えば TLS で通信を二重に保護)
こうした総合的な対策が重要です!
🎯 まとめ
- Kerberos は最初のログイン時にもパスワードの生データは流さない
- パスワードハッシュ と ノンス を使ったチャレンジレスポンス方式で認証
- チケットとセッションキー を使い、ログイン後の通信はより安全
だから、「最初の認証でも安全」と言えるんです!

認証サーバからTGTを取得するまでの流れは?
Kerberos におけるログインから認証成功までの流れを、ノンス や 暗号化・復号化 のタイミングまで詳しく解説します!
以下の流れで、クライアントが認証され、TGT (Ticket Granting Ticket) を取得するまでのやりとりを追っていきましょう!
🏗️ 前提:事前に知っているもの
- ユーザー名 と パスワード(クライアントが入力)
- KDC(AS と TGS のセット) は、ユーザーのパスワードハッシュを保持
ここでは、共通鍵暗号 を使うので、パスワードから作ったハッシュ値(暗号鍵)が重要です!
📩 STEP 1: AS 要求(ログイン要求)
- クライアントが AS(認証サーバ)に「ログインしたい」とリクエストします。
- 送るデータ:
- ユーザーID
- タイムスタンプ
- 送るデータ:
🔒 この時点ではまだ暗号化されていないですが、パスワード自体は送りません!
🔑 STEP 2: AS 応答(ノンスと TGT 発行)
- AS はクライアントからのリクエストを受け取ると、次の処理を行います。
- ノンス(ランダムな一時データ) を生成
- TGT (Ticket Granting Ticket) を作成
- セッションキー を生成
- その後、以下のデータをクライアントに送信します。
- TGT(TGS に渡す用のチケット)
- セッションキー(共通鍵)
- ノンス
🔒 ここが重要! このデータは、KDC 側で保存してある「ユーザーのパスワードから作った暗号鍵」で暗号化します。
🔓 STEP 3: クライアント側で復号化
- クライアントは、パスワードをローカルでハッシュ化して、暗号鍵を作ります。
- サーバーからの応答データを、その暗号鍵で復号します。
この復号に成功すると:
- セッションキー を取得
- TGT を取得
- ノンス を確認
もし復号できなければ、パスワードが間違っていることがわかります。
✅ STEP 4: 認証成功
- クライアントは、復号したノンスを使って 認証応答 を返します。
- ノンス + 1 をセッションキーで暗号化して AS に送信
- AS は、受け取ったデータをセッションキーで復号し、ノンスが正しいか確認します。
- ノンス + 1 が正しければ認証成功!
これでクライアントは正式に認証され、TGT を使って TGS にサービスチケットをもらいにいけるようになります!
🔥 なぜ安全なのか?
- パスワード自体は一度もネットワークを流れない
- 共通鍵暗号 なので通信の盗聴だけでは復号できない
- ノンス により、リプレイ攻撃(過去の通信を再送信する攻撃)も防止
🏁 まとめ
Kerberos のログインフェーズは、次の手順で進みます!
- クライアント → AS: ログインリクエスト(ユーザーID + タイムスタンプ)
- AS → クライアント: ノンス・TGT・セッションキーをパスワードハッシュで暗号化して送信
- クライアント: パスワードをハッシュ化 → サーバーメッセージを復号
- クライアント → AS: ノンス + 1 をセッションキーで暗号化して返答
- AS: ノンス + 1 をチェック → 認証成功!
この仕組みにより、パスワード漏洩のリスクを抑えつつ、安全なログイン処理 を実現しているんです!

TGTを取得してからサービスを利用するまでの流れは?
認証サーバー(AS)で認証が成功して、TGT(チケット発行チケット)をゲットした後、実際にサービスを使うまでの流れを一緒に見ていきましょう!
ここからは TGS(チケット発行サーバー) の出番です!
① クライアント → TGS にサービスリクエスト
クライアントは、「このサービスを使いたい!」と TGS にリクエストを送ります。
送るデータ:
- TGT(認証サーバーからもらったチケット)
- サービスID(どのサービスを使いたいか)
- タイムスタンプ
- 認証データ(セッションキーで暗号化したクライアントID+タイムスタンプ)
➡️ TGT は暗号化されていて、TGS 以外は中身を見れません。だから盗まれてもすぐには悪用されません!
② TGS がリクエストをチェック
TGS は以下を確認します:
- TGT を復号(AS が発行したので、TGS なら復号できる)
- TGT の有効期限 をチェック
- 認証データをセッションキーで復号
- クライアントID や タイムスタンプ が一致するか確認
もし問題なければ、TGS はサービスチケットを発行します!
③ TGS → クライアントにサービスチケット発行
TGS は サービスチケット を作成して、クライアントに返します!
返すデータ:
- サービスチケット(対象サービス用のセッションキー入り、サービスサーバー用に暗号化)
- クライアントとサービスの共通セッションキー(クライアント用に暗号化)
④ クライアント → サービスサーバーに接続リクエスト
クライアントは、もらった サービスチケット を使って、サービスサーバーに接続リクエストを送ります。
送るデータ:
- サービスチケット(TGS からもらったもの)
- 認証データ(共通セッションキーで暗号化したクライアントID+タイムスタンプ)
⑤ サービスサーバーが認証チェック
サービスサーバーは以下を確認します:
- サービスチケットを復号(TGS が発行したものなので、サービスサーバーは復号可能)
- セッションキーを取得
- 認証データを復号し、クライアントIDやタイムスタンプを確認
問題なければ、最終確認のため ノンス + 1 のようなレスポンスを返します。
⑥ クライアント → サービス利用開始!
クライアントはレスポンスを確認し、正常ならそのままサービス利用開始!
その後の通信は、サービスチケット内の セッションキー を使って安全にやりとりします。
✅ ポイントまとめ
- TGT は TGS だけが復号できる(他人が盗んでも無意味)
- サービスチケットはサービスサーバーだけが復号できる
- 共通セッションキー を使うことで、以降の通信は暗号化される
- タイムスタンプやノンス でリプレイ攻撃対策もバッチリ
つまり、クライアントはパスワードを1回入力するだけで、複数のサービスをシームレスに使える !これが Kerberos の強みですね!