ちょっと話題の記事

SORACOM Air SIMのトラフィックをSORACOM Junction + Moloch + Amazon ESで可視化する

2019.02.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ども、ゲストの大瀧です。
IoT機器の通信についての議論が最近活発であり、実際に機器がどのような通信をしているかをまるっとモニタしたいというニーズの高まりを感じています。 IoT向けの通信プラットフォームであるSORACOM Air forセルラーSORACOM Junctionミラーリングというトラフィックをミラーリングするサービスと組み合わせることで、このニーズに応えることができます。ただ、非エンジニアがミラー&カプセル化したトラフィックを取り扱うのはハードルが高いので、今回はスケーラブルなOSSパケットモニタ&ビューワであるMolochとAWSのマネージドサービスAmazon Elasticsearch Serviceを組み合わせトラフィックをWeb画面で可視化する構成をご紹介します。

SORACOM Junctionとは

SORACOM JunctionはSORACOM Air SIMによる3G/LTE通信のトラフィックに様々なネットワーク処理を施すサービスです。Junctionミラーリングは、トラフィックの複製をGREでカプセル化し指定したIPアドレス宛に送付する機能を持ちます。送付されるトラフィックには暗号化が施されないため、SORACOMの閉域サービスなどセキュアな経路で到達する宛先IPアドレスが推奨です。今回はVPCピアリング接続と併用する閉域サービスであるSORACOM Canalを用いてEC2インスタンス宛てに送信しました。

Junctionミラーリングの設定手順は、以下のドキュメントを参照してください。

本記事では、手順「tcpdumpでコピーされたGREパケットを確認する」まで完了した環境と仮定します。

Molochとは

MolochはAOL(現Oath)が開発するオープンソースのパケットキャプチャソフトウェアです。スケーラブルな構成が特徴で、キャプチャを担当するMoloch CaptureとWiresharkライクなWeb画面を提供するMoloch Vierwerから成り、Elasticsearchにキャプチャデータを保存してそれぞれのノードから利用します。

Captureはtcpdumpと同様に実行するホストのネットワークインターフェースをリアルタイムにキャプチャするほか、既存のpcapファイルを読み込むこともできます。Viewerはキャプチャデータの時系列検索はもとより、プロトコルやIPアドレスによる絞り込み検索、位置情報との組み合わせなど多彩な画面が表示できます。Viewerの操作については、以下のブログが詳しいです。

スキーマを理解すれば、Moloch以外の任意のクライアントからESにクエリしキャプチャデータを検索・分析することも可能です。以下のブログが参考になります。

Amazon Elasticsearch Service(ES)を組み合わせるメリット

MolochのバックエンドにAmazon ESを利用することでElasticsearchクラスタの運用を省力化できるので、より関心をMoloch自体の利用に集中できるメリットがあります。Elasticsearchのバージョンは、Molochのドキュメントを見る限りバージョン6.xであれば良さそうです。今回は6.4でクラスタを構築しましたが、今のところ特に不具合無く利用できています。

構築手順

今回は動作確認のために最小構成で試してみます。複数ホストで構成する場合は、以下のドキュメントを参照してください。

多くのデータをElasticsearchに保持する設計になっているようなので、コンフィグファイルの同期を意識すればELBなどと組み合わせたインスタンスの冗長構成もさほど手間無く組めそうですね。今回はCaptureとViewerを同一EC2インスタンスで実行し、ELBなしで構成します。

図中の黄色い○印については後述します。

1. Amazon ESの構成

Moloch特有の項目は特にありません。今回はデプロイタイプを「開発およびテスト」にしバージョン6.4で、最小のt2.small.elasticsearchインスタンス1ノードにしました。Molochの各コンポーネントから認証なしでアクセスできるよう、VPCに配置しドメインアクセスポリシーの設定から「IAM認証情報を使用した署名リクエストを要求しない」を選んでクラスタを作成します。セキュリティグループはVPC内からのTCP/443ポートを許可する形が良いでしょう。

クラスタ作成が完了しドメインのステータスが「アクティブ」になったら、VPCエンドポイントhttps://vpc-****.<リージョン名>.es.amazonaws.com/を控えておきます。

これでOKです。

2. EC2インスタンスの構成

