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

4. Control Message Attribute Value Pairs (制御メッセージ属性値ペア)

相互運用性を保証しながら拡張性を最大化するために、L2TP全体でメッセージタイプとメッセージ本体をエンコードする統一された方法が使用されます。このエンコードは、本文書の残りの部分でAVP (Attribute-Value Pair、属性値ペア) と呼ばれます。

4.1 AVP Format (AVP形式)

各AVPは次のようにエンコードされます:

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|M|H| rsvd | Length | Vendor ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Attribute Type | Attribute Value...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
[until Length is reached]... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

最初の6ビットは、AVPの一般的な属性を記述するビットマスクです。

この文書では2ビットが定義されており、残りは将来の拡張のために予約されています。予約ビットは、送信メッセージでは0に設定されなければならず (MUST)、受信メッセージでは無視されます。予約ビットが1に設定されたAVPを受信した場合、認識されないAVPとして扱わなければなりません (MUST)。

Mandatory (M) ビット:認識できないAVPを受信した実装で必要とされる動作を制御します。特定のセッションに関連付けられたメッセージ内の認識されないAVPでMビットが設定されている場合、このメッセージに関連付けられたセッションは終了されなければなりません (MUST)。トンネル全体に関連付けられたメッセージ内の認識されないAVPでMビットが設定されている場合、トンネル全体(およびその中のすべてのセッション)が終了されなければなりません (MUST)。Mビットが設定されていない場合、認識されないAVPは無視されなければなりません (MUST)。その後、AVPが存在しなかったかのように制御メッセージの処理を続行しなければなりません。

Hidden (H) ビット:AVPのAttribute Valueフィールド内のデータの隠蔽を識別します。この機能は、ユーザーパスワードなどの機密データをAVP内で平文として渡すことを回避するために使用できます。セクション4.3では、AVP隠蔽を実行する手順について説明しています。

Length:このAVPに含まれるオクテット数(全体の長さとビットマスクフィールドを含む)をエンコードします。長さは、6 + Attribute Valueフィールドの長さ(オクテット単位)として計算できます。このフィールド自体は10ビットで、単一のAVPで最大1023オクテットのデータを許可します。AVPの最小長は6です。長さが6の場合、Attribute Valueフィールドは存在しません。

Vendor ID:IANAが割り当てた "SMI Network Management Private Enterprise Codes" [RFC1700] の値です。値0は、IETFが採用した属性値に対応し、この文書で定義されているすべてのAVPに使用されます。独自のL2TP拡張を実装したいベンダーは、独自のVendor IDと私的なAttribute値を使用できます。これにより、他のベンダーの拡張や将来のIETF拡張と衝突しないことが保証されます。Vendor IDには16ビットが割り当てられているため、この機能は最初の65,535の企業に制限されることに注意してください。

Attribute Type:指定されたVendor IDの下で定義されたすべてのAVPにわたって一意の解釈を持つ2オクテットの値です。

Attribute Value:Vendor IDとAttribute Typeによって示される実際の値です。Attribute Typeフィールドの直後に続き、Lengthで示される残りのオクテット(すなわち、Lengthから6オクテットのヘッダーを引いたもの)で実行されます。Lengthが6の場合、このフィールドは存在しません。

4.2 Mandatory AVPs (必須AVP)

Mビットが設定された未知のAVPを受信することは、それが関連付けられているセッションまたはトンネルにとって壊滅的です。したがって、Mビットは、セッションまたはトンネルの適切な動作に絶対に重要なAVPに対してのみ定義すべきです (SHOULD)。さらに、LACまたはLNSがMビットが設定された未知のAVPを受信し、それに応じてセッションまたはトンネルをシャットダウンする場合、必須AVPを送信するピアは、相互運用不可能な状況を引き起こしたことについて全責任を負うべきです。Mビットが設定されたAVP、特にベンダー固有のAVPを定義する前に、これが意図された結果であることを確認してください。

Mビットの使用に対する適切な代替手段が存在する場合は、それを利用すべきです (SHOULD)。たとえば、特定の拡張が存在するかどうかを判断するためにMビットが設定されたAVPを単に送信するのではなく、要求メッセージでAVPを送信し、応答メッセージで対応するAVPを期待することで可用性を識別できます。

