Azure IoT HubのSASトークンについて

Azure IoT SDKsを使わずに、Azure IoT HubにMQTT, AMQP, HTTPSなどで接続するにはSASトークという文字列を渡さなければいけないのだが、このSASトークが一体何者か良く分からない。

何度、ドキュメントを読み返しても分からない。

さまざまな用語が出てきます。共有アクセスポリシー、セキュリティ資格情報、資格情報、トークン、対称キー、SASトークン、IoTHubセキュリティトークン、セキュリティトークン、共有アクセスキーで署名されたトークン...

あー、わけわからない。

わからないままでは前に進めないので、ちょっと時間をかけて自分なりに整理してみました。

前提

  • バイスからIoT Hub、サービスからIoT Hubに接続するときの、SASトークンを調べました。他のAzureサービスのSASトークンが同様かは不明です。
  • IoT Hubへのアクセスの制御の日本語と英語を何度も読み返して整理しました。また、Azureポータルの画面も確認しました。アプリを作って検証とかはしていないです。

バイスからIoT Hub

IoT Hubレベルで定義されている共有アクセスポリシー、もしくは、デバイス毎のセキュリティ資格情報でアクセス制御します。

バイス毎のセキュリティ資格情報は、対称キー、自己X509証明書、証明機関X509証明書の3つがあり、デバイスを作るときに指定します。(なお、デバイス毎のセキュリティ資格情報はIoT HubのIdentity Registryに格納されています。)

  • 共有アクセスポリシー(IoT Hubレベル)
  • セキュリティ資格情報(デバイス毎)
    • 対称キー
    • 自己X509証明書
    • 証明機関X509証明書

このうち、共有アクセスポリシーと対称キーでアクセス制御するときに、SASトークンを生成して、MQTTなどで接続するときに渡します。

サービスからIoT Hub

共有アクセスポリシーでアクセス制御します。おしまいw

共有アクセスポリシーからSASトークンを生成

リソースURIと共有アクセスポリシー名、共有アクセスキー、有効期限から、base64とかHMAC-SHA256計算とかして作り出します。

  • リソースURI ... 接続するIoT HubのリソースURI。"myhub.azure-devices.net/devices/device1"
  • 共有アクセスポリシー名 ... "device"
  • 共有アクセスキー ... "Rosx8/5Q7THau334G6WlwAR0lsZc3Yt1QdcWCmr7KYA="
  • 有効期限 ... 適当に適切に決める

共有アクセスポリシー名、共有アクセスキーは、Azureポータルの下図の箇所の値です。

計算の具体的なコードはドキュメントgenerateSasTokenで検索して探してください。

f:id:matsujirushix:20171223232322p:plain

対称キーからSASトークンを生成

リソースURIと対称キー、有効期限から、base64とかHMAC-SHA256計算とかして作り出します。

  • リソースURI ... 接続するIoT HubのリソースURI。"myhub.azure-devices.net/devices/device1"
  • 対称キー ... "HDBqV7U2dRosEh2Xxf//MYzA2T111rRkEmV2dJW0k0s="
  • 有効期限 ... 適当に適切に決める

対称キーは、Azureポータルの下図の箇所の値です。

計算の具体的なコードはドキュメントgenerateSasTokenで検索して探してください。

f:id:matsujirushix:20171223232843p:plain

気になったこと

  • トークンの期限が切れた時点で、IoT Hub はデバイスの接続を切断します。 ”という記述があります。なので、切断されたら自動的にSASトークンを再生成して、ネットワーク再接続するロジックが必要。
  • 最後の方にちょろっと書いてある、”カスタムデバイスの認証”モデルが気になる。デバイストークンサービスにSASトークンを要求すると、何らかの手段でバイスを認証してSASトークンを発行する仕組み。
  • 共有アクセスポリシーや対称キー(から生成したSASトークン)はアクセスの制御。認証ではない!ところがポイント。

参考