LDPのセッション認証(TCP MD5)
LDPのセッションはTCPの646番の上に載ります。そこへ偽のセグメントを差し込まれないよう、RFC 5036はTCP MD5 Signature Option(RFC 2385)による保護を定めています。守られるのはセッションだけで、隣接の発見にもラベルの中身にも認証はかかりません。この非対称と、片側だけ設定したときに起きる紛らわしい状態を、IOS XR(XRd)のラボで確かめます。LDPの基本はLDPとはで解説しています。
何を守り、何を守らないのか
RFC 5036の2.9.1節が参照するRFC 2385は、接続の両端だけが知る情報からMD5ダイジェストを計算し、TCPセグメントに付ける仕組みです。パスワードそのものは接続のストリームに現れません。攻撃者はシーケンス番号を当てるだけでなくパスワードも入手する必要があります。
2.9.2節が、LDPでの使い方を定めています。
| 項目 | 規定 |
|---|---|
| 設定の単位 | ピアごとにパスワード(共有秘密)を設定する |
| 照合に失敗したとき | 送信元に何も返さずセグメントを捨てる |
| パスワードを設定していない相手 | その相手からのHelloを無視する |
守られない範囲も明記されています。5.2節 Privacy のとおり、LDPはラベル配布の情報を暗号化しません。経路上でラベルの対応関係を読むことは防げず、防げるのは偽のセグメントを差し込まれることです。
Hello(UDP 646)には認証がありません。 2.9.2節の「Helloを無視する」はパスワードを設定していない相手に対する動作なので、設定済みの相手から届くHelloは無視されません。つまり片側だけにパスワードを入れると、隣接は見えたままセッションだけが張れなくなります。
IOS XRの設定
mpls ldpの直下で指定します。ピアはLDP識別子(3.3.3.3:0のようにラベルスペース番号まで含む形)で指定します。
| 範囲 | コマンド |
|---|---|
| 全ネイバー共通 | neighbor password clear <パスワード> |
| ピアごと | neighbor <LDP識別子> password clear <パスワード> |
| 共通パスワードをこのピアだけ無効化 | neighbor <LDP識別子> password disable |
clearは「これから平文を入力する」という意味で、保存されるときは暗号化されます。
片側だけ入れると何が起きるか
パスワードを入れた側は、届くセグメントにダイジェストが付いていることを期待します。入れていない側は付けずに送るので、照合に失敗し、応答を返さずに捨てられます。送る側からは相手が沈黙しているようにしか見えず、TCPのSYNを再送し続けます。
Helloは流れ続けるので、show mpls ldp discoveryでは隣接が見えたままです。一方show mpls ldp neighborは空になります。
セッションが落ちるとラベルの交換も止まります。IGPは無関係なのでIPの経路は残り、コア内のIP疎通は通ったまま、MPLSで運ぶVPNの通信だけが落ちます。経路表が正常に見えるため、原因の見当をつけにくい状態になります。
検証構成
冗長性のない直列構成です。コア(PE1 - P1 - P2 - PE2)でOSPFとLDPを動かし、CE1とCE2はVRF CUST-AでPEに接続してVPNv4で疎通させます。認証を入れるのはPE1 - P1の1区間だけです。
CE1 ------ PE1 ------ P1 ------ P2 ------ PE2 ------ CE2
(AS 65101) | ↑ここに認証を入れる | (AS 65102)
vrf CUST-A vrf CUST-A
└────── iBGP vpnv4(Lo0間)──────┘| ルータ | Lo0 | 役割 |
|---|---|---|
| CE1 | 1.1.1.1 | AS 65101、192.168.1.0/24 |
| PE1 | 2.2.2.2 | 入口/出口LSR、vrf CUST-A |
| P1 | 3.3.3.3 | 中継LSR |
| P2 | 4.4.4.4 | 中継LSR |
| PE2 | 5.5.5.5 | 入口/出口LSR、vrf CUST-A |
| CE2 | 6.6.6.6 | AS 65102、192.168.2.0/24 |
検証の全体像
| STEP | 操作 | 確かめること |
|---|---|---|
| 0 | 認証なし | セッションが確立し、ping / tracerouteが通ること |
| 1 | PE1だけにneighbor 3.3.3.3:0 password |
セッションが落ち、隣接は残ること。IPは通るのにVPNが落ちること |
| 2 | P1にも同じパスワード | 復旧し、TCPにMD5オプションが載ること |
| 3 | 両側から撤去(最終状態) | STEP 0と同じに戻ること |
疎通はCE1からping 192.168.2.1 source 192.168.1.1 count 50 timeout 1で、コア内はPE1からping 5.5.5.5 source 2.2.2.2で測っています。
STEP 0:認証なしの状態
PE1とP1のセッションが確立し、7本のラベルを受け取っています。
RP/0/RP0/CPU0:PE1#show mpls ldp neighbor brief
Sat Sep 12 03:23:25.251 UTC
Peer GR NSR Up Time Discovery Addresses Labels
ipv4 ipv6 ipv4 ipv6 ipv4 ipv6
----------------- -- --- ---------- ---------- ---------- ------------
3.3.3.3:0 N N 00:25:25 1 0 3 0 7 0 STEP 1:PE1だけにパスワードを入れる
PE1にだけ設定します。投入した内容はpassword clearですが、保存された時点でencryptedになっています。
RP/0/RP0/CPU0:PE1#show configuration commit changes last 1
Sat Sep 12 03:27:29.095 UTC
!! Building configuration...
!! IOS XR Configuration 26.1.1
mpls ldp
neighbor
3.3.3.3:0 password encrypted 09676F332C2938354620201A
!
!
end隣接は残り、セッションだけが落ちる
show mpls ldp neighbor briefは何も返しません。
RP/0/RP0/CPU0:PE1#show mpls ldp neighbor brief
Sat Sep 12 03:29:49.148 UTC
RP/0/RP0/CPU0:PE1#show mpls ldp neighborところがshow mpls ldp discoveryでは隣接が生きています。xmit/recvのままで、Establishedの時刻は設定を変える前のまま途切れていません。
RP/0/RP0/CPU0:PE1#show mpls ldp discovery
Sat Sep 12 03:29:49.492 UTC
Local LDP Identifier: 2.2.2.2:0
Discovery Sources:
Interfaces:
GigabitEthernet0/0/0/1 : xmit/recv
VRF: 'default' (0x60000000)
LDP Id: 3.3.3.3:0, Transport address: 3.3.3.3
Hold time: 15 sec (local:15 sec, peer:15 sec)
Established: Sep 12 01:59:48.900 (01:30:00 ago)Helloは認証されないので、隣接だけが無傷で残ります。show mpls ldp neighborだけを見ると「相手がいない」ように見えますが、実際には相手は見えています。
IPは通るのにVPNだけが落ちる
CE1からCE2への疎通は完全に断です。
RP/0/RP0/CPU0:CE1#ping 192.168.2.1 source 192.168.1.1 count 50 timeout 1
Sat Sep 12 03:31:52.547 UTC
Type escape sequence to abort.
Sending 50, 100-byte ICMP Echos to 192.168.2.1 timeout is 1 seconds:
..................................................
Success rate is 0 percent (0/50)同じ時刻に、PE1からPE2のLoopback宛のIP疎通は無損失です。
RP/0/RP0/CPU0:PE1#ping 5.5.5.5 source 2.2.2.2 count 50 timeout 1
Sat Sep 12 03:30:09.450 UTC
Type escape sequence to abort.
Sending 50, 100-byte ICMP Echos to 5.5.5.5 timeout is 1 seconds:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Success rate is 100 percent (50/50), round-trip min/avg/max = 9/11/27 msOSPFは動いているのでIPの経路は残り、トランスポートLSPだけが消えます。経路表を見ても異常は出ません。
TCPは応答が返らない
P1はセッションを張り直そうとしてSYNを送り続けます。03:27:31から03:36:10までの約9分間に60回、すべてP1からで、PE1からの応答は1つもありません。添付のキャプチャーのNo.900が最初の1回です。
Internet Protocol Version 4, Src: 3.3.3.3, Dst: 2.2.2.2
Transmission Control Protocol, Src Port: 15439, Dst Port: 646, Seq: 0, Len: 0
Source Port: 15439
Destination Port: 646
Flags: 0x002 (SYN)
TCP Option - Maximum segment size: 1240 bytes
Kind: Maximum Segment Size (2)
TCP Option - Window scale: 0 (multiply by 1)
Kind: Window Scale (3)
TCP Option - End of Option List (EOL)
Kind: End of Option List (0)オプションはMSSとWindow scaleだけで、MD5 signatureがありません。PE1はこれを照合できないので、RFC 2385のとおり応答を返さずに捨てます。
切り分けに使うもの
syslogの出方が両側で違います。原因が分かるのはパスワードを入れた側だけです。
RP/0/RP0/CPU0:Sep 12 03:27:28.434 UTC: mpls_ldp[1178]: %ROUTING-LDP-5-NBR_CHANGE : VRF 'default' (0x60000000), Neighbor 3.3.3.3:0 is DOWN (Session MD5 password changed) RP/0/RP0/CPU0:Sep 12 03:27:28.440 UTC: mpls_ldp[1178]: %ROUTING-LDP-5-NBR_CHANGE : VRF 'default' (0x60000000), Neighbor 2.2.2.2:0 is DOWN (TCP connection closed) 入れていない側にはTCP connection closedとしか出ません。相手が認証を入れたことは分からないので、片側だけ設定が変わった状況では、変更を知らない側は原因にたどり着けません。見るべきものをまとめます。
| 見るもの | 片側だけ認証を入れたとき |
|---|---|
show mpls ldp neighbor |
空。 相手がいないように見える |
show mpls ldp discovery |
Helloは届いている。 原因はセッション層にある |
show ospf neighbor / show route |
正常。IGPは無関係 |
| syslog(設定した側) | DOWN (Session MD5 password changed) |
| syslog(していない側) | DOWN (TCP connection closed) |
STEP 2:両側に同じパスワードを入れる
P1にも同じパスワードを入れると復旧します。ラベルも7本に戻りました。
RP/0/RP0/CPU0:PE1#show mpls ldp neighbor brief
Sat Sep 12 03:39:54.731 UTC
Peer GR NSR Up Time Discovery Addresses Labels
ipv4 ipv6 ipv4 ipv6 ipv4 ipv6
----------------- -- --- ---------- ---------- ---------- ------------
3.3.3.3:0 N N 00:03:21 1 0 3 0 7 0 ハンドシェイクのSYNにはMD5 signature(Kind 19)が載っています。添付のキャプチャーのNo.1693です。
Internet Protocol Version 4, Src: 3.3.3.3, Dst: 2.2.2.2
Transmission Control Protocol, Src Port: 46215, Dst Port: 646, Seq: 0, Len: 0
Source Port: 46215
Destination Port: 646
Flags: 0x002 (SYN)
TCP Option - Maximum segment size: 1216 bytes
Kind: Maximum Segment Size (2)
TCP Option - Window scale: 0 (multiply by 1)
Kind: Window Scale (3)
TCP Option - No-Operation (NOP)
Kind: No-Operation (1)
TCP Option - TCP MD5 signature
Kind: MD5 Signature Option (19)
MD5 digest: 094c51db8fb8adb70061c6cbd3df7e02返ってきたSYN/ACKにも同じようにMD5 signatureが載っています(ダイジェストの値は方向ごとに違います)。
Internet Protocol Version 4, Src: 2.2.2.2, Dst: 3.3.3.3
Transmission Control Protocol, Src Port: 646, Dst Port: 46215, Seq: 0, Ack: 1, Len: 0
Source Port: 646
Destination Port: 46215
Flags: 0x012 (SYN, ACK)
TCP Option - Maximum segment size: 1216 bytes
Kind: Maximum Segment Size (2)
TCP Option - Window scale: 0 (multiply by 1)
Kind: Window Scale (3)
TCP Option - No-Operation (NOP)
Kind: No-Operation (1)
TCP Option - TCP MD5 signature
Kind: MD5 Signature Option (19)
MD5 digest: b7b7fb4175fcb691ff73dfa05ab16bc2MSSが認証なしの1240バイトから1216バイトに減っています。MD5 signatureは18バイトのオプションで、詰め物を含めて24バイトぶんのオプション領域を使うためです。
| STEP | CE1 → CE2のping |
|---|---|
| 0 | 100%(50/50) |
| 1 | 0%(0/50) |
| 2 | 100%(50/50) |
| 3 | 100%(50/50) |
STEP 3:撤去
両側からパスワードを外すと、MD5オプションの無いハンドシェイクでセッションが張り直されます。最終STEPのrunning-configは、ラボの起動時Configと1行も違いません。
設計上の注意
- 両端に同時に入れられないなら、入れる順番を決めておきます。 片側だけの状態は必ずセッション断になります。運用中のコアに後から入れるときは、区間ごとに保守時間を取ります
- 相手側には理由が出ません。 他組織との境界(インターAS)で認証を変えるときは、相手に事前に伝えないと相手側は原因を特定できません
- パスワードを変えるときも一度切れます。
Session MD5 password changedで落ちてから張り直しになるため、変更も投入と同じ扱いで計画します - 暗号化は行われません。 ラベルの対応関係を隠したい場合、この仕組みでは足りません
検証Configおよびshow結果
各STEPで6台すべてから、次の種類をルータごとに分けて取得しています。検証Configはこの..._run.txtです(最終状態は最後のSTEPのもの)。
| ファイル | 内容 |
|---|---|
..._show.txt |
show version / show mpls ldp neighbor detail / show mpls ldp discovery detail / show mpls ldp parameters など |
..._log.txt |
そのSTEPの範囲だけに絞ったshow logging |
..._run.txt |
そのSTEP時点のshow running-config(=そのSTEPの検証Config) |
..._ping.txt |
そのSTEPのping(50発、timeout 1秒)とtraceroute |
..._trace.txt |
show mpls ldp trace peer / discovery など(コア4台のみ) |
..._commit.cfg |
そのSTEPで実際にcommitした設定だけ。 設定を変えたルータの分のみ |
STEP 0:認証なし
| ルータ | show出力 | syslog | running-config | ping | trace | commit |
|---|---|---|---|---|---|---|
| CE1 | show | log | run | ping | - | - |
| PE1 | show | log | run | ping | trace | - |
| P1 | show | log | run | ping | trace | - |
| P2 | show | log | run | ping | trace | - |
| PE2 | show | log | run | ping | trace | - |
| CE2 | show | log | run | ping | - | - |
STEP 1:PE1だけにneighbor 3.3.3.3:0 password
| ルータ | show出力 | syslog | running-config | ping | trace | commit |
|---|---|---|---|---|---|---|
| CE1 | show | log | run | ping | - | - |
| PE1 | show | log | run | ping | trace | cfg |
| P1 | show | log | run | ping | trace | - |
| P2 | show | log | run | ping | trace | - |
| PE2 | show | log | run | ping | trace | - |
| CE2 | show | log | run | ping | - | - |
STEP 2:P1にも同じパスワード
| ルータ | show出力 | syslog | running-config | ping | trace | commit |
|---|---|---|---|---|---|---|
| CE1 | show | log | run | ping | - | - |
| PE1 | show | log | run | ping | trace | - |
| P1 | show | log | run | ping | trace | cfg |
| P2 | show | log | run | ping | trace | - |
| PE2 | show | log | run | ping | trace | - |
| CE2 | show | log | run | ping | - | - |
STEP 3:両側から撤去(最終状態)
| ルータ | show出力 | syslog | running-config | ping | trace | commit |
|---|---|---|---|---|---|---|
| CE1 | show | log | run | ping | - | - |
| PE1 | show | log | run | ping | trace | cfg |
| P1 | show | log | run | ping | trace | cfg |
| P2 | show | log | run | ping | trace | - |
| PE2 | show | log | run | ping | trace | - |
| CE2 | show | log | run | ping | - | - |
PE1 - P1間のキャプチャー全体です。STEP 1のSYN再送から、STEP 2のMD5付きハンドシェイク、STEP 3の撤去までが1本に入っています。
PE1 - P1間のキャプチャー全体をダウンロード参考
| 出典 | 参照した箇所 |
|---|---|
| RFC 5036 LDP Specification | 2.9.1節(TCP MD5 Signature Option)、2.9.2節(ピアごとのパスワード、照合失敗時は応答せず破棄、パスワード未設定の相手のHelloを無視)、5.2節(暗号化されないこと) |
| RFC 2385 Protection of BGP Sessions via the TCP MD5 Signature Option | MD5 signatureのTCPオプション(Kind 19) |
検証はXRd 26.1.1(Cisco Modeling Labs)で実施しました。