続いてMolochを実行するEC2インスタンスを構成していきます。今回は以下のインスタンスを利用しました。

  • インスタンスタイプ : c5.large
  • AMI : Ubuntu Server 18.04(東京リージョンami-07ad4b1c3af1ea214)
  • セキュリティグループ : SORACOM Junctionのドキュメント記載の設定に加えて、Moloch Viewerのポート(8005/TCP)をInboundの許可ルールに追加する

Molochはパケットを紐解いて解析結果を出してくれる反面、解析できないパケットをデフォルトでは画面に表示してくれません *1。JunctionミラーリングのパケットはGREのTransparent Ethernet Bridging形式でありMolochがこれに対応していないので、Linux OS側でGRE Transparent Ethernet Bridging(gretap)のトンネルインターフェースを事前に定義しMolochはそのインターフェースを監視することで、通常のIPv4パケットとして扱うことができます。

GREトンネルのピアは、SORACOM VPGの[高度な設定]タブにある「VPGのGate Peer一覧 - トンネル接続用IPアドレス」で確認します。

項目名には「Gate」とありますが、SORACOM Gateを有効にするのは必須ではありません。

確認するとわかるとおりIPアドレスは2つあり両方からパケットが送付されるため、GREトンネルを2本張ることになります。この辺りは試行錯誤した記憶を以下の記事で書きました。

以下のファイルを新規で作成します。

/etc/systemd/network/ens5.network

[Network]
Tunnel=gretapA
Tunnel=gretapB

/etc/systemd/network/gretapA.netdev

[NetDev]
Name=gretapA
Kind=gretap

[Tunnel]
Remote=100.64.159.132 # ユーザーコンソールに表示されるIPアドレスに変更する

/etc/systemd/network/gretapA.netdev

[NetDev]
Name=gretapB
Kind=gretap

[Tunnel]
Remote=100.64.159.4   # ユーザーコンソールに表示されるIPアドレスに変更する

あとはSystemdの設定を読み込ませて動作を確認します。

$ sudo systemctl restart systemd-networkd
$ sudo tcpdump -i gretapA
(SIMを挿したデバイスで通信する操作を行い、いっぱい出てくるのを確認。出てこない場合はgretapBを試してみる)
06:05:01.674537 IP ip-10-0-233-188.ap-northeast-1.compute.internal.52331 > 100.127.0.53.domain: 63160+ A? e6858.dsce9.akamaiedge.net. (44)
06:05:01.692517 IP 100.127.0.53.domain > ip-10-0-233-188.ap-northeast-1.compute.internal.52331: 63160 1/0/0 A 104.92.70.187 (60)
  :
<Ctrl>+<C>

IPv4パケットとして見えていますね。これでOKです。

3. Molochのインストール

いよいよドキュメントに従い、Molochを動かします。まずは以下のようにインストールします。

  • Molochのバージョン : 1.7.1
$ sudo apt install libwww-perl libjson-perl libyaml-dev # 依存パッケージを事前にインストール
$ wget https://files.molo.ch/builds/ubuntu-18.04/moloch_1.7.1-1_amd64.deb
--2019-02-20 08:19:59--  https://files.molo.ch/builds/ubuntu-18.04/moloch_1.7.1-1_amd64.deb
Resolving files.molo.ch (files.molo.ch)... 143.204.83.90, 143.204.83.63, 143.204.83.46, ...
Connecting to files.molo.ch (files.molo.ch)|143.204.83.90|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 49645072 (47M) [application/x-debian-package]
Saving to: ‘moloch_1.7.1-1_amd64.deb’

moloch_1.7.1-1_amd64.deb      100%[===============================================>]  47.34M  17.1MB/s    in 2.8s

2019-02-20 08:20:03 (17.1 MB/s) - ‘moloch_1.7.1-1_amd64.deb’ saved [49645072/49645072]
$ sudo dpkg -i moloch_1.7.1-1_amd64.deb
(Reading database ... 263451 files and directories currently installed.)
Preparing to unpack moloch_1.7.1-1_amd64.deb ...
Unpacking moloch (1.7.1-1) over (1.7.1-1) ...
Setting up moloch (1.7.1-1) ...
READ /data/moloch/README.txt and RUN /data/moloch/bin/Configure