新しいAVP(この文書で定義されていないもの)でMビットを使用する場合、関連する機能をオフに設定する機能を提供しなければならず (MUST)、AVPが送信されないか、Mビットが設定されずに送信されるようにする必要があります。

4.3 Hiding of AVP Attribute Values (AVP属性値の隠蔽)

各AVPヘッダーのHビットは、受信ピアにAVPの内容が隠蔽されているか平文で存在するかを示すメカニズムを提供します。この機能は、ユーザーパスワードやユーザーIDなどの機密性の高い制御メッセージデータを隠すために使用できます。

Hビットは、LACとLNSの間に共有シークレットが存在する場合にのみ設定できます (MUST)。共有シークレットは、トンネル認証に使用されるシークレットと同じです(セクション5.1.1を参照)。指定された制御メッセージの任意のAVPでHビットが設定されている場合、メッセージにはRandom Vector AVPも存在しなければならず (MUST)、Hビットが1である最初のAVPの前に配置されなければなりません (MUST)。

AVP値の隠蔽は、いくつかのステップで完了します。最初のステップは、元の(平文)AVPの長さと値のフィールドを取得し、次のように隠蔽AVPサブフォーマットにエンコードすることです:

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Length of Original Value | Original Attribute Value ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
... | Padding ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Length of Original Attribute Value:隠蔽する元の属性値の長さ(オクテット単位)です。これは、追加のパディングが追加されると失われる属性値の元の長さを判断するために必要です。

Original Attribute Value:隠蔽する属性値です。

Padding:隠蔽されている属性値の長さを不明瞭にするために使用されるランダムな追加オクテットです。

隠蔽されているデータのサイズをマスクするために、結果として得られるサブフォーマットは、上記のようにパディングされる場合があります (MAY)。パディングは、Length of Original Attribute Valueフィールドに配置される値を変更しませんが、作成されている結果のAVPの長さを変更します。たとえば、隠蔽する属性値の長さが4オクテットの場合、非隠蔽AVPの長さは10オクテット(6 + 属性値の長さ)になります。隠蔽後、AVPの長さは6 + 属性値の長さ + Length of Original Attribute Valueフィールドのサイズ + パディングになります。したがって、パディングが12オクテットの場合、AVPの長さは6 + 4 + 2 + 12 = 24オクテットになります。

次に、次の連結に対してMD5ハッシュが実行されます:

  • AVPの2オクテット属性番号
  • 共有シークレット
  • 任意の長さのランダムベクトル

このハッシュで使用されるランダムベクトルの値は、Random Vector AVPの値フィールドで渡されます。このRandom Vector AVPは、隠蔽されたAVPの前にメッセージ内に送信者によって配置されなければなりません (MUST)。同じランダムベクトルは、同じメッセージ内の複数の隠蔽AVPに使用できます (MAY)。後続のAVPの隠蔽に異なるランダムベクトルが使用される場合は、それが適用される最初のAVPの前にコマンドメッセージに新しいRandom Vector AVPを配置する必要があります。

次に、MD5ハッシュ値は、隠蔽AVPサブフォーマットの最初の16オクテット(またはそれ以下)のセグメントとXORされ、隠蔽AVPのAttribute Valueフィールドに配置されます。隠蔽AVPサブフォーマットが16オクテット未満の場合、サブフォーマットは、XORの前にAttribute Valueフィールドが16オクテットにパディングされたかのように変換されますが、サブフォーマットに実際に存在するオクテットのみが変更され、AVPの長さは変更されません。

サブフォーマットが16オクテットを超える場合、共有シークレットに続いて最初のXORの結果からなるオクテットのストリームに対して2番目の一方向MD5ハッシュが計算されます。そのハッシュは、サブフォーマットの2番目の16オクテット(またはそれ以下)のセグメントとXORされ、隠蔽AVPのValueフィールドの対応するオクテットに配置されます。

