Microsoft Entra ID を使用した IoT Hub へのアクセス制御

Microsoft Entra ID を使用して、デバイス ID の作成ダイレクト メソッドの呼び出しといった、Azure IoT Hub サービス API に対する要求を認証できます。 Azure のロールベースのアクセス制御 (Azure RBAC) を使用して、これらの同じサービス API を認可することもできます。 これらのテクノロジを一緒に使用すると、IoT Hub サービス API にアクセスするためのアクセス許可を Microsoft Entra のセキュリティ プリンシパルに付与できます。 このセキュリティ プリンシパルは、ユーザー、グループ、またはアプリケーション サービス プリンシパルの場合があります。

Microsoft Entra ID を使用してアクセスを認証し、Azure RBAC を使用してアクセス許可を制御することで、セキュリティ トークンよりも優れたセキュリティと使いやすさを実現できます。 セキュリティ トークンに固有の潜在的なセキュリティ問題を最小限に抑えるために、可能な限り、Microsoft Entra 認証を適用することをお勧めします。

Note

Microsoft Entra ID による認証は、IoT Hub の "デバイス API" (デバイスとクラウド間のメッセージや報告されたプロパティの更新など) ではサポートされていません。 IoT Hub に対してデバイスを認証するには、対称キーまたは X.509 を使用してください。

認証と権限承認

"認証" は、ユーザーが身元を証明するプロセスです。 認証は、IoT Hub に対するユーザーまたはデバイスの ID を検証します。 AuthN と短縮される場合があります。 認可は、IoT Hub で認証されたユーザーまたはデバイスのアクセス許可を確定するプロセスです。 これにより、ユーザーがアクセスすることを許可されるリソースとコマンド、およびユーザーがそれらのリソースとコマンドで実行できる操作が指定されます。 承認は AuthZ と短縮される場合があります。

Microsoft Entra セキュリティ プリンシパルで IoT Hub サービス API へのアクセスを要求すると、プリンシパルの ID が最初に "認証" されます。 認証では、実行時にその要求に OAuth 2.0 アクセス トークンが含まれている必要があります。 トークンを要求する場合のリソース名は https://iothubs.azure.net です。 アプリケーションは、Azure VM、Azure Functions アプリ、Azure App Service アプリなどの Azure リソース内で実行される場合、マネージド ID として表すことができます。

Microsoft Entra プリンシパルが認証されたら、次の手順は "認可" です。 このステップでは、IoT Hub で Microsoft Entra のロールの割り当てサービスを使用して、プリンシパルに付与されたアクセス許可を判別します。 プリンシパルのアクセス許可が要求されたリソースまたは API と一致する場合、IoT Hub によって要求が承認されます。 そのため、このステップでは、セキュリティ プリンシパルに 1 つ以上の Azure ロールを割り当てる必要があります。 IoT Hub には、一般的なアクセス許可グループを持つ組み込みのロールがいくつか用意されています。

Azure RBAC ロールの割り当てを使用して IoT Hub へのアクセスを管理する

Microsoft Entra ID と RBAC を使用する場合、IoT Hub では、API を要求するプリンシパルに、承認のために適切なレベルのアクセス許可があることが求められます。 プリンシパルにアクセス許可を付与するには、ロールの割り当てを付与します。

特権を最小限にするには、常に、可能な限り最も低いリソースのスコープ (おそらく、IoT Hub のスコープ) で適切なロールを割り当てます。

IoT Hub には、Microsoft Entra ID と RBAC を使って IoT Hub サービス API へのアクセスを認可するために、次の Azure 組み込みロールが用意されています。

Role 説明
IoT Hub データ共同作成者 IoT Hub データ プレーン操作へのフル アクセスを許可します。
IoT Hub データ リーダー IoT Hub データ プレーン プロパティへの読み取りのフル アクセスを許可します。
IoT Hub レジストリ共同作成者 IoT Hub デバイス レジストリへのフル アクセスを許可します。
IoT Hub ツイン共同作成者 すべての IoT Hub デバイスとモジュール ツインに対する読み取りおよび書き込みのアクセスを許可します。

必要なアクセス許可を組み合わせることで、IoT Hub で使用するカスタム ロールを定義することもできます。 詳細については、Azure のロールベースのアクセス制御のためのカスタム ロールを作成するに関するページを参照してください。

リソースのスコープ

セキュリティ プリンシパルに Azure RBAC ロールを割り当てる前に、セキュリティ プリンシパルに必要なアクセスのスコープを決定します。 常にできるだけ狭いスコープのみを付与するのが最善の方法です。 より広い範囲で定義されている Azure RBAC ロールは、その下のリソースによって継承されます。

次の一覧で、IoT Hub へのアクセスのスコープとして指定できるレベルを、最も狭いスコープから順に示します。

  • IoT ハブ。 このスコープでは、ロールの割り当てが IoT ハブに適用されます。 個々の IoT ハブより小さいスコープはありません。 個々のデバイス ID やツイン セクションなど、より小さなスコープでのロールの割り当てはサポートされていません。
  • リソース グループです。 このスコープでは、ロールの割り当てがリソース グループ内のすべての IoT ハブに適用されます。
  • サブスクリプション。 このスコープでは、ロールの割り当てがサブスクリプションにあるすべてのリソース グループ内のすべての IoT ハブに適用されます。
  • 管理グループ。 このスコープでは、ロールの割り当てが、管理グループ内のすべてのサブスクリプションにあるすべてのリソース グループ内のすべての IoT ハブに適用されます。

IoT Hub サービス API のアクセス許可

次の表では、IoT Hub サービス API 操作で使用できるアクセス許可について説明します。 クライアントで特定の操作を呼び出せるようにするには、クライアントの割り当て済み RBAC ロールで、その操作に十分なアクセス許可が提供されることを確認します。

RBAC アクション 説明
Microsoft.Devices/IotHubs/devices/read デバイスまたはモジュール ID を読み取ります。
Microsoft.Devices/IotHubs/devices/write デバイスまたはモジュール ID を作成または更新します。
Microsoft.Devices/IotHubs/devices/delete デバイスまたはモジュール ID を削除します。
Microsoft.Devices/IotHubs/twins/read デバイスまたはモジュール ツインを読み取ります。
Microsoft.Devices/IotHubs/twins/write デバイスまたはモジュール ツインを書き込みます。
Microsoft.Devices/IotHubs/jobs/read ジョブの一覧を返します。
Microsoft.Devices/IotHubs/jobs/write ジョブを作成または更新します。
Microsoft.Devices/IotHubs/jobs/delete ジョブを削除します。
Microsoft.Devices/IotHubs/cloudToDeviceMessages/send/action cloud-to-device メッセージを任意のデバイスに送信します。
Microsoft.Devices/IotHubs/cloudToDeviceMessages/feedback/action cloud-to-device メッセージのフィードバック通知を受信、完了、または破棄します。
Microsoft.Devices/IotHubs/cloudToDeviceMessages/queue/purge/action デバイスの保留中のすべてのコマンドを削除します。
Microsoft.Devices/IotHubs/directMethods/invoke/action 任意のデバイスまたはモジュールでダイレクト メソッドを呼び出します。
Microsoft.Devices/IotHubs/fileUpload/notifications/action ファイルのアップロード通知を受信、完了、または破棄します。
Microsoft.Devices/IotHubs/statistics/read デバイスとサービスの統計情報を読み取ります。
Microsoft.Devices/IotHubs/configurations/read デバイス管理構成を読み取ります。
Microsoft.Devices/IotHubs/configurations/write デバイス管理構成を作成または更新します。
Microsoft.Devices/IotHubs/configurations/delete デバイス管理構成を削除します。
Microsoft.Devices/IotHubs/configurations/applyToEdgeDevice/action エッジ デバイスに構成内容を適用します。
Microsoft.Devices/IotHubs/configurations/testQueries/action 構成のターゲット条件およびカスタム メトリック クエリを検証します。

ヒント

Note

Microsoft Entra ID を使用して IoT Hub からデータを取得するには、カスタム Event Hubs エンドポイントへのルーティングを設定します。 組み込みの Event Hubs 互換エンドポイントにアクセスするには、以前のように接続文字列 (共有アクセス キー) 方式を使用します。

Microsoft Entra 認証を適用する

既定で IoT Hub では、Microsoft Entra ID と、共有アクセス ポリシーおよびセキュリティ トークンの両方を介したサービス API アクセスをサポートします。 セキュリティ トークンに固有の潜在的なセキュリティの脆弱性を最小限に抑えるために、共有アクセス ポリシーを使用してアクセスを無効にできます。

警告

