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

3. Packet Format (パケットフォーマット)

3. Packet Format (パケットフォーマット)

正確に 1 つの RADIUS パケットが UDP Data フィールド [4] にカプセル化され, UDP Destination Port フィールドは 1812 (10 進数) を示します。

応答が生成されると, 送信元ポートと宛先ポートが逆転します。

このメモは RADIUS プロトコルを文書化しています。RADIUS の初期展開は UDP ポート番号 1645 を使用して行われましたが, これは "datametrics" サービスと競合します。RADIUS の正式に割り当てられたポート番号は 1812 です。

RADIUS データフォーマットの要約を以下に示します。フィールドは左から右に送信されます。

 0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Code | Identifier | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| Authenticator |
| |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Attributes ...
+-+-+-+-+-+-+-+-+-+-+-+-+-

Code

Code フィールドは 1 オクテットで, RADIUS パケットのタイプを識別します。無効な Code フィールドを持つパケットが受信されると, それは黙って破棄されます。

RADIUS Codes (10 進数) は次のように割り当てられています:

  • 1 Access-Request
  • 2 Access-Accept
  • 3 Access-Reject
  • 4 Accounting-Request
  • 5 Accounting-Response
  • 11 Access-Challenge
  • 12 Status-Server (experimental)
  • 13 Status-Client (experimental)
  • 255 Reserved

Codes 4 と 5 は RADIUS Accounting 文書 [5] でカバーされています。Codes 12 と 13 は使用可能として予約されていますが, ここではこれ以上言及されていません。

Identifier

Identifier フィールドは 1 オクテットで, 要求と応答の照合を支援します。RADIUS サーバーは, 短時間内に同じクライアント送信元 IP アドレスと送信元 UDP ポートおよび Identifier を持つ場合, 重複要求を検出できます。

Length

Length フィールドは 2 オクテットです。これは, Code, Identifier, Length, Authenticator, Attribute フィールドを含むパケットの長さを示します。Length フィールドの範囲外のオクテットは, パディングとして扱われ, 受信時に無視されなければなりません (MUST)。パケットが Length フィールドが示すよりも短い場合, それは黙って破棄されなければなりません (MUST)。最小長は 20, 最大長は 4096 です。

Authenticator

Authenticator フィールドは 16 オクテットです。最上位オクテットが最初に送信されます。この値は, RADIUS サーバーからの応答を認証するために使用され, パスワード隠蔽アルゴリズムで使用されます。

Request Authenticator

Access-Request パケットでは, Authenticator 値は Request Authenticator と呼ばれる 16 オクテットの乱数です。この値は, 秘密 (クライアントと RADIUS サーバー間で共有されるパスワード) の有効期間にわたって予測不可能で一意であるべきです (SHOULD)。同じ秘密と組み合わせて要求値が繰り返されると, 攻撃者が以前に傍受した応答で返信することを許可するためです。同じ秘密が異なる地理的地域のサーバーで認証に使用される可能性があることが予想されるため (MAY), Request Authenticator フィールドはグローバルおよび時間的な一意性を示すべきです (SHOULD)。

Access-Request パケット内の Request Authenticator 値も予測不可能であるべきです (SHOULD)。攻撃者がサーバーをだまして予測された将来の要求に応答させ, その応答を使用してその将来の Access-Request に対してそのサーバーになりすますことがないようにするためです。

RADIUS のようなプロトコルは, リアルタイムのアクティブな盗聴攻撃による認証されたセッションの盗難を防ぐことはできませんが, 一意で予測不可能な要求の生成は, 認証に対する広範囲のアクティブ攻撃から保護できます。

NAS と RADIUS サーバーは秘密を共有します。その共有秘密に Request Authenticator を続けたものを一方向 MD5 ハッシュに通して 16 オクテットのダイジェスト値を作成し, それをユーザーが入力したパスワードと XOR し, XOR された結果を Access-Request パケットの User-Password 属性に配置します。より詳細な説明については, Attributes セクションの User-Password のエントリを参照してください。

Response Authenticator

Access-Accept, Access-Reject, Access-Challenge パケットの Authenticator フィールドの値は Response Authenticator と呼ばれ, 次のオクテットストリームに対して計算された一方向 MD5 ハッシュを含みます: Code フィールドから始まる RADIUS パケット, Identifier, Length, Access-Request パケットからの Request Authenticator フィールド, 応答 Attributes, 共有秘密。つまり, ResponseAuth = MD5(Code+ID+Length+RequestAuth+Attributes+Secret) ここで + は連結を示します。

Administrative Note

秘密 (クライアントと RADIUS サーバー間で共有されるパスワード) は, 適切に選択されたパスワードと少なくとも同じくらい大きく推測不可能であるべきです (SHOULD)。秘密は少なくとも 16 オクテットであることが望ましいです。これは, 秘密が徹底的な検索攻撃に対する保護を提供するのに十分に大きな範囲を確保するためです。秘密は空 (長さ 0) であってはなりません (MUST NOT)。これにより, パケットが簡単に偽造されることを許可するためです。

RADIUS サーバーは, どの共有秘密を使用するかを決定するために RADIUS UDP パケットの送信元 IP アドレスを使用しなければならないため (MUST), RADIUS 要求をプロキシできます。

転送プロキシを使用する場合, プロキシは各方向を通過するときにパケットを変更できなければなりません - プロキシが要求を転送するとき, プロキシは Proxy-State 属性を追加でき (MAY), プロキシが応答を転送するとき, 追加した場合はその Proxy-State 属性を削除しなければなりません (MUST)。Proxy-State は常に他の Proxy-States の後に追加または削除されますが, 属性リスト内のその位置に関する他の仮定はできません。Access-Accept と Access-Reject の応答はパケット全体の内容で認証されるため, Proxy-State 属性の削除はパケットの署名を無効にします - したがって, プロキシはそれに再署名する必要があります。

RADIUS プロキシ実装のさらなる詳細は, この文書の範囲外です。