最強のセキュリティを誇るSORACOM Private Gardenが実用に耐えるかを検証する

2020/2/27 新しいエンドポイント`pong.soracom.io`が登場したため[追記しました](#pong)。

# はじめに

ちょっと気になる事が見つかりました。

SORACOM Napterを使っていたのですが、ふと思い立ってPrivate Gardenの下にいる回線に対してNapterしたら通っちゃったんですよね。

公式の資料を読むと、
https://dev.soracom.io/jp/docs/private_garden/

> Private Garden 機能は、Beam, Funnel, Funk, Harvest のエンドポイント以外にアクセスできない機能です。デバイスから直接インターネットにアクセスできないため、よりセキュアにソラコムのサービスを利用できます。

ってなってまして、Beam, Funnel, Funk, Harvestしかアクセス出来ないものと思ってたんですよね。この資料がメンテされていないだけという可能性もありますが、Napterと一緒にリリースされたFunkも入っていることから、更新されていないことはなさそう。

ということは、公式がアナウンスしていないだけ、というか僕が知らないだけで実は色々出来るんじゃないか、と思いましたので、ソラコムの各サービスがPrivate Gardenのネットワーク下で使用可能かを検証してみました。

# Private Gardenとは

そもそもPrivate Gardenってなんぞ？ということになるかと思います。
上の公式の資料でも説明されているのですが、ソラコムのアプリケーションサービスに属しているBeam, Funnel, Funk, Harvest以外への通信を遮断することで、高いセキュリティを実現する機能です。

この記事のタイトルは若干あおり気味なのですが僕は本気でセキュリティ的にはPrivate Gardenを使うのが最強だと思っています。いやいや、閉域接続ができるCanalやDirectの方がセキュリティ的にはいいでしょ？と思われる方もあると思います。確かに閉域接続はデバイスとクラウド（オンプレ）がインターネットに晒されない点では高セキュリティなのですが、デバイスからクラウドへの攻撃は出来てしまう、という側面があります。

これは2018年に催されたソラコムさんのイベントのスライドなのですが、
https://www.slideshare.net/SORACOM/soracom-technology-camp-2018-b4-iot/

![スクリーンショット 2019-12-11 21.05.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/695adf1b-7a6d-d02c-5b54-f630c0682890.png)

僕はこれを見て、閉域でも絶対安全というわけではないということを学びました。閉域はネットワークの両端が安全という前提であれば安全なのですが、IoTで無人施設、エンドユーザーの施設などに置かれているデバイスが安全なネットワークかと言われると疑問です。デバイスからシステムへの攻撃のリスクも、ある程度は考えておく必要があると思います。
（ちなみにこのスライドではこの後SORACOM Junctionの紹介がされています。実際セキュリティ的に最強なのはJunctionのRedirectionかもしれませんが、ネットワークに相当強い人がいないと使いこなせないと思っています）

そこでPrivate Gardenです。Private Gardenではソラコムのアプリケーションサービス以外には接続できないので、仮にデバイスが乗っ取られたり悪用されたとしても意図しない接続先にデータが送られたり攻撃に利用されたりすることはありませんし、各アプリケーションサービスは事前に定義された動作しかできないので、自社のシステムの脆弱性を攻撃される可能性も極めて小さいと考えられます。Beamなどがどれくらい使われているかは検知も容易です。

そんなPrivate Gardenなのですが、発表された当初はBeam、Endorse、Funnel、Harvestまでしか無く、この範囲で収まるユースケースにしか対応できませんでした。
https://blog.soracom.jp/blog/2017/12/24/soracom-santa/

あれから２年の年月が過ぎ、SORACOMのサービスもますます広がってきたところで、どの程度のことがPrivate Garden下でできるのか確認してみましょう。意外と今のシステムはPrivate Garden下でも稼働できるかも知れません。

ちなみに前提としてSORACOM Airの回線はNATの下にあり、インターネットからの直接攻撃はそもそもできません。最初からある程度のセキュリティは確保されていることも抑えておきます。
![スクリーンショット 2019-12-12 6.07.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/df4421ea-7014-5f46-7529-62b488368607.png)
（https://www.slideshare.net/SORACOM/soracom-technology-camp-2018-123682312 より抜粋）

# 検証ラインナップ

Aから順に行きます。なお、Canal、Direct、Door、Gate、JunctionはVPGが必須の機能であるため（Private GardenはVPG機能の一種であり、併用はできない）、Lagoonはデバイスから直接アクセスするサービスでは無いため、Mosaicは入手方法が良く分からなかったため省きます。

- Air メタデータサービス
- Beam
- Endorse
- Funnel
- Funk
- Harvest Data
- Harvest Files
- Inventory
- Krypton
- Napter
- NTP
- Pong
- Unified Endpoint

なお、この内容はソラコム社の確認を取っておりません。公式の見解と相違がある場合は、当然ながら公式の見解を優先していただくようお願い致します。

# 設定

では早速Private Gardenを設定しましょう。
Private Garden設定前はこのように8.8.8.8にアクセス出来ています。

![スクリーンショット 2019-12-11 21.49.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/db2e7d46-3760-baca-a278-3138b164f6cb.png)

設定はコンソールでSIMグループのSORACOM Air for Cellular設定の中にある、VPG(Virtual Private Gateway)設定をONに、「Shared VPG for Private Garden(PrivateGarden)」を選択し、保存します。

![スクリーンショット 2019-12-11 21.43.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/12bd2eae-2af9-f6a0-f485-6b5a18af86a6.png)

なお、この時追加料金が発生しますよ、というダイアログが出るのですが、追加料金が発生している気配がありません。

![スクリーンショット 2019-12-11 21.46.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/537b17bd-c1e5-9a91-8753-9570612c2cd2.png)

VPGの価格改定で料金かからなくなっているのがコンソールに反映されていないのか？Web上の資料には「なお、Private Garden 機能の利用における料金は発生しません。」と記載されています。Private Gardenにしても追加料金かからないんだったら、また１つPrivate Gardenにする理由が増えますね。

設定したらいったん接続を切りましょう。VPGの変更は接続しなおさなければ反映されません。ここがVPGのハマリポイントです。これなんとかして欲しいな。。なんとかならないのかな。。

さて、これで8.8.8.8には接続できなくなりました。この状態でも、例えばbeam.soracom.ioには接続できます。
![スクリーンショット 2019-12-11 21.53.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/c08c1b05-57fc-2cae-30ef-354a26b0f06c.png)

これがPrivate Gardenネットワーク下の状態です。それでは順次試していきましょう！(今回は一つ一つのサービスの説明や、設定の方法は省きます)

# Air メタデータサービス

SORACOMを支える超便利サービスであるところのAir メタデータサービス。
エンドポイントはmetadata.soracom.io、IPアドレスは100.127.100.127。
![スクリーンショット 2019-12-11 22.04.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/48e9962d-5953-ef60-13cc-dd66dd2d4598.png)
ここは大丈夫ですね。そしてvpgIdはちゃんとPrivateGardenになっています。やはり「Beam, Funnel, Funk, Harvest のエンドポイント以外にアクセスできない機能」というわけでもないようです。メタデータアクセス出来なかったらどうしようかと思った。。

# Beam

SORACOMリリース時から存在し、最も汎用的なアプリケーションサービスのBeam。
エンドポイントはbeam.soracom.io、IPアドレスは100.127.127.100。
![スクリーンショット 2019-12-11 22.16.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/072a9647-8c62-3b0c-97b5-ff6467957138.png)

とりあえず代表としてHTTPエンドポイントと、念のためUDP→HTTPSを試してみました。他も大丈夫でしょう。

# Endorse

どのSORACOMサービスを使っているか？でアンケートを取ったら最下位を取りそうなEndorse。Endorseでそのうち記事を書いてやると誓う今日この頃です。
エンドポイントはendorse.soracom.io、IPアドレスは54.250.252.67。
![スクリーンショット 2019-12-11 22.26.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/ebbb165b-83c0-179f-6067-54fc4cf3becc.png)

いけましたね。ちょっと趣が違うIPアドレス(100.127.0.0/16じゃない)なのでダメかと思いましたが、soracom.ioであればいいのか？そういえばさっきの初登場時の記事にもEndorseが入ってたな。

# Funnel

クラウドやパートナーのサービスに手早く連携できるFunnel。
エンドポイントはfunnel.soracom.io、IPアドレスは100.127.65.43。
開発者サイトを参考に、Amazon Kinesis FirehoseからS3に保存する設定をしました。
![スクリーンショット 2019-12-11 22.43.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/cd5fd56b-8353-9d06-1fd4-3371b51e4c7c.png)

結果がややわかりにくいですが、S3にファイル生成されていたので大丈夫でしょう。

# Funk

クラウドのファンクションサービスが直接起動できるFunk。Beam → APIよりシンプルかつ安全にクラウド処理が実行できます。(BeamだとAPIの受け口をインターネットに出さないといけない)
エンドポイントはfunk.soracom.io、IPアドレスは100.127.19.64。
![スクリーンショット 2019-12-11 22.56.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/c935144f-ed78-dd41-b983-5cdeb82889fe.png)

これもOKですね。クラウド上の関数と連携させる事で多くのユースケースに対応できるのでは。

# Harvest Data

様々なIoTサービスの中でも最速でデバイスデータの可視化が出来ると噂のHarvest Data。設定はONするだけ、送信はペイロード送るだけという異常な簡単さ。Lagoonと連携する事で高度な可視化も可能。
エンドポイントはharvest.soracom.io、100.127.111.111。
![スクリーンショット 2019-12-11 23.05.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/0f981677-0d3d-3d96-6a15-cdb28b0e5972.png)

OKですね。ちなみにHarvestは数値送らないといけない雰囲気があるのですが、別に文字列送ってもいいんですよね。グラフデータにならないだけで。

# Harvest Files

SORACOMの中にファイルをアップロードしたりダウンロードしたり。柔軟な権限設定もできる便利なIoTストレージ。
エンドポイントはharvest-files.soracom.io、IPアドレスは100.127.111.48。
![スクリーンショット 2019-12-11 23.19.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/45204a87-b094-5f88-22d9-d6ba6695eb8b.png)

おー、いけましたね。ちゃんと保存もされてる。個人的にこれが一番大きいです。Private Garden下でファームウェアアップデートやログの収集どうやるか、というのが課題だったのですが、Harvest Filesでその問題がクリアされてます。これが分かったのは収穫ですね。aptなどのパッケージ管理ツールからのアップデートが出来ないのは難点ですが、そもそもバージョン管理をきっちりしたいデバイスの場合、Harvest Filesにファイルを置いて、ローカルインストールさせた方がいいかもしれないです。ただしファイルの保存期限には気をつけましょう。保存期間は731日です。忘れた頃にファイル消えて事件が起こりそう。

# Inventory

LwM2Mを使った軽量なデバイス管理。ちょっとした遠隔操作ならこれで十分。僕とソラコムとの間に接点を作った思い出深いサービス。LwM2Mを簡単に使うためのツールを作ったりもしました。（今回の検証にもこれを使っています）
https://github.com/1stship/inventoryd
ブートストラップサーバーはエンドポイントがbootstrap.soracom.ioでIPアドレスは100.127.56.83、デバイス管理サーバーはエンドポイントがjp.inventory.soracom.ioでIPアドレスは52.198.95.62。
![スクリーンショット 2019-12-11 23.41.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/92916233-6cc0-2371-5d18-cb08048f59d3.png)

ブートストラップはうまくいきますが、デバイス管理サーバーとの接続はうまくいかない、という微妙な結果になりました。自作のツールが悪いのかな、でもPivate Gardenじゃなければちゃんとつなげるしな。。InventoryはいったんAirのネットワーク下でブートストラップが成功したら、あとはAirのネットワークから切り離してインターネットからも使えるサービスなので、そのあたりの問題なのかも知れないですね。うーん、惜しい。

# Krypton

ここ最近人気が出てきたように思うKrypton。デバイスのクレデンシャルの発行と管理なんてやりたくないですからね。。https://dev.soracom.io/jp/start/krypton_cognito/ の手順にて検証します。
エンドポイントはkrypton.soracom.io、IPアドレスは54.250.252.67。
![スクリーンショット 2019-12-12 1.09.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/1b3a5acc-4961-3324-3907-ea711fac95f2.png)

OKですね。AWSにもCognitoのIDが登録されていました。今回はセルラー回線を用いてのKryptonを使用しました。インターネットを通す方法も試したかったのですが、IoT SIM(グローバルSIM)が手元に無くて試せませんでした。。残念。

# Napter

今回の調査のきっかけ。話題のオンデマンドリモートアクセスサービス。本来暗号化出来ないデバイスとの通信も暗号化出来てしまう神サービス。
エンドポイントとIPアドレスは不明。
![スクリーンショット 2019-12-11 23.54.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/4c8131a0-6d8f-a042-0290-8a1f917802e0.png)

接続できてしまいました。これにより、普段は外部からのアクセスは一切受け付けないけど、必要な時にはセキュリティを確保したまま一時的にリモートアクセスできるよ、というステキなことに。ちなみにnetstatすると100.127.10.16からアクセスされており、これがNapterのIPアドレスなのかな？常にこれとは限りませんが。

# NTP

地味だけど絶対必要なNTP。Private GardenでNTPができないとなると実用的とはいえないですが、実はSORACOM内にNTPサーバを用意してくれています。
https://dev.soracom.io/jp/vpg/how-it-works/#ntp
とても重要なのですが専用のページが無い。なお、VPGのページで説明されていますが、VPGユーザーじゃ無くても使えます。どのNTPサーバー使うのかは地味に悩むので助かりますね。
エンドポイントはntp.soracom.io、IPアドレスは100.127.0.123。

![スクリーンショット 2019-12-12 1.14.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/fe72aa9e-f2cc-6e42-b3dc-c6564b190709.png)

当然OKですね。これないと困りますしね。

# Pong

ネットワークの死活監視に使えるping(ICMP ECHO REPLY)サーバー。
https://blog.soracom.jp/blog/2020/02/27/pong-soracom-io/

ネットワークの死活監視はIoTにとって非常に重要。ネットワークは様々な要因で死にます。電源が落ちる、カーネルのデバイス管理が狂う、モデムがハングアップする、DHCPが受信できない、DNSが失敗する、電波届かない、ネットワークインフラ障害、サーバーバグってる、etc., etc.可能な限り早く対処するためいち早く状況を掴みたい。そのための一番早い方法は、とりあえずどこかのサーバーにpingして見て応答あればOK、ではないでしょうか？

エンドポイントはpong.soracom.io、IPアドレスは100.127.100.127。なんとmetadata.soracom.ioと同じ。同じサーバーなんでしょうか？metadata.soracom.ioは自分自身を写す鏡のようなサービスだから、100.127を繰り返して100.127.100.127、と聞いたことがありますが、pongサーバーはpingと出したらpongと返ってくる山彦のようなサービスだからかな？

![スクリーンショット 2020-02-27 20.19.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/50a6721d-d56a-6e17-24fa-14227e5230fb.png)

当然OKですね。ping先をどこにするかは地味に悩むので、公式に「ここはpingしてもいいんだよ」と教えてくれるのはありがたい。

# Unified Endpoint

ここに投げておけば大体なんとかなるSORACOMの最終兵器。設定したアプリケーションサービス全てにデータが転送されます。もうデバイスはここにデータ投げて後はクラウドに任せとけば良いんじゃ無いかな。。
エンドポイントはunified.soracom.io、IPアドレスは100.127.69.42。
![スクリーンショット 2019-12-12 0.22.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542185/f7c2e205-12cf-71ab-6de2-dfb5ad897205.png)
無事アクセス出来ました。なんか色々返ってきてすごい。

# 結果発表

|サービス|結果|
|:--|:--:|
|Air メタデータサービス|○|
|Beam|○|
|Endorse|○|
|Funnel|○|
|Funk|○|
|Harvest Data|○|
|Harvest Files|○|
|Inventory|×|
|Krypton|○|
|Napter|○|
|NTP|○|
|Pong|○|
|Unified Endpoint|○|

ということでほぼ全てのサービスはPrivate Garden下でも使用可能です。というか使えないのInventoryだけですね。。
2019年7月のDiscovery(ソラコム年間最大のイベント)で発表された、Funkによって柔軟なクラウド連携が、Harvest Filesによってファイル操作が、Napterによって遠隔操作ができるようになったことは大きいです。Harvest Filesでファイルアップロードして、Funkでそれを操作させる、とかすれば、入出力のサイズと連携サービスはほぼ制限なくなりますので、かなりのユースケースがPrivate Gardenでもいけるんじゃないかと思います。

# 結論
Private Garden下でも相当のことができるようになっており、十分実用的と考えます。
Private Gardenでも使えるように考えると、SORACOMサービスをフル活用する、ということに自然となりますので、これからSORACOMを使ったIoTサービス構成を考える際には、Private Garden前提で考えてみると良いのではと思います。
追加料金もかからないですしね。

それではよいIoTライフを！