メインコンテンツまでスキップ

7.2. KDC Messaging: IP Transports (KDC メッセージング: IP トランスポート)

7.2. KDC Messaging: IP Transports (KDC メッセージング: IP トランスポート)

Kerberos は, クライアントとサーバー間の通信に対し UDP/IP と TCP/IP の 2 つの IP トランスポート機構を定義する。

7.2.1. UDP/IP トランスポート

IP トランスポートをサポートする Kerberos サーバー (KDC) は UDP 要求を受け入れなければならない (MUST), 特に別の UDP ポートで待ち受けるよう設定されていない限り, ポート 88 (十進) で待ち受けるべきである (SHOULD)。同一ホスト上で複数レルム向けに複数の KDC を動かす場合, 代替ポートを用いてもよい (MAY)。

IP トランスポートをサポートする Kerberos クライアントは UDP 要求の送信をサポートすべきである (SHOULD)。クライアントは KDC 発見 [7.2.3] を用いて, 要求の送信先 IP アドレスおよびポートを識別すべきである (SHOULD)。

UDP/IP トランスポートを用いて KRB_KDC_REQ 要求で KDC に接続する際, クライアントは要求のエンコーディングのみを含む UDP データグラムを KDC に送る。KDC は応答データグラムで, 応答メッセージ (KRB_ERROR または KRB_KDC_REP のいずれか) のエンコーディングのみを, 送信元 IP アドレスの送信ポートへ返す。UDP/IP トランスポートで行った要求に対する応答も UDP/IP トランスポートを用いなければならない (MUST)。応答が UDP で扱えない場合 (大きすぎるなど), KDC は KRB_ERR_RESPONSE_TOO_BIG を返さなければならず (MUST), クライアントに TCP トランスポートでの要求再試行を強制する。

7.2.2. TCP/IP トランスポート

IP トランスポートをサポートする Kerberos サーバー (KDC) は TCP 要求を受け入れなければならない (MUST), 特に別の TCP ポートで待ち受けるよう設定されていない限り, ポート 88 (十進) で待ち受けるべきである (SHOULD)。同一ホスト上で複数レルム向けに複数の KDC を動かす場合, 代替ポートを用いてもよい (MAY)。

クライアントは TCP 要求の送信をサポートしなければならない (MUST) が, 最初に UDP トランスポートで試すことを選んでもよい (MAY)。クライアントは KDC 発見 [7.2.3] を用いて, 要求の送信先 IP アドレスおよびポートを識別すべきである (SHOULD)。

実装ノート: Kerberos プロトコルの一部の拡張は, TCP トランスポートをサポートしないクライアントまたは KDC が関与すると成功しない。RFC 1510 の実装は TCP/IP トランスポートのサポートを必須としなかった。

KRB_KDC_REQ メッセージが TCP ストリーム上で KDC に送られる場合, 応答 (KRB_KDC_REP または KRB_ERROR メッセージ) は要求のために確立された同一の TCP ストリーム上でクライアントに返さなければならない (MUST)。KDC は応答送信後に TCP ストリームを閉じてもよい (MAY) が, 後続のやり取りを期待する場合は, 妥当な期間ストリームを開いたままにしてもよい (MAY)。KDC 上の TCP/IP 接続管理では, 開いた TCP/IP 接続数に基づくサービス拒否攻撃を防ぐよう注意が必要である。

クライアントは, 応答受信後いつでも KDC によりストリームが閉じられる可能性に備えなければならない (MUST)。ストリームのクローズは致命的エラーとして扱うべきではない (SHOULD NOT)。代わりに, 複数回の交換が必要な場合 (特定の形の事前認証など), クライアントは後続メッセージを送る準備ができたときに新しい接続を確立する必要がある。

クライアントは応答受信後にストリームを閉じてもよい (MAY) が, 後続メッセージを送る予期がない場合はストリームを閉じるべきである (SHOULD)。

クライアントは応答を受信する前に複数の要求を送ってもよい (MAY) が, 最初の応答後に接続が閉じられる可能性に備えなければならない。

