SolitonNKとZeekを使ってネットワーク監視してみよう

前回の記事、「[SolitonNKでgrokが使えるようになったぞ](https://qiita.com/kakawai/items/9988e952ecdaa1c887de)」で、[all.grok](https://raw.githubusercontent.com/gravwell/resources/master/grok/all.grok)にhttp.log、dns.log、conn.log、files.logを扱う抽出パターンがあると書きました。これらが登録されているということは、SolitonNKでネットワーク監視ができるに違いないと、調べてみたのが今回の記事です。

all.grokを見ると、ネットワーク解析のための抽出パターンと思われるものは、BRO_HTTP、BRO_DNS、BRO_CONN、BRO_FILESなど、全て "BRO"で始まるワードで登録されています。"BRO"とはなんでしょうね……？

実は、もともと "BRO" が意味していたのは、 bro という名前のオープンソースのネットワーク監視ソフトだったのです。bro は今では、名前を [Zeek](https://www.zeek.org/) と変えていますが、機能やライセンスは変わりません。Zeek を使ってネットワーク監視して収集した情報を、grok の "BRO～" という抽出パターンで解析対象の情報を抽出できるはずです。

SolitonNKには、この [Zeek が、インジェスターとして整えられています](https://hub.docker.com/r/gravwell/zeek)。早速これを使ってみましょう。

ZeekとSolitonNKが用いられる典型的なネットワーク構成は、次の図のようになります。ネットワークに流れるパケットデータは、NPB、SPAN、あるいはTAPなどの専用デバイスによって取り出され、Zeekによる強力な処理によってSolitonNKのIndexer群に送出されます。Zeekは広帯域のネットワークデータを蓄積処理する上でNetflowやPcapより有利なシステムであることから、基幹ネットワークのデータ解析用によく用いられます。SolitonNKは、Indexerや、そのストレージ（Well）を容易に増強できるので、基幹ネットワークを広帯域で流れるデータを全て蓄積して解析するのに向いています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480441/09aabd65-d545-1278-4b18-461b4940f7e9.png)



Zeekを利用するのは、他のインジェスターと同様、docker runでコンテナ起動することができます。なお、Zeekはlinuxホスト上でないと利用できないので注意してください。Zeek はインターネット幹線の監視にもよく用いられるパワフルなネットワーク監視ツールですが、取り扱われるデータ量は膨大になりますから、ハンドリングするために必要な記憶容量やそのコストには気を付けてください。

Zeekは、起動時に設定する環境変数に従って、監視するインターフェイスと、データ取り込み時のBPFフィルター（オプション）が設定されます。

監視インターフェースは、INTERFACE という環境変数によって指定されます。INTERFACE に設定がなされていないデフォルトの場合は、eth0 を監視します。オプションのBPFフィルターは、FILTER という環境変数によって指定されます。Gravwellのingesterがログ保持を管理し、Zeekのログファイルは15分ごとに更新されます。

ホストのeno1インターフェースについて、ポート番号443に関するトラフィックだけ全て無視して監視するようZeekを設定して起動し、Gravwell ingesterに、IngestSecretsを設定して、192.168.1.1と192.168.1.2の2つのインデクサーにデータを送信するように設定するには次のようにdocker runの環境変数を指定します。

	docker run -d --name zeek --net host \
	    -e GRAVWELL_CLEARTEXT_TARGETS="192.168.1.1,192.168.1.2" \
	    -e GRAVWELL_INGEST_SECRET="IngestSecrets" \
	    -e INTERFACE="eno1" \
	    -e FILTER="not port 443" \
	    gravwell/zeek:latest

さぁここで、grok.allの各種"BRO_～"抽出パターンを使って……、と思ったら、もっと便利なものが用意されていました。

Zeekからの自動抽出用の拡張モジュール [zeek.ax](https://github.com/gravwell/autoextractors/blob/master/zeek/zeek.ax)を、/opt/gravwell/extractions に置いて用いると、conn、dhcp、dns、files、http、ssl、weirdに関するログが、それぞれzeekconn、zeekdhcp、zeekdns、zeekfiles、zeekhttp、zeekssl、zeekweirdというタグを付して自動抽出されるのです。（当初の目論見だったgrok.allに登録されてる抽出パターン、出番ありませんでした。）

ここまで来ればあとは解析・可視化するだけです。例えば、コントロールパネルにこんなクエリを入れてみましょう。

	tag=zeekhttp ax HTTP user_agent!="-" |
	regex -e user_agent "^\S+\s\((?P<OS>[^\;)]+)[^\)]+\)" |
	count by OS | chart count by OS

監視しているネットワークのhttpリクエスト中に含まれるユーザーエージェント情報から、クライアントOSを判別したものがチャート表示されます。 


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480441/d8f05b1d-9d04-a585-7b02-320096944630.png)


帯域管理したいのなら、こんなこともできます。

	tag=zeekconn ax Conn service!="-" resp_bytes |
	sum resp_bytes by service | chart sum by service

どのサービスがどの程度の帯域を使ってるのかが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480441/049a4ad9-080e-ebab-46c1-f133c8ed98a1.png)



SolitonNKとZeekを使うことによって、ネットワーク解析ができることが分かると思います。なお、SolitonNKでネットワーク監視するには、上の図にも示したように、Netflowなどのインジェスターを使うやり方もあります。SolitonNKは柔軟性が高いシステムなので、細かい要求の違いに応じて色々なやり方ができるわけですね。Soliton NK について、今後も記事を追加していく予定です。Netflow Ingerster の使い方などは、機会を改めて紹介できたらと思っています。

Soliton NKを試したい人はの下の Soliton NK 公式サポートサイトでお申し込み下さい。

https://www.solitonnk.com/

です。