Skip to content

PostgreSQLとの統合

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

前提条件

EMQX認可の基本概念の知識

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

PostgreSQLオーソライザーはほぼあらゆるストレージスキーマをサポートしています。ACLルールの保存方法やアクセス方法は、ユーザーが1つまたは複数のテーブルやビューなどを使って自由に決めることができます。

ユーザーはクエリ文のテンプレートを提供し、以下のフィールドが含まれていることを保証する必要があります:

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

資格情報を保存するためのテーブル構造の例:

sql
CREATE TABLE mqtt_acl(
  id serial PRIMARY KEY,
  username text NOT NULL,
  permission text NOT NULL,
  action text NOT NULL,
  topic text NOT NULL,
  qos smallint,
  retain smallint
);
CREATE INDEX mqtt_acl_username_idx ON mqtt_acl(username);

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

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

bash
postgres=# INSERT INTO mqtt_acl(username, permission, action, topic, ipaddress) VALUES ('user123', 'allow', 'publish', 'data/user123/#', '127.0.0.1');
INSERT 0 1

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

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

ダッシュボードでの設定

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

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

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

    authz-PostgreSQL_ee
  3. 以下の指示に従って認可バックエンドを設定してください:

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

      • サーバー:EMQXが接続するサーバーのアドレス(host:port)を指定します。
      • データベース:PostgreSQLのデータベース名。
      • ユーザー名:ユーザー名を指定します。
      • パスワード:ユーザーパスワードを指定します。
    • TLSを有効にする:TLSを有効にしたい場合はトグルスイッチをオンにします。TLS有効化の詳細はネットワークとTLSを参照してください。

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

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

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

設定項目による設定

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

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

設定例:

bash
{
  type = postgresql

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