はじめに
IXなどで稼働するBGPは昔から度々BGPハイジャックが問題になっていて、悪意あるなし関係なく、大規模被害が発生していました。
そこで生まれたのが RPKI (資源公開鍵基盤)ですが、これにより、不正なOrigin ASとIP Prefix(経路)の組み合わせを受け取らないようにできます。 RPKIで取得するAS番号とIP Prefixの組み合わせをROV(ロア)といいます
しかしRPKIで管理するROAは重点的に監視していないと、ROAが実際のBGP経路と異なってしまうことにより、ネットワークの到達生が失われてしまう事故が発生してしまいます。 事例もいくつか報告されているようです。 そこで考えられたのが roamon と呼ばれるROA用監視システムです。
roamonについて
roamonは三つのコンポーネントに分かれており、それぞれ以下のような役割を持ちます。
roamon-verify:
ROVの結果をIPアドレスプレフィックスやAS番号を指定してみることができるコマンドラインツールです。
RoutinatorからROAを検証した結果であるVRP(Validated ROA Payloads)を取得し、オレゴン大学のBGP経路のアーカイブと比較しています。
roamon-alert:
予めAS番号を指定しておいて、そのASから経路広告されているBGP経路が異なった場合にメールかSlackで通知を投げるツールです。
メール送信サービスのsmtp server、メールや通知などデータを格納しておくPostgreSQLが含まれます。
roamon-web:
alert の通知先を管理するユーザ・インターフェースを提供します。
roamon 環境構築手順
意外と手順につまずいてしまったので手順をメモしておく
ホストOS :Debian 10 実行ユーザ:root 注意事項として3コンポーネントは全て同じホストで構築してください
roamon-verify 構築
# pip3は前もってインストールしておくこと pip3 install netaddr pyfiglet tqdm pyasn beautifulsoup4 requests # Clone git clone https://github.com/taiji-k/roamon-verify.git cd roamon-verify # Build sudo docker build -t roamon ./docker # Run コンテナログイン sudo docker run --rm -it roamon /bin/bash cd /roamon-verify
ROAデータの取得
# ROA 全データ取得 python3 roamon_verify_controller.py get --all # ROA BGPデータ取得 python3 roamon_verify_controller.py get --bgp # ROA 検証済みデータ取得 python3 roamon_verify_controller.py get --roa
VRP(検証済ROAペイロード)とBGPルートを比較してROVを生成
python3 roamon_verify_controller.py rov [--asn <AS番号>| --ip <IP Prefix>] 64511 192.168.1.0/24 VALID 64511 172.16.0.0/16 VALID 64510 10.0.0.0/8 INVALID
roamon-alert 構築
# Clone git clone https://github.com/taiji-k/roamon-alert.git cd roamon-alert # SMTP Server、PostgreSQLの起動 # alert状況を表示し続けるためこれ以降は別Termを開く必要がある sudo docker-compose -f ./docker/docker-compose.yml up
実行例
root@buster:~/roamon-alert/docker# sudo docker-compose -f ./docker-compose.yml up Starting docker_smtp-test-server_1 ... Starting docker_smtp-test-server_1 ... done Starting roamon-alert ... done Attaching to postgresql, docker_smtp-test-server_1, roamon-alert smtp-test-server_1 | 2020/07/31 14:17:08 Using in-memory storage smtp-test-server_1 | 2020/07/31 14:17:08 [SMTP] Binding to address: 0.0.0.0:1025 smtp-test-server_1 | [HTTP] Binding to address: 0.0.0.0:8025 smtp-test-server_1 | Creating API v1 with WebPath: smtp-test-server_1 | Creating API v2 with WebPath: smtp-test-server_1 | 2020/07/31 14:17:08 Serving under http://0.0.0.0:8025/ postgresql | The files belonging to this database system will be owned by user "postgres". postgresql | This user must also own the server process. postgresql | postgresql | The database cluster will be initialized with locale "en_US.utf8". postgresql | The default text search configuration will be set to "english". (snip) smtp-test-server_1 | [APIv1] KEEPALIVE /api/v1/events smtp-test-server_1 | [APIv1] KEEPALIVE /api/v1/events smtp-test-server_1 | [APIv1] KEEPALIVE /api/v1/events smtp-test-server_1 | [APIv1] KEEPALIVE /api/v1/events smtp-test-server_1 | [APIv1] KEEPALIVE /api/v1/events
roamon-alertデーモンの起動
sudo docker exec -it roamon-alert /bin/bash ># pipenv install ># pipenv shell (roamon-alert) ># python3 roamon_alert_controller.py daemon --start
# 連絡先追加 sudo python3 roamon_alert_controller.py add --asn 3333 --type email --dest example3333@example.com # 通知連絡先リスト表示 $ sudo python3 roamon_alert_controller.py list 1 email example1@example.com None 1899 2 email example2@example.com 147.162.0.0/15 None 2 email example2@example.com 192.168.30.0/24 None 2 email example2@example.com None 137 3 email example3@example.com None 327687 4 slack https://hooks.slack.com/services/TBZC4xxxx 147.162.0.0/15 None
roamon-web 構築
# yarnのインストール curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list sudo apt-get update && sudo apt-get install yarn # Clone git clone https://github.com/taiji-k/roamon-web.git cd roamon-web # package-lock.jsonを元に yarnによるwebインストール yarn install # web起動 yarn dev
実行例
root@buster:~/roamon-web# yarn dev yarn run v1.22.4 $ cross-env NODE_ENV=development nodemon server/index.js --watch server [nodemon] 1.19.4 [nodemon] to restart at any time, enter `rs` [nodemon] watching dir(s): server/**/* [nodemon] watching extensions: js,mjs,json [nodemon] starting `node server/index.js` ℹ Preparing project for development 14:18:08 ℹ Initial build may take a while 14:18:08 ✔ Builder initialized 14:18:08 ✔ Nuxt files generated 14:18:08 ✔ Client Compiled successfully in 21.71s ✔ Server Compiled successfully in 17.80s ℹ Waiting for file changes 14:18:34 READY Server listening on http://localhost:3000
http://localhost:3000にブラウザーでアクセス
通知内容の確認や、作成が可能
以上