MQTT クライアントのアクセス制御

アクセス制御を使用すると、ロール ベースのアクセス制御モデルを使用して、トピックに発行またはサブスクライブするクライアントの承認を管理できます。 IoT 環境の膨大な規模を考えると、トピックごと、クライアントごとのアクセス許可を割り当てるのは非常に面倒です。 Azure Event Grid の MQTT ブローカー機能では、クライアントとトピックをクライアント グループとトピック空間にグループ化することで、この規模に関する課題に対応します。

アクセス制御モデルの主要コンポーネントは次のとおりです。

クライアントは、MQTT トピックに発行またはサブスクライブする必要があるデバイスまたはアプリケーションを表します。

クライアント グループは、同じ MQTT トピックのセットに発行またはサブスクライブするために同じアクセス権を必要とする一連のクライアントです。 クライアント グループは、RBAC モデルのプリンシパルを表します。

トピック空間は、一連のトピック テンプレート経由で複数のトピックを表します。 トピック テンプレートは MQTT フィルターの拡張機能であり、変数と MQTT ワイルドカードをサポートします。 各トピック空間は、同じクライアント セットが通信するために使用する必要があるトピックを表します。 トピック空間は、RBAC モデル内のリソースを表します。

アクセス許可バインドは、特定のトピック空間で表されるトピックに発行またはサブスクライブするための、特定のクライアント グループへのアクセスを許可します。 アクセス許可バインドは、RBAC モデルのロールを表します。

Diagram of the access control model.

例 :

次の要件に基づいてアクセス制御モデルを構成する方法の詳細を、次の例に示します。

例 1:

工場に複数の領域があり、各領域に相互に通信する必要があるマシンがあります。 ただし、工場の他の領域のマシンには、通信が許可されていません。

Client ロール トピック/トピック フィルター
Area1_Machine1 Publisher areas/area1/machines/machine1
Area1_Machine2 サブスクライバー (Subscriber) areas/area1/machines/#
Area2_Machine1 Publisher areas/area2/machines/machine1
Area2_Machine2 サブスクライバー (Subscriber) areas/area2/machines/#

構成

  • 各マシンのクライアント リソースを作成します。
  • 各工場領域のマシンのクライアント グループを作成します。
  • 領域のマシンが通信するトピックを表す各領域のトピック空間を作成します。
  • 各領域のクライアント グループに対して、対応する領域のトピック空間に発行およびサブスクライブするための 2 つのアクセス許可バインドを作成します。
Client クライアント グループ アクセス許可バインド トピック空間
Area1_Machine1 Area1Machines Area1-Pub Area1Messages -トピック テンプレート: areas/area1/machines/#
Area1_Machine2 Area1Machines Area1-Sub Area1Messages -トピック テンプレート: areas/area1/machines/#
Area2_Machine1 Area2Machines Area2-Pub Area2Messages -トピック テンプレート: areas/area2/machines/#
Area2_Machine2 Area2Machines Area2-Sub Area2Messages -トピック テンプレート: areas/area2/machines/#

例 2:

前の例について、追加の要件を想定しましょう。各領域にはマシンとともに管理クライアントがあり、マシンのいずれかが侵害された場合に備えて、発行するアクセス権をマシンに持たせないようにする必要があります。 一方、管理クライアントは、マシンにコマンドを送信するための発行アクセス権と、マシンからテレメトリを受信するためのサブスクライブ アクセス権を必要とします。

Client ロール トピック/トピック フィルター
Area1_Machine1 Publisher areas/area1/machines/machine1
サブスクライバー (Subscriber) areas/area1/mgmt/#
Area1_Mgmt1 Publisher areas/area1/mgmt/machine1
サブスクライバー (Subscriber) areas/area1/machines/#
Area2_Machine1 Publisher areas/area2/machines/machine1
サブスクライバー (Subscriber) areas/area2/mgmt/#
Area2_ Mgmt1 Publisher areas/area2/mgmt/machine1
サブスクライバー (Subscriber) areas/area2/machines/#

