11/3に行うRAMにて実施するTutorialです.
全体の流れは以下に示すとおりです.
- Dockerを使ってElasticsearch
- Dockerを使ってMoloch
- Molochでpcapを解析
- 解析結果を眺める
- (できたら) Molochの解析結果をjupyterから解析
- (できたら) Elasticsearchの機能を使って自然言語処理
Linuxカーネルを持つOS上でDockerとdocker-composeコマンドが動作するようにしてください.自分の環境は
Distribution: CentOS Linux release 7.5.1804 (Core)
Kernel: 4.16.12-1.el7.elrepo.x86_64
Docker Server:
Engine:
Version: 18.06.0-ce
API version: 1.38 (minimum version 1.12)
Go version: go1.10.3
Git commit: 0ffa825
Built: Wed Jul 18 19:10:42 2018
OS/Arch: linux/amd64
Experimental: false
OSの設定をちょっと変えます.
sudo sysctl -w vm.max_map_count=262144
Elasticsearchのバージョンは6.4.2
を使っていきます.
## Elasticsearchを立てる
- つよものこーす
- よわものこーす
オプションを2個用意しました.どっちでもいいです.メモリが8GBより少ない人はよわものになってください
docker network create pcap-analysis
を実行して今回の環境のためにpcap-analysis
という仮想network
をdocker内に作ります.
厳密にはLinuxの機能を使ってNAT付き仮想Routerが作られます.
あなたはつよものですね!
このコースではDocker-composeを利用して,Elasticsearchのクラスタを構築します.
とりあえず,Google Driveからzipをダウンロードしてきて,任意のディレクトリに展開してください.
展開したら,bash makeDirectory.sh
とかやってmakeDirecotry.sh
を実行してください.
一応中身は下な感じです.
https://gist.github.com/shunkino/88ba16c4db5bcee50cf41921733f2faa 暗黙的にDockerでマウント用のvolumeを作成すると,Docker-containerを破棄する際にデータも一緒に死んでしまったりDBとしては好ましくない結果となるためdocker-compose.ymlの中で明示的にディレクトリを指定してvolumeを設定しています.
続いて
docker-compose up -d
します.
このとき,docker image
のpull
が走るので,しばらく待ちましょう.
次に,hostマシンからcurl localhost:9200/_cluster/health?pretty=true
とかdocker ps
なんかをして,elasticsearchのクラスタがちゃんと立ち上がっていることを確認します.
うまく行っていないときは,docker logs elasticsearch[1-4]
を使ってどのノードがコケてるかを確認します.
どのノードがコケているかわかったら,docker restart elasticsearch[コケているノードの番号]
で再起動してやります.
こうなってしまうのは,Primary node
が起きる前に他のノードが起きてしまったときにうまくクラスタを構築できない事に起因します.困っちゃいますががんばります.
当日はつまったら聞いてください.もしくはよわものこーすへ.
よわもの!こちらのコースではとにかく簡単にElasticsearchを構築します. 発行するコマンドはなんと一つ!
docker run -d --name elasticsearch -p 9200:9200 --network=pcap-analysis elasticsearch:6.4.2
こちらでは,volumeを明示的に指定していないため,docker containerを破棄するとDBの情報も消えちゃったりします.嫌な人は-v
オプションでなんとかしてね.
Dockerを使ってパケット解析プラットフォームであるMolochをインストールしていきます. 自分が用意したcontainerがあるので,それを実行します.
docker run -e MOLO_MODE="INIT" --name moloch -p 8005:8005 -d --network=pcap-analysis -v /path/to/host/pcapdir:/data/pcap:rw shunkin/moloch:latest
動作したら,
http://<動かしているマシンのIP>:8005
へアクセスして,Molochが動作していることを確認してください.
さていよいよMolochでpcapを解析できます. 皆さん解析したいpcapの一つや二つ持っているとは思いますが,今回はサンプルpcapも用意しているので,それを用いて説明していきます.
はじめに,以下のwget
を利用してサンプルpcapファイルをダウンロードしてきてください.余談ですがIPFS上にアップロードしてあります.
wget --no-use-server-timestamps -O sample.pcap https://gateway.ipfs.io/ipfs/QmTGMM3kevj9xQfTTej6kycvGXahCaLSb3GsyA4vXEP63d
ダウンロードが完了したら,
docker exec moloch capture -r /data/pcap/sample.pcap -t sample
を実行してください.-t
のあとは,解析結果につけるタグです.例えばプロジェクト名とかをつけるといいでしょう.
そうするとパケットの解析が始まりますので,終わるまで待ちます.
解析が終わったら,改めて
http://<動かしているマシンのIP>:8005
へアクセスします.認証を求められますが,ID: admin, Password: THEPASSWORD
なのでそれで入ってください.
そうしたらおそらくいい感じの画面に行くと思います.あとはポチポチして遊んでみてください.国別のトラフィックマップなどは見応えありますね.
一応,sample.pcapには二つのcsvファイルをダウンロードしたデータが入っているので,それを試しに見てみましょう.
- Sessionsのタブをクリック
- 時間の感覚を適宜調整
- 中段のSessionを展開
- バーっと文字が出てくるはず.ぽちぽちする.
続いて,Fileを抽出してみます.
Molochで解析したpcapの情報ですが,すべてElasticsearchへ格納されているため,DBへ直接問い合わせをすることで,GUIからはできない解析を行うことができます.例えば,Elasticsearchの強力な集約関数や自然言語処理関数が利用できます.IP subnet
で集約する機能など非常に重宝する機能が多くあります.
pip install elasticsearch
して.
jupyterを開きます.
ちなみに下の感じでやるとjupyterが一瞬(人間時間)で立ちます
docker run -d --rm -p 8888:8888 -e JUPYTER_ENABLE_LAB=yes -v /etc/group:/etc/group:ro -v /etc/passwd:/etc/passwd:ro -u $(id -u $USER):$(id -g $USER) -v /path/to/notbookdir:/home/jovyan/ jupyter/datascience-notebook:latest
jupyterを開いたら,適当にnotebookを開いて
from elasticsearch import Elasticsearch
es = Elasticsearch()
response = es.search(
index="sessions2-181016",
body={
"size": 0,
"query": {
"bool": {
"filter": {
"bool": {
"must": {
"term": {
"tags-term": "sample"
}
},
"should": [
{
"term": {
"p2": "80"
}
},
{
"term": {
"p2": "443"
}
}
]
}
}
}
},
"aggs": {
"agg_terms_srcIp": {
"terms": {
"field": "srcIP",
"size": 1000000
}
}
}
}
, request_timeout=100)
を実行します.このスクリプトにより,パケットに含まれるSrc IPごとのパケットの数を集計することができます.
本題からはずれますが,Elasticsearchは全文検索エンジンと言われるだけあって,自然言語処理系の機能が充実しています. 例えばシンプルにクエリを投げた場合でも,返ってくる値はscore順にソートされて返ってきます.(多分設定による)詳しくは以下の記事によくまとまっています.
https://qiita.com/r4-keisuke/items/d653d26b6fc8b7955c05
それでは,pcapに含まれる文字列を解析してみましょう. あんまりいい例が思い浮かばなかったのでこれで
GET sessions2-181016/_search
{
"query": {
"more_like_this" : {
"fields" : ["host.dns"],
"like" : "jp",
"max_query_terms" : 12
}
}
}
もっとそれっぽい例はこちらから.
Elasticsearchを監視するには,上で使ったdocker-compseでも一緒に起動させたKibanaを利用することが一般的です.上記チュートリアルを実行したあとであれば,5601番ポートを見ることでKibanaにアクセスできます.ここから,クラスタやindicesの状況を解析したり,クエリ発行,Visualizeなど多くの機能を利用できます.
Kibanaはかなり便利ですが,indexがどのように保持されているかなどを一覧したいときに多少不便です. そこで,ElasticSearch HeadというChrome拡張を利用することをおすすめします.
いくつか機能がありますが,indexのテーブル構造を見る機能は非常に便利です.
sudo groupadd docker
sudo usermod -a -G docker [username]
What kind of packet capture speeds can moloch-capture handle?
Moloch allows multiple threads to be used to process the packets. On simple commodity hardware, it is easy to get 3Gbps or more, depending on the number of CPUs available to Moloch and what else the machine is doing. Many times the limiting factor can be the speed of the disks and RAID system. See Architecture and Multiple-Host-HOWTO for more information.