読者です 読者をやめる 読者になる 読者になる

HDE BLOG

コードもサーバも、雲の上

SORACOM Air/Beamはどんな問題を解決するのか、IoT素人の目線で考えてみる

こんにちは。HDEの小椋です。SORACOM リリース記念リレーブログ に参加させていただいております。

僕は機械・電気系はまったくの音痴、IoTも素人です。でも、クラウドは一応素人ではないので、オンプレミス機器をどんどんクラウドに移行したように、物理的な機器もどんどんクラウドのパワーを活用して、現実世界を豊かにすることができるんじゃないか、ということをよく妄想します。しかし、その時にいつも壁として立ちはだかるのが、物理セキュリティの問題です。

SORACOM Air/Beamが、それらの問題をエレガントに解決してくれたことに、とても興奮しています。うまく説明できるかどうかわからないのですが、以下チャレンジしてみます。

たとえば、家の玄関のチャイムを、クラウドとRaspberry Piのような安価な機器で実現することを考えてみましょう。面倒くさいので、とりあえず通話機能とかその他の機能とかはのぞいて、チャイム機能だけ考えることにします。

要件:玄関に来た人がボタンを押したときに、スマホに通知したい

という単純な問題を考えてみます。

f:id:goura:20151006023827p:plain

ボタンの部分はRaspberry PiとかEdisonとかにして、家の無線LAN経由でクラウドに接続し、クラウド側の何かのAPIを呼び出して、スマホに通知を送る。こうすれば、Raspberry Pi以外に特別な機器も要らないし、良さそうですよね。クラウドが得意な人なら、ちょっと電子工作するだけでできちゃいそうなので、一瞬ワクワクします。

でも、よく考えるとそう簡単でも無いんです。この時、Raspberry Pi側には、少なくとも二つの大事な情報が格納されています。一つは無線LANの認証情報、もう一つはクラウドのAPIの認証情報です。もしRaspberry Piだったら、実機を盗まれたら簡単に読み取れてしまう情報ですよね。

もし悪意を持った人が、玄関先にあるRaspberry Piを盗んだらどうなるか。無線LANの認証情報は、もし盗まれたら家の無線LANにタダ乗りされてしまったり、家のLANに侵入されてしまうかもしれない大事な情報です。クラウドのAPIの認証情報のほうは、万が一盗まれたら、いつでもどこでもピンポンが鳴らせる、無制限完全ピンポンダッシュが成立してしまいます。

  • 無線LANの認証情報は、家で普段使っている無線LANと別の無線LANにしておけばいいじゃないか
  • クラウドのAPIは、盗まれたことがわかった時点で認証情報を無効化すればいいじゃないか

と思うかもしれませんが、家で普段使っている無線LANと別の情報にしたとしても、タダ乗りは防げません。また、認証情報の無効化については、盗まれたことが検知できるならばそれでもどうにかなるかもしれませんが、検知に失敗し、盗まれたことに気づかないとどうしようもありません。たとえば、物理的にRaspberry Piを盗むのではなくて、盗んで素早くSDカードの中身をコピーして、また元に戻したらとしたらどうでしょうか。情報が盗まれたこと自体に気づかないかもしれません。

ちょっと考えただけでも「安心できる状況」を作るのは結構面倒くさいということがわかります。

SORACOM Air/Beamを使えば、こうした問題を解消できる可能性があります。

SORACOM Beamは、「SIM単位の認証と通信経路の保護をSORACOMが代わりに引き受ける」機能だと表現することができます。SORACOM Beamを使うと、SIMそのもの以外、Raspberry Pi側にはなにも認証情報を置かずに、そのSIM経由での通信が来た時のみ、SORACOMが代理で、あらかじめ登録してある認証情報を付加して第三者のクラウドAPIを呼び出すようなことが可能になります。クラウドAPIを呼び出すにあたっては、IMSIと呼ばれるSIMの識別番号の情報も付加することができます。

つまり、Raspberry Piは、SORACOMのSIM、SORACOM Airを使って通信さえすれば、無線LANの接続情報も、クラウドのAPIキーも、Raspberry Piには置かなくていいのです。証明書ストアの更新とか、そうしたことも忘れていい。大事な情報は全部、第三者に手の届かないクラウド側に置くことができます。