Configuration:

  • マシンと管理クライアントごとにクライアント リソースを作成します。
  • 領域ごとに 2 つのクライアント グループを作成します。1 つは管理クライアント用、もう 1 つはマシン用です。
  • 各領域に 2 つのトピック空間を作成します。1 つはテレメトリ トピックを、もう 1 つはコマンド トピックを表します。
  • 各領域の管理クライアントに対して、コマンド トピック空間への発行と、テレメトリ トピック空間へのサブスクライブの 2 つのアクセス許可バインドを作成します。
  • 各領域のマシンに対して、コマンド トピック空間へのサブスクライブと、テレメトリ トピック空間への発行の 2 つのアクセス許可バインドを作成します。
Client クライアント グループ アクセス許可バインド トピック/トピック フィルター
Area1_Machine1 Area1Machines Area1Machines-Pub Area1Telemetry -トピック テンプレート: areas/area1/machines/#
Area1Machines-Sub Area1Commands -トピック テンプレート: areas/area1/mgmt/#
Area1_MgmtClient1 Area1Mgmt Area1Mgmt-Pub Area1Commands -トピック テンプレート: areas/area1/mgmt/#
Area1Mgmt-Sub Area1Telemetry -トピック テンプレート: areas/area1/machines/#
Area2_Machine1 Area2Machines Area2Machines-Pub Area2Telemetry -トピック テンプレート: areas/area2/machines/#
Area2Machines-Sub Area2Commands -トピック テンプレート: areas/area2/mgmt/#
Area2_ MgmtClient1 Area2Mgmt Area2Mgmt-Pub Area2Commands -トピック テンプレート: areas/area2/mgmt/#
Area2Mgmt-Sub Area2Telemetry -トピック テンプレート: areas/area2/machines/#

詳細なアクセス制御

詳細なアクセス制御を使用すると、クライアント グループ内の各クライアントがそれ自体のトピックに発行またはサブスクライブすることの承認を制御できます。 この詳細なアクセス制御は、トピック テンプレートの変数を使用して実現されます。

クライアント グループは、そのすべてのトピック テンプレートを使用して特定のトピック空間にアクセスできますが、トピック テンプレート内の変数を使用すると、そのクライアント グループ内の各クライアントがそれ自体のトピックに発行またはサブスクライブすることの承認を制御できます。 たとえば、クライアント グループ "machines" に "machine1" と "machine2" の 2 つのクライアントが含まれているとします。 変数を使用すると、MQTT トピック "machines/machine1/telemetry" のみに対して machine1 のみがそのテレメトリを発行し、MQTT トピック "machines/machine2/telemetry" に対して "machine2" がメッセージを発行することを許可できます。

変数は、クライアント認証名またはクライアント属性を表します。 MQTT ブローカーとの通信中、各クライアントは MQTT トピックの変数を代入値に置き換えます。 たとえば、変数 ${client.authenticationName} は、各クライアントの認証名 (machine1、machine2 など) に置き換えられます。MQTT ブローカーは、認証名または指定した属性の値と一致する代入値を持つクライアントにのみアクセスを許可します。

たとえば、次のような構成があるとします。

  • クライアント グループ: マシン
  • トピック空間: MachinesTelemetry
    • トピック テンプレート "machines/${client.authenticationName}/telemetry"
  • アクセス許可バインド: クライアント グループ: マシン。トピック空間: machinesTelemetry。アクセス許可: 発行元

この構成では、クライアント認証名 "machine1" を持つクライアントのみがトピック "machines/machine1/telemetry" に発行でき、クライアント認証名 "machine 2" を持つマシンのみがトピック "machines/machine2/telemetry" に発行でき、以降同様になります。 したがって、machine2 は、同じトピック空間にアクセスできる場合でも、machine1 に代わって誤った情報を発行することはできず、その逆も同様です。

Diagram of the granular access control example.

次のステップ:

承認と認証の詳細について、次を参照してください。