ペネトレーションしのべくん

さようなら、すべてのセキュリティエンジニア

【Batfish】ネットワークバリデーションツール「Batfish」を使った簡易経路テスター

Batfishとは?

主要ネットワーク製品の設定ファイルを解釈し、動作を検証できるOSSツール「Batfish」が、TLで密かな盛り上がりを見せている。Javaで書かれているみたい。

https://www.batfish.org/

github.com

Batfishの使い方

2種類のDockerイメージと、Pythonライブラリが提供されている。

  • batfish
    • Batfish
  • allinone
    • Batfish + Jupyter Notebook

github.com

github.com

利用のステップは簡単。batifshコンテナはbatfishと通信するための9996ポートと9997ポートが提供され、allinoneコンテナの場合はインターフェイスであるJupyter Notebookに接続するための8888ポートが提供されている。

  • batfishコンテナを起動する。
  • ライブラリをインポートする。
  • Batfishコンテナからクエスチョン(後述)を読み込む。
  • Batfishコンテナへネットワーク機器の設定ファイルをアップロードする。
  • 任意のクエスチョンAPIを叩いて、設定ファイルを検証する。
  • 必要に応じてPandasフレーム形式やJSON形式でアウトプットする。

エスチョンAPIの種類こそがBatfishで検証できることの全てで、Pybatfishのドキュメントを見る限りでは、設定されているIPアドレスACL、BGP、IPsecなどざっと30種類ぐらいある模様(Batfishそのものにはもっと実装されているかもしれない)。

「befsanne/batfish-training」でトレーニング中

私がBatifshの検証のために作ったリポジトリをナレッジ共有目的で公開している。 一応公式のbatfish/dockerをフォークしてきてはいるものの、かすかに面影がある程度。

github.com

notebooksディレクトリ内には、以下の3つのnotebookが入っている。

易経路テスター「route-checker.ipynb」

「route-checker.ipynb」は、クエスチョンAPIのひとつである「pybatfish.question.bfq.traceroute()」を使って、指定した通信がルーターを経由して宛先へ到達できるか、到達できないならどこでパケットが落ちるのかを検証するためのnotebookになっている。

オンプレで新規サービスのローンチやサーバーの追加などを行う時、現状のルーターの設定(ACL、ルーティング)が新たな通信要件を許容するかどうかを、アプリ開発者が簡単に調べられるといいなーとずっと思っていた。アプリ開発者は往々にしてルーターへのログインはおろか設定ファイルを読めなかったり、読めるようになってたとしても読むことに慣れていないので、ネットワーク運用者に調査を依頼して、穴開け作業が必要なら更に待つ必要がある。

こういうツールがあれば、アプリ開発者にとってブラックボックスだったネットワークが多少とっつきやすくなると思うし、ネットワーク運用者としても、調査の手間が減って助かる。

で、OpenFlowで実装してみようと思い立ってから永い時が経って、着手するよりも先にBatfishという イカれた イカしたツールが颯爽登場したのだった。

ACL関連クエスチョン

ACLに関するクエスチョンはいくつかあるけど、このtraceroute()がいちばん使いやすいと思う。公式はACLの設定検証を題材にしたnotebook内でtestfilters()とかsearchfilters()を使っているけど、検査対象のACLの指定(正規表現が効く)をしなければならないのが、目的と照らすとめんどくさい。送信元ホスト(もしくはインターフェイス)と検査対象のルーターだけ指定するだけのtraceroute()は、使い勝手がいい。

次のステップ

Jupyter notebookはIT屋さんにとって十分使いやすいインターフェイスを提供してくれていると思うけど、せっかくJSON出力なんかもできるので、Flaskと一緒に使ってWeb GUIからBatfishを操作する、みたいなことも試してもいいかもしれない。