MySQLとの統合
EMQXはパスワード認証のためにMySQLとの統合をサポートしています。
TIP
EMQX認証の基本概念についての知識
データスキーマとクエリ文
MySQL認証機能はほぼすべてのMySQLストレージスキーマに対応しています。ビジネス要件に応じて、認証情報の保存方法やアクセス方法を決定できます。例えば、1つまたは複数のテーブルやビューを使用することが可能です。
ユーザーはクエリ文のテンプレートを提供し、以下のフィールドが含まれていることを確認する必要があります:
password_hash
:必須。データベースに保存されているパスワード(平文またはハッシュ化されたもの)salt
:任意。salt = ""
またはこのフィールドを削除すると、ソルト値が追加されないことを示しますis_superuser
:任意。現在のクライアントがスーパーユーザーかどうかを示すフラグ。デフォルトはfalse
認証情報を保存するためのテーブル構造の例:
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
の場合、クエリ文は以下のようになります:
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)
対応する設定パラメータは以下の通りです:
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をパスワード認証に利用する設定が可能です。
- EMQXダッシュボードの左側ナビゲーションメニューから アクセス制御 -> 認証 をクリックします。
- 認証 ページの右上にある 作成 をクリックします。
- メカニズムで パスワードベース を選択し、バックエンドで MySQL を選択すると、以下のように 設定 タブが表示されます。

以下の手順に従い認証バックエンドを設定します:
接続:MySQLへの接続情報を入力します。
サーバー:EMQXが接続するサーバーのアドレス(
host:port
)を指定します。データベース:MySQLのデータベース名。
ユーザー名:ユーザー名を指定します。
パスワード:ユーザーパスワードを指定します。
認証設定:認証に関する設定を行います:
- パスワードハッシュ:平文パスワードに適用され、データベースに保存される前のハッシュアルゴリズムを選択します。利用可能なオプションは
plain
、md5
、sha
、sha256
、sha512
、bcrypt
、pbkdf2
です。選択したアルゴリズムに応じて追加設定があります:md5
、sha
、sha256
、sha512
の場合:- ソルト位置:ソルト(ランダムデータ)をパスワードにどのように混ぜるかを指定します。
suffix
(接尾辞)、prefix
(接頭辞)、disable
(無効)のいずれかです。外部ストレージからEMQX組み込みデータベースにユーザー認証情報を移行する場合を除き、デフォルト値のままで問題ありません。 - ハッシュ結果は16進数文字列として表現され、大文字小文字を区別せずに保存された認証情報と比較されます。
- ソルト位置:ソルト(ランダムデータ)をパスワードにどのように混ぜるかを指定します。
plain
の場合:- ソルト位置は
disable
に設定してください。
- ソルト位置は
bcrypt
の場合:- ソルトラウンド数:ハッシュ関数の適用回数を定義します。値は 2のソルトラウンド数乗 で表され、「コストファクター」とも呼ばれます。デフォルトは
10
、許容範囲は5
から10
です。セキュリティ強化のためにはより高い値を推奨します。注:コストファクターを1増やすと認証にかかる時間が2倍になります。
- ソルトラウンド数:ハッシュ関数の適用回数を定義します。値は 2のソルトラウンド数乗 で表され、「コストファクター」とも呼ばれます。デフォルトは
pbkdf2
の場合:- 疑似乱数関数:キー生成に用いるハッシュ関数を選択します(例:
sha256
)。 - 反復回数:ハッシュ関数の実行回数を設定します。デフォルトは
4096
です。 - 派生キー長(任意):生成されるキーのバイト長を指定します。空欄の場合は選択した疑似乱数関数のデフォルト長になります。
- ハッシュ結果は16進数文字列として表現され、大文字小文字を区別せずに保存された認証情報と比較されます。
- 疑似乱数関数:キー生成に用いるハッシュ関数を選択します(例:
- パスワードハッシュ:平文パスワードに適用され、データベースに保存される前のハッシュアルゴリズムを選択します。利用可能なオプションは
前提条件:Variform式で記述し、このMySQL認証器をクライアント接続に適用するかどうかを制御します。式はクライアントの属性(
username
、clientid
、listener
など)に対して評価され、結果が文字列の"true"
の場合のみ認証器が呼び出されます。それ以外の場合はスキップされます。前提条件の詳細は認証の前提条件を参照してください。TLSを有効化:TLSを有効にする場合はスイッチをオンにします。TLS有効化の詳細はネットワークとTLSを参照してください。
SQL:データスキーマに従ってクエリ文を入力します。詳細はSQLデータスキーマとクエリ文を参照してください。
詳細設定:同時接続数や接続タイムアウトまでの待機時間を設定します。
- コネクションプールサイズ(任意):EMQXノードからMySQLへの同時接続数を整数で指定します。デフォルトは
8
です。 - クエリタイムアウト(任意):EMQXが接続のタイムアウトとみなすまでの待機時間を指定します。単位はミリ秒、秒、分、時間が利用可能です。デフォルトは
5
秒です。
- コネクションプールサイズ(任意):EMQXノードからMySQLへの同時接続数を整数で指定します。デフォルトは
設定が完了したら、作成 をクリックします。
設定ファイルによる構成
EMQXの設定項目を使ってMySQL認証器を構成することも可能です。
MySQL認証は mechanism = password_based
および backend = mysql
で識別されます。
設定例:
{
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"
}