必要に応じて、この操作を繰り返し、共有シークレットを各XOR結果とともに使用して次のハッシュを生成し、値の次のセグメントをXORします。

隠蔽方法は、RFC 2138 [RFC2138] から採用されており、これはKaufman、Perlman、およびSpeciner [KPS] の著書「Network Security」の「Mixing in the Plaintext」セクションから取られました。この方法の詳細な説明は次のとおりです:

共有シークレットをS、ランダムベクトルをRV、属性値をAVと呼びます。値フィールドを16オクテットのチャンクp1、p2などに分割し、最後のチャンクは16オクテットの境界までランダムデータでパディングされます。暗号文ブロックをc(1)、c(2)などと呼びます。中間値b1、b2なども定義します。

b1 = MD5(AV + S + RV)   c(1) = p1 xor b1
b2 = MD5(S + c(1)) c(2) = p2 xor b2
. .
. .
. .
bi = MD5(S + c(i-1)) c(i) = pi xor bi

文字列はc(1)+c(2)+...+c(i)を含み、ここで+は連結を示します。

受信時、ランダムベクトルは、非表示にするAVPの前にメッセージで遭遇した最後のRandom Vector AVPから取得されます。その後、上記のプロセスを逆にして元の値を生成します。

4.4 AVP Summary (AVP概要)

以下のセクションには、この文書で定義されているすべてのL2TP AVPのリストが含まれています。

AVP名の後には、各AVPを利用するメッセージタイプのリストが続きます。各AVPタイトルの後には、AVPの目的の簡単な説明、Attribute Value形式の詳細(図を含む)、およびAVPの適切な使用に必要な追加情報が続きます。

4.4.1 AVPs Applicable To All Control Messages (すべての制御メッセージに適用可能なAVP)

Message Type (すべてのメッセージ)

Message Type AVP、Attribute Type 0は、ここで制御メッセージを識別し、後続のAVPの正確な意味を決定するコンテキストを定義します。

このAVPのAttribute Valueフィールドは次の形式です:

 0                   1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Message Type |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Message Typeは2オクテットの符号なし整数です。

Message Type AVPは、メッセージ内の最初のAVPでなければならず (MUST)、制御メッセージヘッダー(セクション3.1で定義)の直後に配置されます。定義されている制御メッセージタイプとその識別子のリストについては、セクション3.2を参照してください。

Message Type AVP内のMandatory (M) ビットには特別な意味があります。AVP自体が認識されない場合に無視すべきかどうかの指示ではなく、制御メッセージ自体を無視すべきかどうかの指示です。したがって、Message Type AVP内でMビットが設定されており、実装がMessage Typeを認識しない場合、トンネルをクリアしなければなりません (MUST)。Mビットが設定されていない場合、実装は未知のメッセージタイプを無視できます (MAY)。この文書で定義されているすべてのメッセージタイプに対して、Mビットは1に設定されなければなりません (MUST)。このAVPは隠蔽されてはいけません (MAY NOT)(Hビットは0でなければなりません (MUST))。このAVPの長さは8です。

Random Vector (すべてのメッセージ)

Random Vector AVP、Attribute Type 36は、任意のAVPのAttribute Valueの隠蔽を可能にするために使用されます。

このAVPのAttribute Valueフィールドは次の形式です:

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Random Octet String ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Random Octet Stringは任意の長さにできますが、少なくとも16オクテットのランダムベクトルが推奨されます。文字列には、隠蔽AVPのAttribute Valueを取得または隠蔽するためのMD5ハッシュの計算に使用するランダムベクトルが含まれています(セクション4.2を参照)。

メッセージ内に複数のRandom Vector AVPが表示される場合があり、その場合、隠蔽されたAVPはそれに最も近いRandom Vector AVPを使用します。このAVPは、Hビットが設定された最初のAVPの前に配置されなければなりません (MUST)。

このAVPのMビットは1に設定されなければなりません (MUST)。このAVPは隠蔽されてはいけません (MUST NOT)(Hビットは0でなければなりません (MUST))。このAVPの長さは6 + Random Octet Stringの長さです。

(続く: 4.4.2以降のセクション...)