RPKI監視 roamon を試してみた

はじめに

IXなどで稼働するBGPは昔から度々BGPハイジャックが問題になっていて、悪意あるなし関係なく、大規模被害が発生していました。

www.atmarkit.co.jp

そこで生まれたのが RPKI (資源公開鍵基盤)ですが、これにより、不正なOrigin ASとIP Prefix(経路)の組み合わせを受け取らないようにできます。 RPKIで取得するAS番号とIP Prefixの組み合わせをROV(ロア)といいます

www.nic.ad.jp

しかしRPKIで管理するROAは重点的に監視していないと、ROAが実際のBGP経路と異なってしまうことにより、ネットワークの到達生が失われてしまう事故が発生してしまいます。 事例もいくつか報告されているようです。 そこで考えられたのが roamon と呼ばれるROA用監視システムです。

blog.nic.ad.jp

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ブラウザーでアクセス f:id:thelarklife1021:20200801024937p:plain

通知内容の確認や、作成が可能 f:id:thelarklife1021:20200801024750p:plain

今日は一旦ここまで 以上