BGPsec とパス検証:経路全体の真正性
RPKIが見逃すAS_PATHの改ざんを、各ホップの署名連鎖で封じる仕組みが原理から腑に落ちる。BGPsecの署名対象・検証手順・なぜ普及しないのかまで掴める。
- 1.RPKIは発信元ASしか検証しないため、AS_PATHの途中改ざんや偽装には無力。BGPsecは各ASが経路を転送するたびに署名を1段ずつ積み、パス全体の真正性を暗号的に保証する。
- 2.署名対象には次に渡す相手ASも含むため、署名を抜き取って別経路へ流用できない。各ホップの署名が前段の鍵で連鎖検証され、AS_PATHの順序と構成がそのまま守られる。
- 3.経路ごとに署名生成・検証が要り集約や経路圧縮と相性が悪く、増分配備では非署名ASがいると連鎖が切れる。計算コストと展開困難ゆえ実運用はほぼ進んでいない。
RPKI が残した穴:パスは誰も保証しない
RPKI の発信元検証 は「このプレフィックスを発信してよい AS はどれか」を ROA で暗号的に固めます。しかし守るのは AS_PATH の 先頭1ホップ(発信元 AS)だけで、そこから先のパスがどう構成されたかは一切検証しません。
ここに致命的な隙が残ります。攻撃者が正規の発信元 AS 番号を AS_PATH の末尾に偽装して付ければ、発信元としては ROA と矛盾せず Valid のまま経路を乗っ取れます(path manipulation)。あるいは存在しない隣接関係をでっち上げて、実際には通っていない AS を経由したと偽る短経路を広告すれば、BGP の経路選択 は AS_PATH 長を信じて攻撃者の経路を選んでしまいます。発信元が正しくても、経路そのものが嘘ならハイジャックは成立するのです。
BGPsec(RFC 8205)はこの穴を埋めます。狙いは一点、「広告された AS_PATH が、本当にその AS の列を順番どおりに通って伝播したものか」を暗号的に証明可能にすることです。
着想:転送のたびに署名を1段積む
BGPsec の核心は、各 AS が経路を隣接へ転送するとき 自分の署名を1つ追加する ことです。通常の AS_PATH が AS 番号を継ぎ足していくのと並行して、BGPsec は署名のリスト(BGPsec_PATH 属性内の Signature_Block)を継ぎ足します。結果として、経路が originAS → AS1 → AS2 → 受信者 と流れれば、署名も同じ順に3段積まれます。
通常のAS_PATH: [ AS2, AS1, originAS ] ← 番号だけ。誰でも捏造可能
BGPsec_PATH:
Secure_Path: AS2 → AS1 → originAS ← 各ASの pCount 等
Signature_Block:
sig(originAS, 宛先=AS1, originの鍵で署名)
sig(AS1, 宛先=AS2, AS1の鍵で署名)
sig(AS2, 宛先=受信者, AS2の鍵で署名)
各署名に使う鍵は、RPKI が発行する ルータ証明書の秘密鍵です。RPKI は ROA で「IP/AS 資源の保有」を裏打ちしますが、BGPsec ではこれを拡張し「この AS 番号を名乗るルータの公開鍵」を証明書チェーンで保証します。検証側は受信した署名を、各 AS のルータ証明書(公開鍵)で1段ずつ確かめます。署名に使う鍵が資源証明書チェーンに根を持つ点は TLS と同じ X.509 ですが、束ねるのは「身元」ではなく「AS 資源の保有」です。
署名が守るもの:宛先 AS を巻き込む鎖
ただ AS 番号に署名するだけでは不十分です。攻撃者が正規経路から有効な署名を1つ抜き取り、別の偽経路に貼り付ける 再利用攻撃 が成立してしまうからです。BGPsec はこれを「署名対象に 次に渡す相手の AS 番号 を含める」ことで封じます。
ある AS が積む署名は、おおむね「自分が転送する直前の BGPsec_PATH の内容(=前段までの署名を含む)」と「自分が次に渡す相手 AS 番号(Target AS)」をまとめて覆います。前段の署名を取り込むことで順序が固定され、相手 AS を取り込むことで、その署名は 特定の隣接へ渡すという文脈 に縛られます。だから署名を抜き出して別の隣接や別経路へ流用しても、宛先 AS が合わず検証に失敗します。
この設計から二つの保証が生まれます。ひとつは 順序の保全で、各署名が前段までを覆うため、途中の AS を抜いたり順番を入れ替えたりすると鎖が壊れます。もうひとつは 隣接関係の真正性で、宛先 AS を署名に含めるため「AS1 が確かに AS2 へ渡した」という事実が暗号的に記録されます。攻撃者は自分の秘密鍵を持たない AS の署名を作れないため、存在しない経由を捏造できません。
検証手順:末尾から起点へ鎖をほどく
受信側ルータは BGPsec_PATH を受け取ると、署名を 新しい方(直前のホップ)から発信元へ向かって 1段ずつ検証します。
verify(bgpsec_path, 自AS):
segs = Secure_Path の AS 列 # 末尾=自分の隣, 先頭=originAS
sigs = Signature_Block の署名列 # segs と一対一
target = 自AS # 最初の宛先は受信者である自分
for i in (隣のAS から originAS の順):
cert = RPKIから segs[i] のルータ証明書(公開鍵)を取得・チェーン検証
if cert 無効: return Invalid # 鍵が資源証明書チェーンに根を持たない
msg = (前段までの BGPsec_PATH 内容) ++ target # 署名が覆った対象を再構築
if not verify_sig(sigs[i], msg, cert.公開鍵):
return Invalid # 署名が壊れている/順序が違う/宛先が合わない
target = segs[i] # 次段の宛先は、いま検証したAS
return Valid # 全ホップの署名が起点まで連鎖した
全段の署名が起点まで途切れず検証できて初めて Valid です。一段でも壊れていれば Invalid。発信元検証が三値(Valid / Invalid / NotFound)だったのに対し、BGPsec のパス検証は本質的に二値で、「鎖が完全に繋がったか否か」を問います。
なお BGPsec が守るのはあくまで 制御面(広告された経路情報)の真正性です。実際に転送されるパケットが本当にその経路を通る保証ではありません。発信元検証と同様に、データ面の保証は別問題です。
| 観点 | RPKI 発信元検証 (ROV) | BGPsec パス検証 |
|---|---|---|
| 検証対象 | AS_PATH の先頭1ホップ(発信元AS) | AS_PATH 全ホップの署名連鎖 |
| 防げる攻撃 | 発信元なりすまし | 発信元 + パス偽装・経路途中の改ざん |
| 署名の単位 | プレフィックスごと(ROAは静的) | 経路ごと・ホップごと(広告時に動的生成) |
| 必要な鍵 | 資源証明書(ROA署名) | ルータ証明書(各AS・各ルータ) |
| 計算コスト | 軽い(VRP突き合わせのみ) | 重い(経路ごとに署名生成・検証) |
なぜ展開が進まないのか
原理は明快ですが、BGPsec の実運用はほとんど進んでいません。理由は性能と展開の両面にあります。
第一に 計算コスト です。署名生成・検証は経路1本ごと、ホップ1段ごとに発生します。フルルートは数十万経路規模で、しかも経路が更新されるたびに署名し直しが要ります。ROV が静的な VRP との突き合わせで済むのと比べ、桁違いに重い処理です。
第二に 経路集約との非互換 です。BGPsec の署名は具体的な AS_PATH を1本ずつ覆うため、複数経路を1つに束ねる CIDR の経路集約 や、AS_PATH を畳む最適化と本質的に両立しません。署名された経路はそのままの形で運ぶしかなく、テーブル肥大やメモリ消費を悪化させます。
第三に 増分配備の弱さ です。これが最大の障壁です。
BGPsec の保証は「全ホップが署名している」ことに依存します。経路の途中に BGPsec 非対応の AS が1つでもいると、そこで BGPsec_PATH が通常の AS_PATH に格下げされ、署名連鎖はそこで終端します。つまり端から端まで全 AS が対応して初めて完全な保証が得られる、強い悪条件です。配備初期は対応 AS がまばらで、ほとんどの経路で署名が途切れるため、努力に見合う守りが得られません。この「全員揃わないと効かない」性質が普及の悪循環を生んでいます。
そのため現実の防御は、まず RPKI/ROV で発信元を固め、隣接関係の正しさは ASPA(Autonomous System Provider Authorization) で軽量に補い、ピアリングの 経路伝播ポリシー によるフィルタや IRR で多層化する、という積み重ねが主流です。ASPA は「この AS はあの AS を上流に持ってよい」という関係だけを署名する設計で、経路ごとの動的署名が不要なため、BGPsec より遥かに軽く展開しやすい。パス全体の完全な暗号保証は BGPsec の理想ですが、当面はこの軽量な近似が現実解になっています。
- RPKI/ROV は発信元 AS のみ検証。AS_PATH 偽装は Valid のまま通る。BGPsec はパス全体を守る。
- BGPsec は各 AS が転送時に署名を1段追加し、受信側が末尾から起点へ連鎖検証する。鍵は RPKI のルータ証明書。
- 署名対象に「次の宛先 AS」を含めるため、署名を抜き取って別経路へ流用できない(再利用攻撃の防止)。
- 弱点は計算コスト(経路ごと・ホップごとの署名)、経路集約との非互換、増分配備の弱さ(非署名 AS で鎖が切れる)。
- 軽量な補完として ASPA がある。隣接関係だけを署名し、経路ごとの動的署名が不要。
一段で言うと
BGPsec は「各 AS が経路を転送するたびに、前段までの内容と次の宛先 AS をまとめて自分の鍵で署名し、受信側が末尾から起点まで署名連鎖を検証する」ことで、RPKI が守れなかった AS_PATH 全体の真正性を保証します。宛先 AS を署名に巻き込むことで署名の流用を封じ、順序と隣接関係を暗号的に固定するのが要諦です。一方で経路ごと・ホップごとの署名は計算コストが重く、経路集約と両立せず、しかも全 AS が対応しないと鎖が途切れます。この「全員揃わないと効かない」性質ゆえ実運用はほぼ進まず、現実には ROV で発信元を固め、ASPA とフィルタでパスを軽く補う多層防御が選ばれています。
ネットワーク Article
BGPsec とパス検証:経路全体の真正性を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
BGP
比較で見る軸
難易度: advanced / カテゴリ: ネットワーク / タグ数: 6
導入後に効く点
署名対象には次に渡す相手ASも含むため、署名を抜き取って別経路へ流用できない。各ホップの署名が前段の鍵で連鎖検証され、AS_PATHの順序と構成がそのまま守られる。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- ネットワーク
- タグ数
- 6
判断チェックリスト
- 自社の用途が「BGP / BGPsec」に近いか確認する。
- 強みである「RPKIは発信元ASしか検証しないため、AS_PATHの途中改ざんや偽装には無力。BGPsecは各ASが経路を転送するたびに署名を1段ずつ積み、パス全体の真正性を暗号的に保証する。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。