TCP ストリーム上で送られる各要求 (KRB_KDC_REQ) および応答 (KRB_KDC_REP または KRB_ERROR) の前に, 要求の長さをネットワークバイト順の 4 オクテットとして置く。長さの最上位ビットは将来の拡張のために予約され, 現時点ではゼロに設定しなければならない (MUST)。長さエンコーディングの最上位ビットの設定された意味の解釈方法を知らない KDC が, 長さの最上位ビットが設定された要求を受け取った場合, エラー KRB_ERR_FIELD_TOOLONG の KRB-ERROR メッセージを返さなければならず (MUST), TCP ストリームを閉じなければならない (MUST)。

単一の TCP 接続上で複数の要求が送られ, KDC が複数の応答を送る場合, KDC は対応する要求の順序で応答を送る必要はない。これにより, 先行する要求の処理中 (外部デバイスまたはデータベースからの応答待ちなど) であっても, 準備ができ次第各応答を送る実装が可能になる。

7.2.3. IP ネットワーク上の KDC 発見

Kerberos クライアント実装は, クライアントが Kerberos 鍵配送センター (KDC) の場所を決定する手段を提供しなければならない (MUST)。従来, Kerberos 実装は各クライアントマシン上のファイルにそのような設定情報を保存してきた。経験上, この方法は情報の陳腐化やスケール, 特にクロスレルム認証時に問題を呈する。本節では, ドメイン名システム [RFC1035] を用いて KDC の位置情報を保存する方法を説明する。

7.2.3.1. DNS と Kerberos: レルム名の大文字・小文字の扱い

Kerberos ではレルム名は大文字・小文字を区別する。すべてのレルム名を大文字にすることが強く推奨されるが, すべてのサイトがこれに従っているわけではない。一部のサイトはすべて小文字, 他は混在を用いる。一方 DNS のクエリは大文字・小文字を区別しない。したがってレルム名 "MYREALM", "myrealm", "MyRealm" はすべて異なるが, ドメイン名システムでは同一に解決される。レルム名では大文字・小文字の組み合わせのうち 1 通りのみを用いる必要がある。

7.2.3.2. DNS SRV レコードによる KDC 位置情報の指定

KDC の位置情報は DNS SRV RR [RFC2782] を用いて保存する。この RR の形式は次のとおり。

_Service._Proto.Realm TTL Class SRV Priority Weight Port Target

Kerberos のサービス名は常に "kerberos" である。

Proto は "udp" または "tcp" のいずれかである。これらの SRV レコードを用いる場合, すべての KDC 配置に対して "udp" および "tcp" の両方のレコードを指定しなければならない (MUST)。

Realm はこのレコードが対応する Kerberos レルムである。レルムはドメイン形式のレルム名でなければならない (MUST)。

TTL, Class, SRV, Priority, Weight, Target は RFC 2782 で定義される標準的な意味を持つ。

RFC 2782 に従い, "_udp" および "_tcp" の SRV レコードに用いるポート番号は, KDC が代替 TCP ポートで待ち受けるよう設定されていない限り, Internet Assigned Number Authority が "kerberos" に割り当てた値 88 (十進) であるべきである (SHOULD)。

実装ノート: 多くの既存クライアント実装は KDC 発見をサポートしておらず, IANA 割当ポート (88 十進) に要求を送るよう設定されているため, KDC はそのポートで待ち受けるよう強く推奨される。

7.2.3.3. IP ネットワーク上のドメイン形式レルム名の KDC 発見

以下は Kerberos レルム EXAMPLE.COM の DNS レコード例である。Kerberos サーバーが 2 台あり, kdc1.example.com と kdc2.example.com である。指定優先度に従い, まず kdc1.example.com にクエリを向ける。これらのサンプルレコードでは Weight は用いない。

_kerberos._udp.EXAMPLE.COM.     IN   SRV   0 0 88 kdc1.example.com.
_kerberos._udp.EXAMPLE.COM. IN SRV 1 0 88 kdc2.example.com.
_kerberos._tcp.EXAMPLE.COM. IN SRV 0 0 88 kdc1.example.com.
_kerberos._tcp.EXAMPLE.COM. IN SRV 1 0 88 kdc2.example.com.