Azure IoT Hub Device Provisioning ServiceとSORACOM Kryptonの連携を試してみた - Alternative Architecture DOJO

Alternative Architecture DOJO

オルターブースのクラウドネイティブ特化型ブログです。

Azure IoT Hub Device Provisioning ServiceとSORACOM Kryptonの連携を試してみた

こんにちは。今年の鏡割りの時、娘が保育園で習ってきたらしく「鏡餅は切っちゃ駄目で、叩いて割らないといけないんだよ!」と言っていたのですが、我が家の鏡餅はプラスチックのケースにビニール袋に入った角餅が入ってるものなので切るのも割るのも不要だからどうしたものかと頭を悩ませた木村です。

公開から少し時間が経ってしまいましたが、SORACOM KryptonがAzure IoT Hub Device Provisioning Serviceに対応したので、試してみたことをまとめたいと思います。

blog.soracom.com

デバイスのプロビジョニングとは

デバイスのプロビジョニングとは、デバイスがIoTネットワークに接続するための設定を行うことです。プロビジョニングには、デバイスの証明書の発行や、デバイスの認証情報の登録、デバイスへの認証情報のインストールなどが含まれます。

Azure IoT Hub Device Provisioning Service

Azure IoT Hubにクライアント証明書での認証で接続するためには、証明書を発行し、認証情報として登録し、デバイスに証明書をインストールする必要があります。
Azureでは、デバイスのプロビジョニングを行うためのサービスとして、Azure IoT Hub Device Provisioning Serviceが提供されています。Device Provisioning Serviceでは、デバイスのプロビジョニングを行うための手続きを定義することができ、それを利用してデバイスのプロビジョニングを自動化することができます。

Azure IoT Hub Device Provisioning Serviceについては詳しくはこちらをご覧ください。

https://learn.microsoft.com/ja-jp/azure/iot-dps/about-iot-dps

SORACOM Kryption

SORACOM Krypton は SORACOM が発行するSIMとその認証基盤を使って、さまざまなクラウドサービスへのプロビジョニングをセキュアに実現するサービスです。

Krypton(SORACOMプラットフォーム)にクラウドサービスへの認証情報を設定しておき、デバイスからSORACOM Airのセルラー回線を利用してKryptonにアクセスすると、Kryptonはクラウドサービスへのプロビジョニングを適切に行った上で認証情報をデバイスに返します。デバイスはこの認証情報を使って、任意の通信路を使ってクラウドサービスへ接続することができます。

これの何が便利かというと、以下のような事が実現できるのです。

  • デバイスには認証に関する情報を(ID、パスワード、証明書など)を事前に持たせる必要が無い
  • プロビジョニングを行ってよいデバイスであることは、SORACOMのSIMを使っていることだけで安全に確認できる
  • クラウドサービスへのプロビジョニングはKryptonが行ってくれるので、デバイスではプロビジョニングのコードを書く必要が無い
  • プロビジョニング完了後、SORACOM Airを使った閉域網の上で、安全にクラウドサービスの認証情報を取得できる
  • 認証情報を取得した後はWiFiなどで通信することが可能

デバイスプロビジョニングサービスを使うためのコードを書いたり、そのための設定情報をデバイスに一切持たせる必要が無いので、デバイスの開発や運用がとても楽になります。

SORACOM Kryptonについては詳しくはこちらをご覧ください。

https://soracom.jp/services/krypton/

Azure IoT Hub Device Provisioning ServiceとSORACOM Kryptonの連携

さて、こんな便利なKryptonですが、これまではAWS IoT、Amazon Cognito、SORACOM Inventory に対応していましたが、先日ついにAzure IoT Hub Device Provisioning Serviceにも対応しました。

https://blog.soracom.com/ja-jp/2023/01/18/krypton-supports-azure-iot-hub/

これは胸熱なので早速試してみることにしました。

準備するもの

ドキュメント通りに進めていきますが、Onyxは持っていないのでここはSORACOM Arcで接続したPCで代用します。

SORACOM ArcならびにArcのセットアップについてはこちらをご覧ください。

https://soracom.jp/services/arc/

Azure IoT Hub Device Provisioning Serviceの設定

Azure IoT Hub Device Provisioning Serviceの設定をします。詳細は割愛しますが、以下のような手順となります。

  • IoT Hubを作成する
  • Device Provisioning Serviceを作成する
  • 証明書を作成し、Device Provisioning Serviceに登録する

SORACOM Kryptonの設定

Device Provisioning Serviceの設定ができたら、それを使ってSORACOM Kryptonの設定をします。詳細は割愛しますが、以下のような手順となります。

  • SORACOMコンソールで、SIMグループからKryptonをONにする
  • 「設定を追加する」からAzure IoT Hubを選択肢、DPSの設定を入力する
  • 認証情報で、準備した証明書を貼り付ける

デバイスから繋いで見る

さて、準備ができたらSORACOM Arcで接続したPCからcurlでkryptonに接続してみましょう。

$ curl -v -X POST https://krypton.soracom.io:8036/v1/provisioning/azure/iot/register   -H "Content-Type: application/json"
*   Trying 54.250.252.67:8036...
* connect to 54.250.252.67 port 8036 failed: Timed out
* Failed to connect to krypton.soracom.io port 8036 after 21091 ms: Timed out
* Closing connection 0
curl: (28) Failed to connect to krypton.soracom.io port 8036 after 21091 ms: Timed out

...おや、つながりません。

これは、krypton.soracom.ioへの接続がSORACOM Arc経由になってないからです。SORACOM Kryptonは「SORACOMのSIMから繋がってる」事を以て認証をしているわけですが、SORACOM Arcで示されるデフォルトのWireguardの設定では

[Interface]
PrivateKey = **********************************
Address = 10.***.***.***/32

[Peer]
PublicKey = ***********************
AllowedIPs = 100.127.0.0/16
Endpoint = ****.arc.soracom.io:11010

という形になりますが、こちらに流す通信はAllowedIPsに記載されてる100.127.0.0/16宛てのもののみとなります。SORACOM BeamなどはこのIPアドレスレンジなのですが、kryptonは上記の通り54.250.252.67というIPアドレスになってます。このため、Kryptonにインターネットから接続してしまっているから接続できないということになります。

そこで、以下のようにこのIPアドレス宛もArcを通るようにしてやります。

AllowedIPs = 100.127.0.0/16,54.250.252.67

これで無事に接続できました。なお、公式ブログのOnyxでの例では、全ての通信がOnyx(SORACOM Air)経由になっているのでこの問題は発生しません。

まとめ

SORACOM KryptonがAzure Device Provisioning Serviceに対応したので、実際に試してみました。その際にSORACOM Arcで進めるにはちょっと追加の手順が必要だったので、それについて説明しました。

SORACOM AirやArcでの通信さえ使えれば、あとはhttpsの通信だけでプロビジョニングできますので、Azure SDKが対応してないマイコンなどでも使えそうですね。他にもシェルスクリプトなどで簡単に実装できるので色々と応用できそうです。 機会があればマイコンでの接続にもチャレンジしてみたいと思います。