共有アクセス ポリシーを使った接続を拒否することで、この方法で接続したすべてのユーザーとサービスは、すぐにアクセスできなくなります。 特に、デバイス プロビジョニング サービス (DPS) は、共有アクセス ポリシーによる IoT ハブのリンクしかサポートしていないため、すべてのデバイス プロビジョニング フローは "未承認" エラーで失敗します。 慎重に進めて、Microsoft Entra のロールベースのアクセスに置き換えるよう計画してください。 DPS を使っている場合は、先に進まないでください

  1. サービスのクライアントとユーザーが、IoT ハブへの十分なアクセス権を持っていることを確認してください。 最小限の特権の原則に従います。
  2. Azure portal で IoT Hub に移動します。
  3. 左側のペインで、 [共有アクセス ポリシー] を選択します。
  4. [共有アクセス ポリシーを使用して接続する] で、[拒否] を選び、警告を確認します。 Screenshot that shows how to turn off IoT Hub shared access policies.

IoT Hub サービス API には、Microsoft Entra ID と RBAC を使用してのみアクセスできるようになりました。

Azure portal からの Microsoft Entra ID アクセス

Azure portal から IoT Hub にアクセスするには、共有アクセス ポリシーまたは Microsoft Entra アクセス許可を使用します。

Azure portal から IoT Hub にアクセスしようとすると、最初に、Azure portal によって、Microsoft.Devices/iotHubs/listkeys/action を持つ Azure ロールが割り当てられているかどうかが確認されます。 そうである場合、Azure portal では IoT Hub にアクセスするために、共有アクセス ポリシーのキーが使用されます。 そうではない場合、Azure portal では、Microsoft Entra アカウントを使用してデータへのアクセスが試みられます。

Microsoft Entra アカウントを使用して Azure portal から IoT Hub にアクセスするには、IoT Hub データ リソース (デバイスやツインなど) にアクセスするためのアクセス許可が必要です。 また、Azure portal 内の IoT Hub リソースに移動するためのアクセス許可も必要です。 IoT Hub によって提供される組み込みロールでは、デバイスやツインなどのリソースへのアクセスは許可されますが、IoT Hub リソースへのアクセスは許可されません。 そのため、ポータルへのアクセスには、閲覧者などの Azure Resource Manager ロールの割り当ても必要です。 閲覧者のロールは、ポータルのナビゲートが可能な最も制限されたロールであるため、適切な選択肢です。 (共有アクセス ポリシーを介してすべての IoT Hub データ リソースへのアクセスを提供する) Microsoft.Devices/iotHubs/listkeys/action アクセス許可は含まれていません。

アカウントで、割り当てられたアクセス許可の範囲外にアクセスできないようにするには、カスタム ロールの作成時に Microsoft.Devices/iotHubs/listkeys/action アクセス許可を含めないでください。 たとえば、デバイス ID の読み取りはできてもデバイスの作成や削除はできないカスタム ロールを作成するには、次のようなカスタム ロールを作成します。

  • Microsoft.Devices/IotHubs/devices/read データ アクションを持つ。
  • Microsoft.Devices/IotHubs/devices/write データ アクションを持たない。
  • Microsoft.Devices/IotHubs/devices/delete データ アクションを持たない。
  • Microsoft.Devices/iotHubs/listkeys/action アクションを持たない。

次に、Microsoft.Devices/iotHubs/listkeys/action アクセス許可を持つ他のロール (所有者共同作成者など) がアカウントにないことを確認します。 アカウントでリソースにアクセスでき、ポータルをナビゲートできるようにするには、閲覧者を割り当てます。

Azure CLI からの Microsoft Entra ID アクセス

IoT Hub に対するほとんどのコマンドでは、Microsoft Entra 認証がサポートされます。 key または login 値を受け取る --auth-type パラメーターを使用して、コマンドの実行に使用される認証の種類を制御できます。 key 値が既定値です。

  • 前のように --auth-typeの値が key の場合、CLI により、IoT Hub と対話するときに適切なポリシーが自動的に検出されます。

  • --auth-type の値が login の場合、プリンシパルでログインした Azure CLI からのアクセス トークンがこの操作に使用されます。

詳細については、Azure CLI 用の Azure IoT 拡張機能のリリース ページを参照してください。

SDK のサンプル

次のステップ

  • アプリケーションで Microsoft Entra ID を使用する利点の詳細については、Microsoft Entra ID との統合に関する記事を参照してください。
  • Microsoft Entra ID からユーザーやサービス プリンシパルのアクセス トークンを要求する方法の詳細については、「Microsoft Entra ID の認証シナリオ」をご覧ください。

登録グループを使用して複数の X.509 デバイスをプロビジョニングするために、デバイス プロビジョニング サービスを使用する。