続いて、初期構成のスクリプトを実行します。監視するインターフェースをgretapA;gretapB、ElasticsearchをインストールせずにAmazon ESのエンドポイントをセットするのがポイントです。

$ sudo /data/moloch/bin/Configure
Found interfaces: ens5;gretapA;gretapB;lo
Semicolon ';' seperated list of interfaces to monitor [eth1] gretapA;gretapB
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] https://vpc-****.<リージョン名>.es.amazonaws.com
Password to encrypt S2S and other things [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] yes
Moloch - Downloading GEO files
  :(略)
Moloch - Configured - Now continue with step 4 in /data/moloch/README.txt

      /sbin/start elasticsearch # for upstart/Centos 6/Ubuntu 14.04
      systemctl start elasticsearch.service # for systemd/Centos 7/Ubuntu 16.04
 5) Initialize/Upgrade Elasticsearch Moloch configuration
  a) If this is the first install, or want to delete all data
      /data/moloch/db/db.pl http://ESHOST:9200 init
  b) If this is an update to moloch package
      /data/moloch/db/db.pl http://ESHOST:9200 upgrade
 6) Add an admin user if a new install or after an init
      /data/moloch/bin/moloch_add_user.sh admin "Admin User" THEPASSWORD --admin
 7) Start everything
   a) If using upstart (Centos 6 or sometimes Ubuntu 14.04):
      /sbin/start molochcapture
      /sbin/start molochviewer
   b) If using systemd (Centos 7 or Ubuntu 16.04 or sometimes Ubuntu 14.04)
      systemctl start molochcapture.service
      systemctl start molochviewer.service
 8) Look at log files for errors
      /data/moloch/logs/viewer.log
      /data/moloch/logs/capture.log
 9) Visit http://MOLOCHHOST:8005 with your favorite browser.
      user: admin
      password: THEPASSWORD from step #6

Any configuration changes can be made to /data/moloch/etc/config.ini
See https://github.com/aol/moloch/wiki/FAQ#moloch-is-not-working for issues

Additional information can be found at:
  * https://github.com/aol/moloch/wiki/FAQ
  * https://github.com/aol/moloch/wiki/Settings
$

Elasticsearchの初期化スクリプトを流します。

$ /data/moloch/db/db.pl https://vpc-****.<リージョン名>.es.amazonaws.com init
It is STRONGLY recommended that you stop ALL moloch captures and viewers before proceeding.  Use 'db.pl https://vpc-moloch-db-i7ddavgsyrmg4bxiu47y7zarc4.ap-northeast-1.es.amazonaws.com 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

Viewerの初期管理者ユーザー(admin)を追加します。

$ /data/moloch/bin/moloch_add_user.sh admin "Admin User" <パスワードを入力> --admin
Added
$

Capture、Viewerそれぞれのサービスを起動し、次回再起動時も有効にします。

$ sudo systemctl start molochcapture.service
$ sudo systemctl start molochviewer.service
$ sudo systemctl enable molochcapture.service
$ sudo systemctl enable molochviewer.service

これでOKです。

動作確認

Webブラウザでhttp://<EC2インスタンスのグローバルIP:8005>にアクセスし、管理者ユーザーでログインすると...

SIMをセットしたデバイスのトラフィックの様子が表示されました!(今回はiPadのWebブラウザでapple.comにアクセスしてみました)

まとめ

SIMのトラフィックの複製を提供するSORACOM Junctionとそれを表示するOSSのキャプチャソフトウェアMoloch、バックエンドとしてマネージドサービスのAmazon ESを組み合わせてIoT機器の通信内容を記録・確認する仕組みを作ってみました。通信事業者はユーザーの同意なしに内容を把握することはありませんが、ユーザーが自身で内容を把握するための手段として有用かなと思います。

通信の多いIoT機器や利用する台数が増えてくるとEC2やAmazon ESの性能が足りなくなってくると思いますし、単一ノード構成ですと障害で止まる可能性もあるので冗長構成も併せて検証してみたいと思います。

SORACOM Junctionの詳細については

SORACOM Junctionの機能詳細について、今度発売されるSORACOMの公式ガイドブックにサービス開発者自ら筆をとった解説があります。ぜひ手に取ってみてください。

脚注

  1. 表示できる方法を知っている方はぜひSNSやコメントで教えてください!