いわゆる「クローン携帯」が存在していないことを鑑みても、SIMを複製したりすることは相当に難しそうなので、SORACOM Beamは、問題をだいぶ単純化してくれる現実的な解であることがわかると思います。

上では触れませんでしたが、「100台置きたかったらどうするか問題」もあります。100台それぞれに別々の認証情報を設定することを考えると面倒ですし、一方全部同じ認証情報を設定してしまうと、万が一盗まれたときの被害が大きくなりますし、機器の入れ替え等で、数台だけアクセスを取り消したい、というような状況も面倒臭そうです。SORACOM Air/Beamを活用すれば、認証情報を各機器に格納する必要が無いため、100台全部に同じソフトウェアをデプロイした上で、どの機器にどのSIMカードを刺したかだけを記録しておけば良く、アクセス許可や、認証情報についてはクラウド側で集中管理することができます。

チャイム程度なら、他の無線テクノロジーでどうにかできるかもしれませんが、例えばドローンとか、デジタルサイネージとか、ロボットとか、クラウドから機器をコントロールするものの応用範囲は無限にありそうです。可能性が一気に拡がった感じで、ワクワクしませんか。そもそも3Gモジュールの値段がまだ高すぎたり、まだSORACOMが日本でしかサービスしていなかったり、まだまだ解決すべき課題はたくさんありますが、少なくとも大きな前進であることは間違いないですよね。

少し前に、うちの会社のインターン生がRaspberry Piで作った、クラウドベースのデジタルサイネージの社内導入を検討した際、上記のような話が問題になり「金属製のケースを作って南京錠でロックしてはどうか」などと議論した挙句面倒くさくなって話が立ち消えになるのを経験した私としては、例えば一般企業で、社内で実験的にIoT機器を導入したりするにあたっては、リスク受容できるところまでだいぶハードルが下がったのではないかと感じました。

さて、僕の文章は必要以上に長く、退屈なことで有名です。ここまで読んでいただき、ありがとうございました。ここで終わりと言いたいところなのですが、せっかくなので上記の話を実感するために、玄関チャイム的なものを試しに作ってから終わりたいと思います。

実際に作ってみる

用意するもの

  • Slack
  • SORACOMのSIMで通信可能な、Raspbian jessieが入ったRaspberry Pi
  • プッシュスイッチ、ブレッドボード、ジャンパ線

「SORACOMのSIMで通信可能なRaspberry Pi」が現在若干ハードル高めですが、このリレーブログシリーズが終わるころには、きっといろんな選択肢が説明されていることと思います。僕は @j3tm0t0 さんの

を参考にFS01BU(SORACOM自身が販売している)を使いました。

難しければ、とりあえず今回はあくまでもproof of conceptですので、SORACOM Airを刺したWiFiルーターとかスマホ(への無線LAN経由でのテザリング)とかの普通の接続で代用して、あとは心の中でPPP接続をしましょう。とにかくRaspberry PiがインターネットにアクセスするときにSORACOM Air経由で行くようにすれば以下の実験は可能です。

通知には、一番簡単なSlackを使います。Raspberry Piにつながったボタンを押すとSlackに通知が飛ぶようにしてみましょう。スマホにSlackのアプリを入れておけば、スマホ宛に通知を送ることもできますよね。

f:id:goura:20151006150145p:plain

こんな感じで、Raspberry PiはSORACOM Beamに対し、SORACOMの内部ネットワークを通じてHTTPでリクエストを送り、それを受けたSORACOM Beamが(特定のグループに入っているSIMからの通信の場合に限り)Raspberry Piの代わりに認証情報(APIトークン)を付加して、インターネット経由でHTTPSでSlackにAPIリクエストを送ります。

Raspberry Pi側には、SIMカード以外の認証情報は置きません。

今回は、SlackのWeb APIのうち、「chat.postMessage」 を使います。

このAPI呼び出しに必須となる引数は

  • token
    • 認証情報
  • channel
    • 宛先
  • text
    • メッセージの内容

の三つです。今回の試みでは、メッセージの内容はRaspberry Piから送り、SORACOM Beamで認証情報と宛先を付加します。

Slack Web APIの引数は "can be passed as GET or POST params, or a mix" という仕様なので、今回は行儀悪くmixする方向で行きます。

Raspberry PiはPOST paramでtextを送信し、そのリクエストに対し、SORACOM BeamがGET paramsとしてtokenchannelを追加します。

Beam側の設定を変えれば、Raspberry Piに変更を加えずに宛先や投稿するSlackのチームを変えることも可能な例を考えてみました。

SlackのAPIトークンの取得

https://api.slack.com/web の下の方に、簡易的な、全権を持ったトークンを発行するボタンがあります。今回はこれで試してみましょう。

f:id:goura:20151006031443p:plain

ボタンを押すと、上の図のボタンの左「none」と書いてあるところにAPIトークンが入りますので、控えておきましょう。

SORACOM Beamの設定

Beamの設定はユーザーコンソール「グループ」から行います。適当なグループを作った後、そのグループの「SORACOM Beam設定」から「HTTPエントリポイント」を追加します。

f:id:goura:20151006031602p:plain

「エントリポイント」のパスに/を、「転送先」のホスト名に「slack.com」を入れます。「転送先」のパスには、

/api/chat.postMessage?token=<<APIトークン>>&channel=@kazuhiro

を登録します。 <<APIトークン>> は上記で発行したAPIトークン、@kazuhiroのところは自分のSlackの@IDに置き換えてください。(画像では途中で切れていますのでご注意ください。&channel=@kazuhiroを忘れずに)

f:id:goura:20151006113048p:plain

このグループに、Raspberry PiからアクセスするSIMを登録します。SIM管理画面からSIMを選んで「詳細」です。

f:id:goura:20151006113858p:plain

この状態で、このグループに登録されているSIMが刺してあるRaspberry Piから http://soracom.io:8888/ にHTTP POSTすると、SORACOM Beamが https://slack.com/api/chat.postMessage?token=<<APIトークン>>&channel=@kazuhiro に同じ内容をPOSTしてくれるはずです。

Raspberry Pi上のcurlから、試しにリクエストを投げてみましょう。

設定が間違っていなければ、

$ curl -X POST -d 'text=hello' http://beam.soracom.io:8888/
{"ok":true,"channel":"D0BSL33EX","ts":"1444063662.167012","message":{"text":"hello","username":"bot","type":"message","subtype":"bot_message","ts":"1444063662.167012"}}

のような応答が帰ってきて、slackbotから "hello" という内容のDMが届くはずです。 (僕の環境だと、スマホにプッシュ通知が来るのは30秒後ぐらいだったので、玄関チャイムとしてはちょっと実用性に難あり)

プッシュスイッチの結線

ここまでできれば、後は押しボタンを付けるだけです。……とはいえ僕は電気はまったくの素人です。 押しボタンの結線、押しボタンを押したことの検知は、以下の記事を参考にしました。

O'Reilly Raspberry Pi Cookbook http://razzpisampler.oreilly.com/ch07.html

記事を参考に、GPIO 18番とGNDにプッシュスイッチをつなぎます。

Raspberry Pi 2の場合は、ピン配置が少し違いますので注意しましょう。

www.raspberry-pi-geek.com

そして、以下のPythonプログラムをどうにかして、Raspberry Pi上にswitch.py として保存します。

短縮URL作りました。curl -L https://goo.gl/4ijyJi > switch.py等で取得できます)

で、そのswitch.py を、同じくRaspberry Pi上で

$ sudo python switch.py

として起動すると、ボタンを押すたびに画面に

button pressed
text=hello%21

のような文字が表示されて、SlackにDMが届くはずです。

ということで、完成!

f:id:goura:20151006032159j:plain

Lチカから先に進んだことが無かったド文系の僕でもIoTできました。感動です。

Raspberry Piは、単に http://beam.soracom.io:8888/ にアクセスしているだけで、何の認証情報も設定していません。仮にこれをプロダクトにして100台、それぞれ全く違う家庭に販売することになったとしても、SDカードの中身は全部同じでいいはずです。SIMの所属するグループが異なれば、異なるSORACOM Beam設定が適用可能なので、機器毎に違うSlackに投稿させることもできます。SORACOM Beam、便利ですね。

後片付け

遊び終わったら、ここで使ったAPIトークンは忘れずに無効化しておきましょう https://api.slack.com/web の右上の "My Auths" をクリックした後の画面のゴミ箱マークから無効化が可能です。 f:id:goura:20151006114711p:plain f:id:goura:20151006114724p:plain

まとめ

図をノートPCのトラックパッドだけで描こうとするのは無謀