Skip to content

MySQLとの統合

EMQXはパスワード認証のためにMySQLとの統合をサポートしています。

TIP

EMQX認証の基本概念についての知識

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

MySQL認証機能はほぼすべてのMySQLストレージスキーマに対応しています。ビジネス要件に応じて、認証情報の保存方法やアクセス方法を決定できます。例えば、1つまたは複数のテーブルやビューを使用することが可能です。

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

  • password_hash:必須。データベースに保存されているパスワード(平文またはハッシュ化されたもの)
  • salt:任意。salt = "" またはこのフィールドを削除すると、ソルト値が追加されないことを示します
  • is_superuser:任意。現在のクライアントがスーパーユーザーかどうかを示すフラグ。デフォルトは false

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

sql
CREATE TABLE `mqtt_user` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(100) DEFAULT NULL,
  `password_hash` varchar(100) DEFAULT NULL,
  `salt` varchar(35) DEFAULT NULL,
  `is_superuser` tinyint(1) DEFAULT 0,
  `created` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `mqtt_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

TIP

上記の例では、クエリに役立つ暗黙のUNIQUEインデックスフィールド(username)が作成されています。
システム内のユーザー数が多い場合は、クエリの応答時間を短縮しEMQXの負荷を軽減するために、事前にテーブルの最適化とインデックス設定を行ってください。

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

例えば、スーパーユーザー(is_superuser: true)で、ユーザー名がemqx_u、パスワードがpublic、ソルトがslat_foo123(接尾辞)、パスワードハッシュがsha256の場合、クエリ文は以下のようになります:

bash
mysql> INSERT INTO mqtt_user(username, password_hash, salt, is_superuser) VALUES ('emqx_u', SHA2(concat('public', 'slat_foo123'), 256), 'slat_foo123', 1);
Query OK, 1 row affected (0,01 sec)

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

sql
password_hash_algorithm {
    name = sha256
    salt_position = suffix
}

query = "SELECT password_hash, salt, is_superuser FROM mqtt_user WHERE username = ${username} LIMIT 1"

ダッシュボードでの設定

EMQXダッシュボードを使って、MySQLをパスワード認証に利用する設定が可能です。

  1. EMQXダッシュボードの左側ナビゲーションメニューから アクセス制御 -> 認証 をクリックします。
  2. 認証 ページの右上にある 作成 をクリックします。
  3. メカニズムパスワードベース を選択し、バックエンドMySQL を選択すると、以下のように 設定 タブが表示されます。
MySQLによる認証
  1. 以下の手順に従い認証バックエンドを設定します:

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

      • サーバー:EMQXが接続するサーバーのアドレス(host:port)を指定します。

      • データベース:MySQLのデータベース名。

      • ユーザー名:ユーザー名を指定します。

      • パスワード:ユーザーパスワードを指定します。

      • 認証設定:認証に関する設定を行います:

        • パスワードハッシュ:平文パスワードに適用され、データベースに保存される前のハッシュアルゴリズムを選択します。利用可能なオプションは plainmd5shasha256sha512bcryptpbkdf2 です。選択したアルゴリズムに応じて追加設定があります:
          • md5shasha256sha512 の場合:
            • ソルト位置:ソルト(ランダムデータ)をパスワードにどのように混ぜるかを指定します。suffix(接尾辞)、prefix(接頭辞)、disable(無効)のいずれかです。外部ストレージからEMQX組み込みデータベースにユーザー認証情報を移行する場合を除き、デフォルト値のままで問題ありません。
            • ハッシュ結果は16進数文字列として表現され、大文字小文字を区別せずに保存された認証情報と比較されます。
          • plain の場合:
            • ソルト位置disable に設定してください。
          • bcrypt の場合:
            • ソルトラウンド数:ハッシュ関数の適用回数を定義します。値は 2のソルトラウンド数乗 で表され、「コストファクター」とも呼ばれます。デフォルトは 10、許容範囲は 5 から 10 です。セキュリティ強化のためにはより高い値を推奨します。注:コストファクターを1増やすと認証にかかる時間が2倍になります。
          • pbkdf2 の場合:
            • 疑似乱数関数:キー生成に用いるハッシュ関数を選択します(例:sha256)。
            • 反復回数:ハッシュ関数の実行回数を設定します。デフォルトは 4096 です。
            • 派生キー長(任意):生成されるキーのバイト長を指定します。空欄の場合は選択した疑似乱数関数のデフォルト長になります。
            • ハッシュ結果は16進数文字列として表現され、大文字小文字を区別せずに保存された認証情報と比較されます。
      • 前提条件Variform式で記述し、このMySQL認証器をクライアント接続に適用するかどうかを制御します。式はクライアントの属性(usernameclientidlistenerなど)に対して評価され、結果が文字列の "true" の場合のみ認証器が呼び出されます。それ以外の場合はスキップされます。前提条件の詳細は認証の前提条件を参照してください。

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

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

      • 詳細設定:同時接続数や接続タイムアウトまでの待機時間を設定します。

        • コネクションプールサイズ(任意):EMQXノードからMySQLへの同時接続数を整数で指定します。デフォルトは 8 です。
        • クエリタイムアウト(任意):EMQXが接続のタイムアウトとみなすまでの待機時間を指定します。単位はミリ秒、秒、分、時間が利用可能です。デフォルトは 5 秒です。
  2. 設定が完了したら、作成 をクリックします。

設定ファイルによる構成

EMQXの設定項目を使ってMySQL認証器を構成することも可能です。

MySQL認証は mechanism = password_based および backend = mysql で識別されます。

設定例:

bash
{
  backend = "mysql"
  mechanism = "password_based"

  server = "127.0.0.1:3306"
  username = "root"
  database = "mqtt_user"
  password = ""
  pool_size = 8

  password_hash_algorithm {name = "sha256", salt_position = "suffix"}
  query = "SELECT password_hash, salt FROM mqtt_user where username = ${username} LIMIT 1"
  query_timeout = "5s"
}