Skip to content

Instantly share code, notes, and snippets.

@shunkino
Last active November 3, 2018 23:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shunkino/65daf966ff7c5489db0faed07ce68d72 to your computer and use it in GitHub Desktop.
Save shunkino/65daf966ff7c5489db0faed07ce68d72 to your computer and use it in GitHub Desktop.
Hands-on for RAM

About

11/3に行うRAMにて実施するTutorialです.

Index

全体の流れは以下に示すとおりです.

  • Dockerを使ってElasticsearch
  • Dockerを使ってMoloch
  • Molochでpcapを解析
  • 解析結果を眺める
  • (できたら) Molochの解析結果をjupyterから解析
  • (できたら) Elasticsearchの機能を使って自然言語処理

Dockerを使って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を立てる

  1. つよものこーす
  2. よわものこーす

オプションを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 imagepullが走るので,しばらく待ちましょう.

次に,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

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を解析

さていよいよ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ファイルをダウンロードしたデータが入っているので,それを試しに見てみましょう.

  1. Sessionsのタブをクリック
  2. 時間の感覚を適宜調整
  3. 中段のSessionを展開
  4. バーっと文字が出てくるはず.ぽちぽちする.

続いて,Fileを抽出してみます.

Molochの解析結果をjupyterから解析

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を使って自然言語処理

本題からはずれますが,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を監視する

Elasticsearchを監視するには,上で使ったdocker-compseでも一緒に起動させたKibanaを利用することが一般的です.上記チュートリアルを実行したあとであれば,5601番ポートを見ることでKibanaにアクセスできます.ここから,クラスタやindicesの状況を解析したり,クエリ発行,Visualizeなど多くの機能を利用できます.

Kibanaはかなり便利ですが,indexがどのように保持されているかなどを一覧したいときに多少不便です. そこで,ElasticSearch HeadというChrome拡張を利用することをおすすめします.

いくつか機能がありますが,indexのテーブル構造を見る機能は非常に便利です.

Dockerいれる

sudo groupadd docker
sudo usermod -a -G docker [username]

Performance

https://github.com/aol/moloch/wiki/FAQ#what-kind-of-packet-capture-speeds-can-moloch-capture-handle

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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment