MQTT ブローカー認可を構成する
重要
Azure Arc によって実現されている Azure IoT Operations プレビューは、現在プレビュー段階です。 運用環境ではこのプレビュー ソフトウェアを使わないでください。
Azure IoT Operations の一般公開リリースが提供されたときには、新規インストールをデプロイすることが必要になります。 プレビュー インストールからのアップグレードはできません。
ベータ版、プレビュー版、または一般提供としてまだリリースされていない Azure の機能に適用される法律条項については、「Microsoft Azure プレビューの追加使用条件」を参照してください。
認可ポリシーは、クライアントがブローカーに対して実行できるアクション (トピックへの接続、パブリッシュ、サブスクライブなど) を決定します。 BrokerAuthorization リソースを使用して 1 つまたは複数の認可ポリシーを使用するように MQTT ブローカーを構成します。 各 BrokerAuthorization リソースには、認可ポリシーのプリンシパルとリソースを指定する規則のリストが含まれています。
BrokerAuthorization を BrokerListener にリンクする
BrokerListener を BrokerAuthorization リソースにリンクするには、BrokerListener リソースの ports
設定で authenticationRef
フィールドを指定します。 BrokerAuthentication と同様に、BrokerAuthorization リソースは複数の BrokerListener ポートにリンクできます。 認可ポリシーは、リンクされているすべてのリスナー ポートに適用されます。 ただし、BrokerAuthentication と比べて 1 つの重要な違いがあります。
重要
BrokerAuthorization の構成をリスナー ポートに適用するには、少なくとも 1 つの BrokerAuthentication がそのリスナー ポートにリンクされている必要もあります。
BrokerListener について詳しくは、BrokerListener リソースに関する記事をご覧ください。
承認規則
認可を構成するには、Kubernetes クラスターに BrokerAuthorization リソースを作成します。 以下のセクションでは、ユーザー名、属性、X.509 証明書、Kubernetes サービス アカウント トークン (SAT) を使用するクライアントの認可を構成する方法の例を示します。 使用できる設定の一覧については、Broker Authorization API リファレンスを参照してください。
次の例では、ユーザー名と属性の両方を使って BrokerAuthorization リソースを作成する方法を示します。
Azure portal で、IoT Operations インスタンスに移動します。
[Azure IoT Operations リソース] で、[MQTT ブローカー] を選択します。
承認タブを選択します。
既存の認証ポリシーを選択するか、[Create authorization policy]\(認証ポリシーの作成\) を選択して新しく作成します。
このブローカー認可を使用すると、ユーザー名 temperature-sensor
または humidity-sensor
のクライアント、または値が contoso
の属性 organization
および値が seattle
の属性 city
を持つクライアントは、次の操作を実行できます。
- ブローカーに接続する。
- ユーザー名と組織をスコープとした telemetry トピックにメッセージを発行する。 例:
temperature-sensor
は、/telemetry/temperature-sensor
および/telemetry/contoso
に発行できます。humidity-sensor
は、/telemetry/humidity-sensor
および/telemetry/contoso
に発行できます。some-other-username
は、/telemetry/contoso
に発行できます。
- 組織をスコープとした commands トピックをサブスクライブする。 例:
temperature-sensor
は、/commands/contoso
をサブスクライブできます。some-other-username
は、/commands/contoso
をサブスクライブできます。
クライアント ID に基づいてアクセスをさらに制限する
principals
フィールドは論理 OR であるため、clientIds
フィールドを brokerResources
フィールドに追加すると、クライアント ID に基づいてアクセスをさらに制限できます。 たとえば、建物番号で始まるクライアント ID を持つクライアントが建物をスコープとするトピックに接続してテレメトリを発行できるようにするには、次の構成を使います。
承認ポリシーの [Broker authorization details]\(ブローカー承認の詳細\) で、次の構成を使用します。
[
{
"brokerResources": [
{
"clientIds": [
"{principal.attributes.building}*"
],
"method": "Connect",
"topics": []
},
{
"clientIds": [],
"method": "Publish",
"topics": [
"sensors/{principal.attributes.building}/{principal.clientId}/telemetry"
]
}
],
"principals": {
"attributes": [
{
"building": "building22"
},
{
"building": "building23"
}
]
}
}
]
ここで、clientIds
が Connect
メソッドで設定されなかった場合は、building
属性が building22
または building23
に設定されてさえいれば、どのようなクライアント ID を持つクライアントであっても接続できます。 clientIds
フィールドを追加すると、クライアント ID が building22
または building23
で始まるクライアントのみが接続できます。 これにより、クライアントが正しい属性を持つことだけでなく、クライアント ID が必要なパターンと一致することが保証されます。
X.509 認証を使用するクライアントを承認する
認証に X.509 証明書を使用するクライアントは、証明書に存在する X.509 プロパティまたはチェーン上の発行元証明書に基づいてリソースへのアクセスの承認を受けることができます。
属性の使用
クライアントの証明書、そのルート CA、または中間 CA のプロパティに基づいてルールを作成するには、BrokerAuthorization リソースで X.509 属性を定義します。 詳細については、「証明書の属性」を参照してください。
クライアント証明書のサブジェクト共通名をユーザー名として使用
クライアント証明書のサブジェクト共通名 (CN) のみに基づいて認可ポリシーを作成するには、CN に基づいて規則を作成します。
たとえば、クライアントにサブジェクト CN = smart-lock
を持つ証明書がある場合、そのユーザー名は smart-lock
になります。 その後、通常どおりに認可ポリシーを作成します。
Kubernetes サービス アカウント トークンを使用するクライアントを認可する
SAT の認可属性は、サービス アカウント注釈の一部として設定されます。 たとえば、group
という名前の認可属性を値 authz-sat
で追加するには、次のコマンドを実行します。
kubectl annotate serviceaccount mqtt-client aio-broker-auth/group=authz-sat
属性の注釈は、他の注釈と区別するために、aio-broker-auth/
で始まる必要があります。
アプリケーションには authz-sat
という名前の認可属性があるため、clientId
や username
を指定する必要はありません。 対応する BrokerAuthorization リソースでは、この属性がプリンシパルとして使用されます。次に例を示します。
承認ポリシーの [Broker authorization details]\(ブローカー承認の詳細\) で、次の構成を使用します。
[
{
"brokerResources": [
{
"clientIds": [],
"method": "Connect",
"topics": []
},
{
"clientIds": [],
"method": "Publish",
"topics": [
"odd-numbered-orders"
]
},
{
"clientIds": [],
"method": "Subscribe",
"topics": [
"orders"
]
}
],
"principals": {
"attributes": [
{
"group": "authz-sat"
}
]
}
}
]
例の詳細については、「Dapr クライアントを使用して認可ポリシーを設定する」を参照してください。
分散状態ストア
MQTT ブローカーは、クライアントが状態を格納するために使用できる分散状態ストア (DSS) を提供します。 可用性が高くなるように DSS を構成することもできます。
DSS を使用するクライアントの認可を設定するには、次のアクセス許可を指定します。
- システム キー値ストア
$services/statestore/_any_/command/invoke/request
トピックに発行するためのアクセス許可 - 応答トピック (パラメーターとして最初の発行時に設定される)
<response_topic>/#
をサブスクライブするためのアクセス許可
DSS 認可についての詳細は、状態ストア キーに関するセクションを参照してください。
認可を更新する
ブローカー認可リソースは、再起動せずに実行時に更新できます。 ポリシーの更新時に接続されているすべてのクライアントは切断されます。 ポリシーの種類の変更もサポートされています。
kubectl edit brokerauthorization my-authz-policies
認可を無効にする
- Azure portal で、IoT Operations インスタンスに移動します。
- [Azure IoT Operations リソース] で、[MQTT ブローカー] を選択します。
- 編集するブローカー リスナーを一覧から選択します。
- 承認を無効にするポートで、承認ドロップダウンの [なし] を選択します。
MQTT 3.1.1 での未承認の発行
MQTT 3.1.1 では、発行が拒否されると、このプロトコル バージョンではエラー コードを返すことがサポートされていないため、クライアントはエラーなしで PUBACK を受け取ります。 MQTTv5 では、発行が拒否されると理由コード 135 (未承認) で PUBACK が返されます。