MolochのDB内の解析結果をJupyterから分析する

本記事は上記の記事に引き続き,Molochを利用したトラフィック解析手法をご紹介します.第二回の今回は,前回DBへ出力した解析結果をJupyterから分析する例を書いていきます.

Molochで解析したpcapの情報ですが,すべてElasticsearchへ格納されているため,DBへ直接問い合わせをすることで,GUIからはできない解析を行うことができます.Elasticsearchには多くの集約関数や自然言語処理関数があり,それらを援用してトラフィック解析を行えます.もちろん,Jupyterを利用せず,通常のPythonスクリプトからElasticsearchにクエリを発行しても大丈夫です.

Jupyterを起動する

Jupyter notebook / Jupyterlabを起動します.今回の記事中に必要なライブラリを入れたDocker Imageを準備しましたので,よろしければお使いください. JUPYTER_ENABLE_LAB=yes はJupyterlabを起動する設定です.
Dockerfile

docker run -d --name jupyternotebook -p 8888:8888 --network pcap-analysis -e JUPYTER_ENABLE_LAB=yes -e NB_UID=<UID> -e NB_GID=<GID> -v $(pwd):/home/jovyan/work:rw shunkin/jupyterlab_docker:latest

UIDとGIDは,mountするディレクトリ(このコマンドの場合はpwdです)に応じて設定してください.名前解決のため,前回の記事で作成した pcap-analysis networkに入れています.

Dockerを用いない場合は,pip install elasticsearch jupyterし, jupyter notebook でJupyterを起動させてください.

Molochの生成したDatabaseにPythonからクエリを発行する

http://<動かしているマシンのIP>:8888 

標準では上のポートで起動するはずなので,ブラウザからJupyterを開きnotebookを作成し,以下のようなクエリを書き込みます.

こちらのように直接クエリを書く方法に加えて,ElasticsearchライブラリのPython DSLを利用してクエリビルディングすることもできます.

クエリの説明

上記のクエリを通じて,私がよく使っている集約関数を説明します.

最初にsizeと対象としたいindexを指定します.このクエリでは集約結果のみ取得したいため,sizeは0としました.index名は自分が解析したいパケットについているタイムスタンプをもとに指定します.Molochは解析結果を index="sessions2-YYMMDD"のパターンにより保存します.

次に, filter機能を使用して対象としたいトラフィックを絞っていきます. filter > bool > mustクエリ内で tags-termによってタグを指定し,望んだタグを持っている Sessionのみをクエリ対象にします.こうすることで,同一の期間に複数の分析対象が存在する場合にも個別に分析を進めることができます.filter > bool > should 内では,一般にHTTP/HTTPSが使用するポート番号を指定し,対象としたいトラフィックを抽出しています.

最後に, aggs クエリにより集約していきます. "agg_terms_dstIP" で集約に名前をつけ, field にて集約するために利用するフィールドを指定します.ここでは,デスティネーションIPアドレスをもとに集約しています.

まとめると,”2018/10/16にキャプチャされた中のHTTPあるいはHTTPSのセッションを宛先IPアドレスごとに集約”しているクエリとなります. response にはクエリの実行結果がhashとして入っていて, response["aggregations"]["agg_terms_dstIp"] のように,集約結果を確認することができます.

応用

ElasticSearch Headを用いてフィールドを確認

今回はデスティネーションIPアドレスを使って集約をしてみましたが,他のフィールドについても同様のことができます.Molochの抽出するフィールドにどのようなものがあるかは,ElasticSearch Headなどを利用して確認できるので,組み合わせることで柔軟にパケットキャプチャデータベースを操作することが可能です.

Wiresharkのフィルタや,tcpdumpのフィルタのような機能だけでなく,条件に応じた集約や集計ができることが今回ご紹介した方法の利点だと思います.スクリプトを書き換えるたびに長い間待たされていた生活とは決別だぜ!ということで便利で快適なパケット解析ライフをお送りください.

References: