大規模環境向けパケット解析ツール「Moloch」を使ってみる
オープンソースのパケット監視ツールとしてはWiresharkが有名だが、常時パケットを収集して異常を検出する、といった用途にはWiresharkはあまり適していない。そこで今回は、大規模なネットワークパケット監視向けに開発されているパケット収集・分析ツール「Moloch」を紹介する。
常時パケットをキャプチャして分析する用途に向いている「Moloch」
ソフトウェアが外部とどのような通信を行っているのかを調べたり、不正な通信が行われていないかといった調査を行ったりする際には、ネットワークに流れるパケットを取得・記録して分析できるパケットキャプチャツールが利用される。パケットキャプチャツールとして有名なものとしては、以前にも紹介したWiresharkやtcpdumpなどがある。
Wiresharkやtcpdumpは指定したネットワークインターフェイスが受信したパケットを表示したり保存したりできるツールで、パケット解析のための機能も豊富に備えているのだが、あまり長時間のパケット収集には向いていない。これらツールは取得したパケットをメモリに一時的に保存した後一定のタイミングでディスクに保存していくのだが、長時間のパケット収集を行うと使用するメモリ量やファイルサイズが大きくなってしまう。そうなるとデータの分析が大変になるほか、動作が不安定になるというトラブルもあるようだ。そのため、Wiresharkやtcpdumpを利用する場合は必要なときだけ起動し、また保存パケットをあらかじめ設定によってフィルタしておくといった工夫が必用となる。
今回紹介するMolochは、Wiresharkやtcpdumpとは異なり、サービスとして常時立ち上げておき、指定したネットワークインターフェイスを通過するすべてのトラフィックを記録するという動作を行うパケットキャプチャツールだ(図1)。
MolochはOath(米AOLや米Yahoo!を統合して2017年に設立された企業)によって開発されているオープンソースソフトウェアで、ライセンスはApache License 2.0となっている。
Molochでは、取得したデータはElasticsearchというデータベースに格納するようになっており、大規模なパケット監視にも利用できるスケーラビリティを備えている。取得したデータはWebブラウザ経由でアクセスできる「viewer」で閲覧・分析できるほか、外部ツールと連携するためのAPIも用意されている。また、Wiresharkなどで使われるPCAP形式でのエクスポート機能もある。
Molochのドキュメントでは使用するハードウェア例が掲載されているが、これによるとパケット収集用に5台のHP Apollo 4200サーバー(メモリ64GB、ストレージ80TB)、Elasticsearch用に10台のHP DL380-G7(メモリ128GB、ストレージ6TB)という環境で8つのギガビットイーサネットワーク(平均通信量は毎秒5Gビット)のデータを7日間保存できるとされている。
こういった大規模環境での利用はハードウェアやクラスタの構成を考慮する必要があるため「誰もが容易に利用できる」とは言いにくいが、能力的には十分なポテンシャルがあると言える。ちなみにドキュメントのFAQでは、大規模環境向けのハードウェアとしては以下が推奨されている。
- メモリ:64~96GB
- キャプチャデータ保存用ストレージ:4TB以上のSATA HDDを20台以上
- CPU:6コア×2以上
また、中規模以上の環境であれば、ネットワークパケットを分配するネットワークパケットブローカーを利用することも推奨されている。
ただし、こういったハイスペックのハードウェアが必要となるのはあくまで中・大規模な環境で利用する場合だけで、小規模な環境であれば一般的なサーバーでも問題なく導入できる。設定用スクリプトなども用意されており、特にクラスタリングを利用しないのであればMolochやElasticsearchをインストールし、設定スクリプトを実行して指示に従って設定を行うだけで利用できるようになる。
Molochの構成
Molochのアーキテクチャについても見ていこう。Molochはネットワークパケットを取得する「capture」と、パケットを閲覧・分析するためのWebインターフェイスを提供する「viewer」の2つのコンポーネントがコアとなっている。また、前述のとおり取得したデータはElasticsearch(ES)に保存する。
そのほか、オプションで外部のファイルやネットワーク経由で取得したデータなどを取り込むための「WISE(With Intelligence See Everything)」というコンポーネントや、Molochクラスタを横断してデータを閲覧する「Parliament」というコンポーネントも用意されている。
具体的な構成例についてはドキュメントにまとめられているが、たとえばあるホストを通過するパケットの情報を取得したいというケースでは、そのホストにcaptureおよびviewer、Elasticsearchをインストールすれば良い。Elasticsearchを別のホストで稼動させることも可能だ。また、大規模な環境であれば複数台のホストにcaptureをインストールし、観測したいパケットをそれらに振り分ける、といった構成となる。
今回はシンプルな例として、1台のホストにcaptureおよびviewer、Elasticsearchをインストールする構成を紹介する。
Molochがサポートする環境
記事執筆現在、Molochがサポートする環境は下記となっている。
- CentOS 7
- Ubuntu 14.04、16.04
- FreeBSD 9、10.0
ただしFreeBSD 10.0環境ではwiseServiceが動作しないという問題があり、FreeBSD 10.3は現状ではサポートされていないという。また、CentOS 6やUbuntu 12.04についてはGCC 4.8を導入すればビルドが可能になるとのこと。
公式サイトのダウンロードページではCentOS 6/7およびUbuntu 14.04/16.04/18.04向けのコンパイル済みバイナリパッケージ(前者向けはRPM形式、後者向けはDEB形式)も提供されている。これらの環境では、このパッケージを利用すると良いだろう。
Molochのインストール
それでは、実際にMolochをインストールして利用する流れを紹介していこう。今回はUbuntu 16.04およびCentOS 7.5の2つの環境でテストを行っている。また、使用するMolochのバージョンは記事執筆時点の最新版である1.5.3だ。
Ubuntu環境の場合、パッケージのインストールは次のようにして行える。
↓依存するパッケージのインストール # apt install libwww-perl libjson-perl ethtool libyaml-dev ↓パッケージのダウンロード $ wget https://files.molo.ch/builds/ubuntu-16.04/moloch_1.5.3-1_amd64.deb ↓パッケージのインストール # dpkg -i moloch_1.5.3-1_amd64.deb (Reading database ... 140486 files and directories currently installed.) Preparing to unpack moloch_1.5.3-1_amd64.deb ... Unpacking moloch (1.5.3-1) ... Setting up moloch (1.5.3-1) ... READ /data/moloch/README.txt and RUN /data/moloch/bin/Configure
また、CentOS環境では次のようになる。
↓依存するパッケージのインストール # yum install perl-libwww-perl perl-JSON ethtool libyaml-devel wget ↓パッケージのダウンロード $ wget https://files.molo.ch/builds/centos-7/moloch-1.5.3-1.x86_64.rpm ↓パッケージのインストール # rpm -ivh moloch-1.5.3-1.x86_64.rpm 準備中... ########################################### [100%] 1:moloch ########################################### [100%] READ /data/moloch/README.txt and RUN /data/moloch/bin/Configure
どちらの場合も、インストールが完了すると「READ /data/moloch/README.txt and RUN /data/moloch/bin/Configure」というメッセージが表示される。/data/moloch/README.txtには初期設定手順が記載されているので、確認しておこう。また、「/data/moloch/bin/Configure」は初期設定スクリプトとなっている。初期設定にはElasticsearchが必要なので、この時点ではまだ実行しない。
Elasticsearchのインストール
Molochでは取得したデータをElasticsearchに格納する。ElasticsearchはMolochとは別のコンポーネントなので、別途インストールする必要がある。ディストリビューションによってはElasticsearchの公式パッケージが提供されている場合もあるが、バージョンが古いことがあるため注意したい。最新バージョンのElasticsearchを利用するためには、Elasticsearchのパッケージリポジトリからパッケージをインストールすることをおすすめする。
Elasticsearchのパッケージリポジトリを利用する手順はElasticseachのドキュメントページに記載されているが、Ubuntuの場合は次のようになる。
まず、Elasticsearchが提供するバイナリパッケージの署名を検証するためのGPG鍵をダウンロードし、apt-keyコマンドで登録する。鍵の登録前には、ダウンロードした鍵の指紋(fingerprint)がドキュメントに掲載されているもの(記事執筆時点では「4609 5ACC 8548 582C 1A26 99A9 D27D 666C D88E 42B4」)と一致することを念のため確認しておこう。
↓GPG鍵をダウンロードする $ wget https://artifacts.elastic.co/GPG-KEY-elasticsearch ↓鍵の指紋を確認する $ gpg --with-fingerprint GPG-KEY-elasticsearch pub 2048R/D88E42B4 2013-09-16 Elasticsearch (Elasticsearch Signing Key) <dev_ops@elasticsearch.org> Key fingerprint = 4609 5ACC 8548 582C 1A26 99A9 D27D 666C D88E 42B4 sub 2048R/60D31954 2013-09-16 ↓GPG鍵を追加する # apt-key add GPG-KEY-elasticsearch OK
また、ElasticsearchのリポジトリはHTTPSを使用しているので、HTTPSでのリポジトリアクセスを可能にする「apt-transport-https」パッケージのインストールも必要だ。
# apt install apt-transport-https
あとはリポジトリの設定ファイルを/etc/apt/sources.list.dディレクトリ以下に作成し、aptコマンドでelasticsearchパッケージをインストールすれば良い。
↓リポジトリ設定ファイルの作成 # echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" > /etc/apt/sources.list.d/elastic-6.x.list ↓パッケージのインストール # apt update # apt install elasticsearch ↓elasticsearchサービスの開始 # systemctl start elasticsearch
また、CentOSなどのRPMパッケージを利用する環境でも、基本的に同様の手順でインストールが行える。 まず、GPG鍵のダウンロードと登録を行う。
↓GPG鍵をダウンロードする $ wget https://artifacts.elastic.co/GPG-KEY-elasticsearch ↓鍵の指紋を確認する $ gpg --with-fingerprint GPG-KEY-elasticsearch pub 2048R/D88E42B4 2013-09-16 Elasticsearch (Elasticsearch Signing Key)フィンガー・プリント = 4609 5ACC 8548 582C 1A26 99A9 D27D 666C D88E 42B4 sub 2048R/60D31954 2013-09-16 ↓GPG鍵を追加する # rpm --import GPG-KEY-elasticsearch
続いて、リポジトリ設定ファイルを/etc/yum.repos.d/ディレクトリ以下に作成する。
↓リポジトリ設定ファイルの作成 # vi /etc/yum.repos.d/elasticsearch.repo
このファイルの中身は次のようになる。
[elasticsearch-6.x] name=Elasticsearch repository for 6.x packages baseurl=https://artifacts.elastic.co/packages/6.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md
最後に、yumコマンドでelasticsearchパッケージをインストールする。なお、Elasticsearchの利用にはJava実行環境が必要なので、必要に応じてインストールしておく必要がある。
↓パッケージのインストール # yum install java elasticsearch ↓elasticsearchサービスの開始 # systemctl start elasticsearch
Molochの初期設定
Elasticsearchのインストールが完了したら、続いてMolochの初期設定を実行する。手順としては/data/moloch/README.txtファイルに記載されているとおりで、具体的には次のようになる。
- /data/moloch/bin/Configureスクリプトを実行して初期設定を行う
- 「/data/moloch/db/db.pl http://<Elasticsearchを実行するホスト>:9200 init」コマンドを実行してデータベースを初期化する
- 「/data/moloch/bin/moloch_add_user.sh <ユーザー名> <コメント><パスワード> --admin」コマンドを実行してMolochのviewerのアカウントを作成する
- 「molochcapture」および「molochviewer」サービスを立ち上げる
まず、/data/moloch/bin/Configureスクリプトをroot権限で実行して設定の初期化処理を行う。ここではまずパケットキャプチャのターゲットとするネットワークインターフェイスを指定する。
# /data/moloch/bin/Configure Found interfaces: docker0;eth0;lo Semicolon ';' seperated list of interfaces to monitor [eth1] eth0
続いてElasticsearchをローカルにインストールするか尋ねられるので、「no」を選択する。この場合、Elasticsearchに接続するためのURLを指定する必要があるので、適切なものを入力する。
Install Elasticsearch server locally for demo, must have at least 3G of memory, NOT recommended for production use (yes or no) [no] no Elasticsearch server URL [http://localhost:9200] <ElasticsearchのURLを指定>
また、各種暗号化を行う際に使用するパスワードの設定も求められる。
Password to encrypt S2S and other things [no-default] <適当なパスワード>
アクセス元を分析するためのGEO設定ファイルのダウンロードについては、「yes」を選択しよう。
Download GEO files? (yes or no) [yes] yes Moloch - Downloading GEO files
以上で初期設定は完了だ。続いて、「/data/moloch/db/db.pl http://<Elasticsearchを実行するホスト>:9200 init」コマンドを実行してデータベースを初期化する。この処理は一般ユーザー権限で実行できる。たとえばlocalhostでelasticsearchを実行している場合、次のようになる。
$ /data/moloch/db/db.pl http://localhost:9200 init
次は「/data/moloch/bin/moloch_add_user.sh <ユーザー名> <コメント> <パスワード> --admin」コマンドを実行してviewer(Webコンソール)のアカウントを作成する。たとえばユーザー名として「admin」、コメントとして「admin user」を指定する場合次のようになる。
$ /data/moloch/bin/moloch_add_user.sh admin "admin user" <パスワード> --admin
最後に、「molochcapture」サービスを起動するとパケットのキャプチャが開始される。また、「molochviewer」サービスを起動するとviewer(Webコンソール)が利用できるようになる。
# systemctl start molochcapture # systemctl start molochviewer もしくは # /sbin/start molochcapture # /sbin/start molochviewer
なお、viewerはデフォルトでは8005番ポートで待ち受けを行うようになっている。このポートにWebブラウザからアクセスできるよう、Firewallなどの設定を行っておこう。また、ログは/data/moloch/logs/ディレクトリ以下に格納される。
MolochのWebコンソールにアクセスする
Molochのviewerの起動後、Webブラウザで8005番ポートにアクセスすることで、取得したパケットなどの情報を閲覧できるviewerにアクセスできる(図2)。
「Sessions」画面では取得した通信内容が一覧表示されており、リスト左端の「+」をクリックするとその詳細を確認できる(図3)。
この画面では、Wiresharkのように実際の通信内容のダンプも確認できる(図4)。
「SPI View」画面では通信内容ごとにセッションを検索できる画面だ(図5)。たとえば通信プロトコルや通信中にやり取りされた特定のヘッダなどをキーとして通信セッションを検索できる。
「SPI Graph」では、通信内容ごとの統計情報をグラフで閲覧できる(図6)。
「Connections」では、パケットの送信先・送信元情報をグラフ表示できる(図7)
当然ながら安定して長時間のパケット収集が可能
さて、実際にインターネットに接続されたテストサーバーにMolochをインストールしてパケットの収集を試したが、当然ながら特に問題は発生せずに通信パケットの収集が行えた。viewerのより詳しい機能紹介や、パケット分析の流れについては次回記事で紹介する予定だ。
注意点だが、Elasticsearchはサービスを起動させているだけでもデフォルトでは数百MBのメモリを使用する。昨今のサーバーでは問題ないだろうが、メモリが少ないVPSなどでは問題が発生する可能性がある。そういった環境では、Elasticsearchを別ホストで動かすといった対策が必要だろう。その場合、パケット収集対象ではないネットワークインターフェイスをElasticsearchとの通信に使用するよう構成には注意が必要だ。