Skip to content

組み込みデータベースの使用 ​

EMQX は、組み込みデータベースを通じて低コストで即時利用可能な認可ルールの保存方法を提供しています。Dashboard または設定ファイルで組み込みデータベース(Mnesia)をデータソースとして設定し、Dashboard または HTTP API を通じて関連する認可チェックルールを追加できます。

前提条件

EMQX 認可の基本概念の知識が必要です。

Dashboard で組み込みデータベース認可者を作成する ​

  1. EMQX Dashboard の左メニューから アクセス制御 > 認可 に移動し、認可 ページを開きます。

  2. 右上の 作成 をクリックし、バックエンド に 組み込みデータベース を選択してから 次へ をクリックします。

    authz-mnesia_ee

  3. 設定 ステップで以下のオプションを設定します:

    • 最大ルール数: クライアントまたはユーザーごとに許可される最大認可ルール数を設定します。デフォルトは 100 です。
    • 前提条件: 任意の Variform 式を入力します。EMQX はこの式が true と評価された場合のみこの認可者を呼び出します。詳細は 認可者の前提条件 を参照してください。

    注意

    ルール数を多く設定するとシステムパフォーマンスに影響を与える可能性があります。

  4. 作成 をクリックして設定を完了します。

設定ファイルで組み込みデータベース認可者を作成する ​

組み込みデータベース認可者は type = built_in_database で識別されます。

設定例:

bash
{
    type = built_in_database
    enable = true
}
  • type: 認可チェッカーのデータソースタイプ。ここには built_in_database を指定します。

  • enable: このチェッカーを有効化するかどうか。オプション値は true または false。

  • precondition: 任意の Variform 式。EMQX はこの式が true と評価された場合のみこの認可者を呼び出します。precondition が省略または空の場合は前提条件は適用されません。詳細は 認可者の前提条件 を参照してください。

認可ルールの作成 ​

認可ルールは Dashboard または API を通じて作成できます。

Dashboard で認可ルールを作成する ​

EMQX Dashboard の 組み込みデータベース バックエンドの パーミッション ページから直接認可ルールを定義できます。

パーミッションページへのアクセス ​

  1. Dashboard の 認可 ページに移動します。
  2. 組み込みデータベース バックエンドの 操作 列で パーミッション をクリックします。

authz-mnesia-rule

認可ルールのスコープ ​

認可ルールは以下の3つのスコープで設定可能です:

  • クライアントID: 特定のクライアントIDに適用。
  • ユーザー名: 特定のユーザー名に適用。
  • すべてのユーザー: すべてのクライアント/ユーザーに適用。パターンやIP範囲でフィルタリング可能。

共通ルールフィールド ​

すべてのルールタイプで利用可能なフィールドは以下の通りです:

フィールド説明
アクションルールが適用される操作タイプ。選択肢:Publish、Subscribe、Publish & Subscribe。
パーミッション操作を許可するか拒否するか。選択肢:Allow、Deny。
トピックこのルールが適用される MQTT トピック。ワイルドカード(+、#)対応。
QoS許可される QoS レベル。複数選択可:0、1、2。
リテインルールがリテインメッセージに適用されるかどうか。選択肢:true、false、All。
IPアドレス範囲このルールが適用されるクライアントのIP範囲。CIDR表記(例:192.168.1.0/24)や特定IP指定が可能。
リスナーこのルールが適用されるリスナー。{type}:{name} 形式で指定(例:tcp:default、ws:default)。
ゾーンルールが有効となるゾーン。マルチゾーン環境で適用可能。

スコープ別フィールド ​

ルールスコープフィールド
クライアントIDクライアントID: (必須)このルールが適用される正確なクライアントID。
ユーザーパターン: (任意)このルールが有効なユーザー名をマッチさせる正規表現。
ユーザー名ユーザー名: (必須)このルールが適用される正確なユーザー名。
クライアントIDパターン: (任意)このルールが有効なクライアントIDをマッチさせる正規表現。
すべてのユーザークライアントIDパターン: (任意)このルールが有効なクライアントIDをマッチさせる正規表現。
ユーザーパターン: (任意)このルールが有効なユーザー名をマッチさせる正規表現。

パターン例:

  • ^device-user-.*:device-user- で始まるユーザー名にマッチ。
  • ^sensor-.*:sensor- で始まるクライアントIDにマッチ。

ルールの追加 ​

  1. パーミッション ページで対象のタブ(クライアントID、ユーザー名、すべてのユーザー)を選択します。
  2. 追加 をクリックします。
  3. 共通フィールドおよびスコープ別フィールドを入力します。
  4. (任意)複数ルールを追加する場合は パーミッションを追加 をクリックし、上へ、下へ ボタンでルールの実行順序を調整します。
  5. 追加 をクリックしてルールを保存します。

複数ルールの管理(すべてのユーザーのみ) ​

すべてのユーザー ルールは、操作 列の その他 メニューからルールの順序を変更できます:

  • 上へ移動
  • 下へ移動
  • 先頭へ移動
  • 末尾へ移動

ルールは上から順に評価されるため、順序が優先度を決定します。

ルールの編集・管理 ​

パーミッション ページで既存ルールの編集や削除が可能です:

  • 対応するルールの 操作 列で 編集 ボタンをクリックし、ルールフィールド、マッチパターン、IP範囲設定を変更できます。
  • 削除 ボタンをクリックするとルールを削除します。

REST API で認可ルールを作成する ​

REST API を通じても認可ルールを管理できます。API エンドポイントは Dashboard の3つのスコープ(ユーザー名、クライアントID、すべてのユーザー)に対応しています。

エンドポイント ​

  • ユーザー名ルール
    • POST /authorization/sources/built_in_database/rules/users: ユーザーのルール作成。
    • PUT /authorization/sources/built_in_database/rules/users/:username: 特定ユーザーのルール置換。
  • クライアントIDルール
    • POST /authorization/sources/built_in_database/rules/clients: クライアントのルール作成。
    • PUT /authorization/sources/built_in_database/rules/clients/:clientid: 特定クライアントのルール置換。
  • すべてのユーザールール
    • POST /authorization/sources/built_in_database/rules/all: すべてのクライアント/ユーザーに適用されるグローバルルールの作成または置換。
    • PUT リクエストはなく、POST で全ルールを更新または作成します。

ステップ1: 認証トークンの取得 ​

以下の例は、ローカルの Dashboard 管理者資格情報を使ってベアラートークンを取得し、管理用 REST API を呼び出して組み込みデータベース認可ソースとルールを作成する手順です。このトークンは REST API 呼び出しの認証に使われ、認可ルールが適用される MQTT クライアントの認証ではありません。

パスワードベースのトークン取得には dashboard.password_login = both が必要で、これはデフォルト設定です。dashboard.password_login が scram_only の場合は、SCRAM チャレンジレスポンス認証でトークンを取得してください。

bash
export EMQX_TOKEN=$(curl --silent -X 'POST' "http://localhost:18083/api/v5/login" \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"username": "admin","password": "public"}' | jq -r ".token")

ステップ2: 組み込みデータベース認可ソースの作成 ​

ルール作成前に、組み込みデータベース認可ソースが作成されていることを確認してください。

bash
curl -X 'POST' \
  'http://localhost:18083/api/v5/authorization/sources' \
  -H "Authorization: Bearer $EMQX_TOKEN" \
  -H 'Accept: */*' \
  -H 'Content-Type: application/json' \
  -d '{
        "enable": true,
        "max_rules": 100,
        "type": "built_in_database"
  }'

