ソラコムBeamでUDP通信機器の暗号化を実装
要約
- ソラコムBeamを使用すると、UDP通信をHTTPリクエストに変換してくれる。
- 端末側の対応不要で通信セキュリティを確保できる。
- コストについてはケースに応じて比較検討を要する。
エンジニアの佐藤です。今回はソラコムBeamのお話をさせていただきたいと思います。
「モノのインターネット(IoT)」なる案件を手掛けたときに筆者が発見したのは、「デバイスよ、お前はなんて貧弱なんだ。」という事実です。「なんとかドラゴン」だの「スカイレーク」だの言われているスマホやパソコンと異なり、ほんのわずかなリソースしかない。
こんな時に光ってくるのがUDPプロトコルです。コネクションなしで、IPパケットにポート番号を追加しただけの非常に単純な仕様。即時性重視のデバイスにはとても向いています。
一方でUDPの弱点は、暗号化非対応、64KB以上のデータを一度に送信できない、不達エラーを検出できない、などがあります。筆者もこの「暗号化非対応」に困っていました。
そんな時に聞いたのが「ソラコムBeam」(以下、Beam)の話です。簡単に言うと「閉域網でUDP(他もある)を受けて、HTTPSでリクエストしてくれる」サービスで、デバイスに負担をかけずにUDPをセキュアに使えるのです。
設定
詳しくはソラコムのホームページに書かれていますが、大まかに以下の手順です。
- HTTPSサーバーを用意する。
- ソラコムのSIMを購入して有効化する。
- グループを作ってSIMを登録する。
- このグループに対してBeam機能を有効化する。 (ア) 払い出されるUDPエンドポイント(ホスト名・ポート番号)をデバイスに設定する。 (イ) 用意したHTTPSサーバーのホスト名・ポート番号・リクエストパスを登録する。カスタムヘッダも登録できる。
どんなリクエストが来るのか?
今、デバイスがUDPで送信するのは、あるバイナリデータです。テキストではありません。どうやってHTTPリクエストになっているのでしょうか? 観察してみると、POSTリクエストのbodyに以下のJSON文字列(ASCIIエンコード)が入っていました。
{payload:"YWJjZGVmZ2hpam…"}
キーは「payload」、値はUDPバイナリをbase64エンコードした文字列です。 従ってUDPで送信されたバイナリを復元する手順は以下になります。
- JSONデコード
- 「payload」キー値の評価
- 値をbase64デコード
Node.jsでの受信処理は以下のようになりました。
// SORACOM Beam受信処理 var https = require('https'); httpsOpts = {}; httpsOpts['key'] = fs.readFileSync(PRIVATE_KEY_FILE); httpsOpts['cert'] = fs.readFileSync(CERTIFICATE_FILE); httpsOpts['ca'] = fs.readFileSync(CERTIFICATE_CHAIN_FILE); https.createServer(httpsOpts, function(req, res) { var rawData = null; req.on('data', function(d) { var base64 = JSON.parse(d.toString())['payload']; rawData = new Buffer(base64, 'base64'); }); // end of on('data') req.on('end', function() { // ここにrawData評価処理を記述 res.writeHead(200, {'Content-Type': 'text/plain'}); res.end(); }); // end of on('end') ).listen(LISTEN_PORT); // end of createServer
UDPの受信処理と比べてみると、だいぶ複雑にはなりましたが、流れは同じです。
// 元々のUDP受信処理 var dgram = require('dgram'); var udpServer = dgram.createSocket('udp4'); udpServer.bind(LISTEN_PORT); udpServer.on('message', function(buf, rinfo) { // ここにbufの評価処理を記述 }); // end of on('message')
UDP直使用と比べて、どうか
筆者が少し試した範囲では、Beamは性能については特に問題はないと思いました。即時性も良好です。HTTPになれば通常のWebトラフィックと同様にスケールアウトできますから、何かと楽です。
費用はどうでしょうか。Beamの利用料金は本稿執筆時点で1リクエストあたり0.0009円で、UDPパケット1個の転送で2リクエストカウントされます。
3秒ごとにデータを送信すると24時間では
24 * 3600 / 3 = 28,800回の送信になり、
1日あたりの料金は
28800 * 2 * 0.0009 = 51.84円(税別)になります。
元々の通信料金と比べてみましょう。
UDPパケットの長さを、仮にプロトコルヘッダ込みで100バイトとすると、
24時間では
100 * 28800 = 2.88メガバイトで、約3メガバイトです。
本稿執筆時点の通信料金は最も安い料金クラスの場合、1メガバイトあたり0.2円ですから、3メガバイトでは0.6円となります。これに1日あたりの基本料金10円が加算されますので、1日あたりの通信料金は10.6円(税別)です。
つまり、UDP直使用と比較してBeamの通信コストは
(51.84 + 10.6) / 10.6 ≒ 5.9倍になります。
また、HTTPSを受けるCPUコストもありますので、筆者の感覚では、同一サーバーでさばけるデバイス数は、少なくとも数分の一になるでしょう。
「セキュリティ」のコストはそれなりにかかります。
ソリューション設計にあたっては、諸事情勘案の上で比較する必要があると思います。
コメント