Molochはネットワークを流れるパケットをすべてキャプチャし、統計できる解析ソフトだ。公式サイトによると、ラージスケール対応で、オープンソースで、パケットをインデックスしサーチできる、とある。これはなかなか面白そうなので、ちょっと試してみることにした。
ちなみに自分はMolochと聞くと、NetHackのGehennomで祭られる邪神を連想してしまい、とても心穏やかではいられない。FAQを読んでみたが、なぜMolochなのか、なぜフクロウなのかは分からなかった。
サーバのスペック
Molochの公式サイトには、キャプチャマシンとElasticsearchマシンのそれぞれについて、ストレージのサイズを概算する計算機がある。
ご覧になると分かるが、個人が自宅で用意するような単位ではない。データセンターとかITサービスにMolochを導入検討されているのであれば、こちらで計算するのがよいと思うが、通常の宅内LAN環境ではあまり参考にならない。
また、サーバスペックについてはFAQに説明がある。
これも本気の検討に対する回答で、自宅で試すようなスペックには見えない。具体的には、20ドライブぐらいは入る2~4Uファクタのサーバで、メモリは64~96GB、RAID1で構成されたストレージ(SSDだとなお良し)、CPUは2×6コア以上が理想的、だそうだ。
本稿を書くにあたっては、クラウド上のVMと自宅の非力なルータマシンにインストールした程度で、なんとなく動いているということしか確認していない。その程度の検証しかしていない、という点をご了承いただきたい。
Elasticsearch7のインストール
以下のElasticsearchのインストール手順はローカルのMolochとの連携しか考慮していないので、セキュリティ設定が甘めになっていることに注意してほしい。本来ならばパスワード認証をきちんとしておくべきである(認証なしでElasticsearchを立ち上げ、データを抜かれるトラブルが絶えないので一応警告しておく)。サーバの不要なポートは塞いでおくのが現代の常識だ。どうしてそうすべきかは、Molochの利用の節を読むと分かる。
さて、まずElasticsearchのリポジトリを用意する。
cat <<EOL >/etc/yum.repos.d/elasticsearch.repo
[elasticsearch-7.x]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOL
こうしておいて、PGP Keyをインポートし、dnf install
する。
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
dnf install java-1.8.0-openjdk elasticsearch
次に設定ファイルを書く。まず/etc/elasticsearch/elasticsearch.yml
だ。
cluster.name: クラスタ名
node.name: ノード名
network.host: localhost
もうひとつ設定ファイル/etc/elasticsearch/jvm.options
を確認する。サーバのメモリ容量に応じて、下記の部分を調整する。
-Xms3g
-Xmx3g
設定ファイルができたら、Elasticsearchを起動する
systemctl enable elasticsearch
systemctl start elasticsearch
Molochのインストール
さてMolochのインストールだが、なんだか公式サイトのインストラクションが変なのだ。GitHubのREADME.txtにリンクが張ってあるのだが、肝心のところは「パッケージをインストールせよ」としか書いてない。とりあえず手探りで編み出した手順はこうだ。
CentOS8にはバイナリパッケージがあるのでこれをダウンロードする。Downloadページからリンクをたどると、適切なリンクにたどり着けると思う。一応明示しておこう。
対象サーバで直接ゲットしたいときは、リンクをコピーしておいてwgetする。素のCentOS8にインストールしようとすると、依存関係チェックで怒られる。
[root@moloch ~]# wget https://s3.amazonaws.com/files.molo.ch/builds/centos-8/moloch-2.2.3-1.x86_64.rpm
[root@moloch ~]# rpm -i moloch-2.2.3-1.x86_64.rpm
error: Failed dependencies:
libyaml-devel is needed by moloch-2.2.3-1.x86_64
perl-JSON is needed by moloch-2.2.3-1.x86_64
perl-LWP-Protocol-https is needed by moloch-2.2.3-1.x86_64
perl-libwww-perl is needed by moloch-2.2.3-1.x86_64
perlのモジュールは簡単にインストールできる。
dnf install perl-{JSON,LWP-Protocol-https,libwww-perl}
だがlibyaml-devel
はCentOS8のbaseライブラリには入っていない。ググってみたところ、いろいろあってCentOS8には入らなかったらしい。これを無理やり用意するより無視したほうが早そうなので、ほかにエラーがないことを確認してから依存チェックを無視してインストールしてしまうことにする。
[root@moloch ~]# rpm -i moloch-2.2.3-1.x86_64.rpm
error: Failed dependencies:
libyaml-devel is needed by moloch-2.2.3-1.x86_64
[root@moloch ~]# rpm -i --nodeps moloch-2.2.3-1.x86_64.rpm
READ /data/moloch/README.txt and RUN /data/moloch/bin/Configure
次に指示に従って/data/moloch/bin/Configure
を実行する。これはインタラクティブな設定プログラムで、README.txtには「一度だけ実行すること」と書いてある(2度実行するとどうなるか怖くて試していない)。
[root@moloch moloch]# /data/moloch/bin/Configure
Found interfaces: eth0;lo
Semicolon ';' seperated list of interfaces to monitor [eth1] eth0
Install Elasticsearch server locally for demo, must have at least 3G of memory, NOT recommended for production use (yes or no) [no]
Elasticsearch server URL [http://localhost:9200]
Password to encrypt S2S and other things [no-default] no-default
Moloch - Creating configuration files
Installing systemd start files, use systemctl
Moloch - Installing /etc/logrotate.d/moloch to rotate files after 7 days
Moloch - Installing /etc/security/limits.d/99-moloch.conf to make core and memlock unlimited
Download GEO files? (yes or no) [yes]
:
:
:
- 最初にモニタするインターフェース名を聞かれる。インターフェースを自動検知してくれているにもかかわらず、それをデフォルトで用意してくれない不親切設計なので、手で入力しなければならない。複数のインターフェースを指定するときはセミコロンでつなぐ。面倒な向きはコピペをお勧めする
- Elasticsearchをどうするか聞かれるが、no(空リターン)でよい
- ElasticsearchのURLを聞かれるが、これもデフォルト(空リターン)でよい
- パスワードがどうとか聞かれるのでデフォルト…と思うのだが、空リターンを押しても進めない。
no-default
と入力しないと次に進めない - 最後にGEOファイルをダウンロードするかと聞かれる。これは空リターンでよい
- あとは一気に設定が完了する
画面には「設定は終わったからステップ4から続きをやってね」と出る。README.txtのステップ4は、Elasticsearchの起動だが、これはもう終わっているのでスキップだ。
次にやるのはMolochの設定をElasticsearchに入れることだ。初回のインストールなので次のように入力する。
[root@moloch ~]# /data/moloch/db/db.pl http://localhost:9200 init
It is STRONGLY recommended that you stop ALL moloch captures and viewers before proceeding. Use 'db.pl http://localhost:9200 backup' to backup db first.
There is 1 elastic search data node, if you expect more please fix first before proceeding.
This is a fresh Moloch install
Erasing
Creating
Finished
データベースの初期化が終わったら、管理者ユーザを作成する。書式はこんな感じ。
[root@moloch ~]# /data/moloch/bin/moloch_add_user.sh USERNAME "Admin User" PASSWORD --admin
Added
これで準備は整ったので起動する。
systemctl enable moloch{capture,viewer}
systemctl start moloch{capture,viewer}
ちなみにログは/data/moloch/logs
ディレクトリに出力されるので留意されたい。一応logrotateの設定はしてくれているので問題はなさそうだが。
アクセス前にポートに穴をあけておく。手っ取り早く8005番ポートを開けるならこんな感じ。
firewall-cmd --permanent --add-port 8005/tcp
firewall-cmd --reload
http://サーバのIPアドレス:8005 にアクセスすると、先ほど指定したUSERNAMEとPASSWORDでBasic認証される。
うまくいけば、Molochのコントロールパネルにアクセスできるはずだ。
これでインストールは完了だ。
MolochのHTTPS化
Moloch viewerはWebアプリなので、ブラウザで見る場合はHTTPS化しておきたい。MolochのHTTPS化は簡単で、たとえばLet’s Encryptで取得した証明書を利用する場合は、/data/moloch/etc/config.ini
に次のようにcertとkeyファイルを指定する。
certFile=/etc/letsencrypt/live/moloch.example.jp/cert.pem
keyFile=/etc/letsencrypt/live/moloch.example.jp/privkey.pem
こうしておいて、viewerを再起動する。
systemctl restart molochviewer
起動出来たら、https://サーバのIPアドレス:8005にアクセスすればよい。
Molochの利用
基本的な利用方法は、こちらの記事が詳しいのでぜひ読んでほしい。
Molochは機能が豊富で、どこから見たらいいのかとっつきづらいが、お勧めはSPIViewではないかと思う。最初、generalが選択状態になっているので[-]ボタンを押して消してしまえば見やすくなる。こんな画面になるはずだ。
このサーバにはMolochしかインストールしていないのにHTTPパケットが飛び交っている。むろんMolochのコンパネアクセスはHTTPだが、ちょっと気になるので見てみよう。これを詳細化するためにクリックするとドロップメニューが出てくる。
するとSearchバーに自動的に検索文字列が入るので、ここでSessionsボタンをクリックするとセッション画面に移動できる。
最近のセッションから表示しているので、このグラフを見ている自分のセッションが一覧表示されているのが分かる。そこでこれをフィルタする。これは簡単でSearchルールに「&& ip.src == 自分のIPアドレス」を追記すればよい。Molochでは画面から自分のIPアドレスをクリックしてルールをすぐに追加できるので簡単だ。もうひとつ、dnf/yumがHTTPで更新チェックするのでこれもフィルタする。するとこんなアクセスが残る。
攻撃者IPアドレスには心当たりがないので、今度はこれをキーにしてセッション全体を検索する。実はこれも簡単で、攻撃者IPアドレスをクリックして「new sessions tab」を選択するだけでよい。
すると、5日間に渡って様々なポート番号に対し、ポートスキャンしていることが分かる。実のところ、グローバルIPアドレスでサーバを運用すると、こういうポートスキャンは日常的に襲来する。不要なポートは開けないようにする、開けているポートはきちんとセキュアにする必要がある、その理由はこれだ。
先ほどの8005番ポート(Moloch)のアクセスをブレイクダウンしてみよう。見てみると8005番ポートへのアクセスは2回ある。最初のセッションはこうだ。
SYNパケットのみを投げてきている。典型的なポートスキャンのようだ。で、このように返事をしてしまうと、次に攻撃パケットを投げてくる。
ただ、投げられたパケットは内容が謎で、Molochには理解できなかったようだ。
さて他にポートスキャンに成功したケースはあったのだろうか。これを検索するには、パケット数が一定数を超えたセッションを検出すればよいだろう。ルールに「&& packets >= 3」と追加すれば簡単にリストアップできる。
該当サーバでは8005番ポートのほか、SSHポートが空いているのでこういう結果になった。この攻撃者の狡猾なところは、空いているポートがあるからといって連続でやたらめったら攻撃してこないということだ。ポートスキャンにしても、5分~15分ぐらいのランダムな時間間隔で投げてくるし、SSHのトライも1度失敗したら2度目は長い時間を空けてくるのでfail2banではbanされないしで、こちらも長い期間logを取って統計的に調べないと攻撃されていると分からないようにしているのだ。
というようなことが簡単に検出できるので、Molochは面白いツールだ。
Molochのメンテナンス
さて気になるのはMolochの負荷がどれぐらいのものか、だ。Molochのcaptureはトラフィックがなければ大した負荷ではないが、トラフィックが増えるとCAPファイルの書き込みが増え、I/O処理が増え、いろいろ負荷が増大して加速度的に状況が悪化する。なのであまり非力なマシンに「ルータ兼capture兼viewer兼Zabbix proxy」なんてことをやらせると痛い目にあうのでやめた方がいい、かもしれない(しかし他に選択肢がないのでしばらくこれで運用する予定)。
もうひとつ気になるのはPCAPファイルの容量の問題だ。FAQ – PCAP Deletionによれば、ディスク容量の5%を切ると削除ルーチンが走ると書いてある。そしてその値はfreespageGで調整できるそうだ。ただどのタイミングでこれが実行されるのかは明記されていなかった。個々のPCAPファイルのサイズはmaxFileSizeGで指定できる。このパラメータのデフォルト値は(ドキュメントでは)4GBなのだが、配布されているパッケージのデフォルト値(あるいは今回のインストール結果)ではなぜかこの値が12に設定されていた(こういうことをされると、全部のパラメータを突き合せないといけなくなるので困る)。以上から想像される動作はおそらく、PCAPのローテートのタイミングで古いPCAPを削除するかどうかを判定するのだろう。ということはかなり潤沢なストレージを用意しておかないと、disk fullになってしまうだろうということだ。
そのほか多数の設定パラメータが用意されているので、きめ細かく調整していく必要がありそうだ。