ステップ3: 認可ルールの作成 ​

以下のようにルールを作成できます:

  • 特定のクライアントIDによるルール作成:

    bash
    curl -X 'POST' \
      'http://localhost:18083/api/v5/authorization/sources/built_in_database/rules/clients' \
      -H "Authorization: Bearer $EMQX_TOKEN" \
      -H 'Accept: */*' \
      -H 'Content-Type: application/json' \
      -d '[
      {
        "clientid": "client1",
        "rules": [
          {
            "action": "publish",
            "permission": "allow",
            "topic": "test/topic/1"
          },
          {
            "action": "subscribe",
            "permission": "allow",
            "topic": "test/topic/2"
          },
          {
            "action": "all",
            "permission": "deny",
            "topic": "eq test/#"
          }
        ]
      }
    ]'
  • 特定のユーザー名によるルール作成:

    bash
    curl -X 'POST' \
      'http://localhost:18083/api/v5/authorization/sources/built_in_database/rules/users' \
      -H "Authorization: Bearer $EMQX_TOKEN" \
      -H 'Accept: */*' \
      -H 'Content-Type: application/json' \
      -d '[
      {
        "username": "user1",
        "rules": [
          {
            "topic": "v1/devices/#",
            "permission": "allow",
            "action": "publish",
            "qos": [0,1,2],
            "retain": "all"
          }
        ]
      }
    ]'

例: ユーザーのルールを更新する ​

bash
curl -X PUT 'http://localhost:18083/api/v5/authorization/sources/built_in_database/rules/users/user1' \
  -H "Authorization: Bearer $EMQX_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "username": "user1",
    "rules": [
      {
        "topic": "v1/devices/+/state",
        "permission": "allow",
        "action": "subscribe",
        "qos": [0,1],
        "retain": "all"
      }
    ]
  }'

例: すべてのユーザーに対するルールを作成する ​

bash
curl -X POST 'http://localhost:18083/api/v5/authorization/sources/built_in_database/rules/all' \\
  -H "Authorization: Bearer $EMQX_TOKEN" \\
  -H 'Content-Type: application/json' \\
  -d '[
    {
      "rules": [
        {
          "topic": "v1/#",
          "permission": "deny",
          "action": "all"
        }
      ]
    }
  ]'

ルールフィールド ​

各ルールには以下のフィールドを含めることができます:

フィールド説明
username / clientidこのルールが適用される正確なユーザー名またはクライアントID(エンドポイントに依存)。
topicこのルールが適用される MQTT トピック。ワイルドカード(+、#)およびトピックプレースホルダー対応。
permission現在のクライアント/ユーザーからの操作要求を許可するか拒否するか。選択肢:allow、deny。
action操作タイプ。選択肢:publish、subscribe、all。
qos(任意)許可される QoS レベル。例:[0,1]。デフォルトはすべてのレベル。
retain(任意)ルールがリテインメッセージに適用されるかどうか。選択肢:true、false、all。