Skip to content

MySQLとの統合

このオーソライザーは、MySQLデータベースに格納されたルールのリストとパブリッシュ/サブスクリプション要求を照合することで認可チェックを実装します。

前提条件

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

データスキーマとクエリ文

MySQLオーソライザーはほぼあらゆるストレージスキーマをサポートします。認証情報の保存方法やアクセス方法はビジネスニーズに応じて自由に決められます。例えば、単一または複数のテーブルやビューを使用することが可能です。

ユーザーはクエリ文のテンプレートを提供し、以下のフィールドを含むようにしてください:

  • permission はルールが一致した場合に適用されるアクションを指定します。deny または allow のいずれかである必要があります。
  • action はルールが関連する要求を指定します。publishsubscribe、または all のいずれかである必要があります。
  • topic はルールに関連するトピックフィルターを指定します。ワイルドカードおよびトピックプレースホルダーをサポートする文字列である必要があります。
  • qos(オプション)はルールが適用されるQoSレベルを指定します。値は 012 のいずれか、またはカンマ区切りの文字列(例:0,1)で複数指定可能です。デフォルトはすべてのQoSレベルです。
  • retain(オプション)は現在のルールがリテインメッセージをサポートするかどうかを指定します。値は 0 または 1 で、デフォルトはリテインメッセージを許可します。

認証情報を格納するためのテーブル構造例:

sql
CREATE TABLE `mqtt_acl` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `ipaddress` VARCHAR(60) NOT NULL DEFAULT '',
  `username` VARCHAR(255) NOT NULL DEFAULT '',
  `clientid` VARCHAR(255) NOT NULL DEFAULT '',
  `action` ENUM('publish', 'subscribe', 'all') NOT NULL,
  `permission` ENUM('allow', 'deny') NOT NULL,
  `topic` VARCHAR(255) NOT NULL DEFAULT '',
  `qos` tinyint(1),
  `retain` tinyint(1),
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

TIP

システム内のユーザー数が多い場合は、クエリ応答時間を短縮しEMQXの負荷を軽減するために、事前にテーブルの最適化とインデックス付けを行ってください。

このテーブルでは、MQTTユーザーは username で識別されます。

例えば、ユーザー user123 に対して data/user123/# トピックのパブリッシュを許可する認可ルールを追加したい場合、クエリ文は以下のようになります。

bash
mysql> INSERT INTO mqtt_acl(username, permission, action, topic, ipaddress) VALUES ('user123', 'allow', 'publish', 'data/user123/#', '127.0.0.1');
Query OK, 1 row affected (0,01 sec)

対応する設定パラメータは以下の通りです。

bash
query = "SELECT action, permission, topic, ipaddress, qos, retain FROM mqtt_acl where username = ${username} and ipaddress = ${peerhost}"

ダッシュボードでの設定

EMQXダッシュボードを使ってMySQLをユーザー認可に利用する設定が可能です。

  1. EMQXダッシュボードの左側ナビゲーションツリーで アクセス制御 -> 認可 をクリックし、認可 ページに入ります。

  2. 右上の 作成 をクリックし、バックエンドMySQL を選択してから 次へ をクリックします。以下のように 設定 タブが表示されます。

    authz-MySQL_ee
  3. 以下の指示に従い認可バックエンドを設定します:

    • MySQLへの接続情報を入力します。

      • サーバー:EMQXが接続するサーバーアドレス(host:port)を指定します。
      • データベース:MySQLのデータベース名。
      • ユーザー名:ユーザー名を指定します。
      • パスワード:ユーザーパスワードを指定します。
    • 前提条件:任意のVariform式を入力します。この式が true と評価された場合のみEMQXはこのオーソライザーを呼び出します。詳細はオーソライザの前提条件を参照してください。

    • TLSを有効化:TLSを有効にする場合はトグルスイッチをオンにします。TLS有効化の詳細はネットワークとTLSを参照してください。

    • SQL:データスキーマに基づいてクエリ文を入力します。詳細はデータスキーマとクエリ文を参照してください。

    • 詳細設定:接続プール、タイムアウト、プリペアドステートメントの動作を設定します。

      • 接続プールサイズ(任意):EMQXノードからMySQLへの同時接続数を整数で指定します。デフォルトは 8 です。
      • 接続タイムアウト(任意):接続試行がタイムアウトとみなされるまでの待機時間を指定します。ミリ秒、秒、分、時間の単位が利用可能です。デフォルトは 15 秒です。
      • プリペアドステートメントを無効化(任意):データベースクエリでプリペアドステートメントの使用を無効にします。MySQLプロキシやミドルウェア(例:PGBouncerやSupabaseのトランザクションモード)がセッションレベルの機能(プリペアドステートメントなど)をサポートしない場合に有効にしてください。デフォルトは無効です。
  4. 作成 をクリックして設定を完了します。

設定項目による設定

EMQXの設定項目でMySQLオーソライザーを設定することも可能です。

MySQLオーソライザーは mysql タイプで識別されます。設定パラメータの全リストはEMQX Enterprise設定マニュアルを参照してください。

オプションの precondition 設定項目はVariform式を受け付けます。この式が true と評価された場合のみEMQXはこのオーソライザーを呼び出します。precondition が省略または空の場合は前提条件は適用されません。詳細はオーソライザの前提条件を参照してください。

設定例:

bash
{
  type = mysql

  database = "mqtt"
  username = "root"
  password = "public"
  server = "127.0.0.1:3306"
  query = "SELECT permission, action, topic FROM mqtt_acl WHERE username = ${username}"
  connect_timeout = "15s"
  disable_prepared_statements = false
}