REST APIベースのMQTT 5.0 SCRAM認証
EMQXはREST APIを使用したMQTT 5.0の拡張認証をサポートしており、Salted Challenge Response Authentication Mechanism(SCRAM)を実装しています。このSCRAM認証機構は、認証に必要なデータを取得するために外部のWebリソースを利用します。有効化されている場合、クライアントがSCRAMで接続要求を開始すると、EMQXは提供されたユーザー名を用いて外部サービスへHTTPリクエストを構築し、認証プロセスに必要な認証データを取得します。
SCRAM自体は軽量かつシンプルな認証方式ですが、本実装では外部REST APIとの連携により機能を拡張しています。これによりEMQXは様々な外部システムから安全かつ効率的に認証データを取得でき、より複雑な認証シナリオに対応可能です。
前提条件
- EMQXの基本的な認証概念に関する理解
- SCRAM認証機構はMQTT 5.0接続のみ対応
- 本認証機構はRFC 7804のSalted Challenge Response HTTP Authentication Mechanismの実装ではありません
HTTPリクエストとレスポンス
認証プロセスはHTTP APIコールに類似しています。EMQXはクライアントとして動作し、外部HTTPサービスへHTTPリクエストを構築・送信します。サービスはusernameに対応する認証データを含むレスポンスを返します。
レスポンスフォーマット要件
認証成功のため、HTTPレスポンスは以下の条件を満たす必要があります。
- Content-Type: レスポンスは
application/jsonでエンコードされていること。 - 認証データ:
stored_key、server_key、saltを含み、すべて16進数でエンコードされていること。 - スーパーユーザー指標:
is_superuserフィールドを使用し、値はtrueまたはfalse。 - クライアント属性: 任意で
client_attrsフィールドにクライアント属性を指定可能。キー・値は文字列である必要があります。 - アクセス制御リスト(ACL): 任意で
aclフィールドにクライアントの権限を定義可能。詳細はアクセス制御リストを参照してください。 - 有効期限: 任意で
expire_atフィールドに認証の有効期限(Unixタイムスタンプ秒単位)を設定可能。期限切れ後はクライアントは切断され再認証が必要です。 - HTTPステータスコード: HTTPレスポンスは
200 OKである必要があります。4xxまたは5xxのステータスコードはignoreとして扱われ、この認証機構はスキップされます。
HTTPレスポンス例
以下は期待されるHTTPレスポンスの構造と内容の例です。
HTTP/1.1 200 OK
Headers: Content-Type: application/json
...
Body:
{
"stored_key": "008F5E0CC6316BB172F511E93E4756EEA876B5B5125F1CD2FD69A2C30F9A0D73",
"server_key": "81466E185EC642AFAE1EFA75953735D6C0934D099149AAAB601D59F8F8162580",
"salt": "6633653634383437393466356532333165656435346432393464366165393137",
"is_superuser": true, // 値の選択肢: true | false、デフォルト: false
"client_attrs": { // 任意
"role": "admin",
"sn": "10c61f1a1f47"
},
"expire_at": 1654254601, // 任意
"acl": // 任意
[
{
"permission": "allow",
"action": "subscribe",
"topic": "eq t/1/#",
"qos": [1]
},
{
"permission": "deny",
"action": "all",
"topic": "t/3"
}
]
}ダッシュボードでの認証機構設定
EMQXダッシュボードからSCRAM認証機構を設定できます。
EMQXダッシュボードにログインします。
左のナビゲーションメニューで アクセス制御 -> 認証 をクリックし、認証ページを開きます。
右上の 作成 をクリックします。
メカニズムに SCRAM を、バックエンドに HTTP Server を選択します。次へをクリックすると、以下のような設定ステップのページに進みます。

バックエンドの設定を行います。
Method: HTTPリクエストメソッドを選択(
GETまたはPOST)。TIP
POSTメソッドはパスワードなどの機密情報がサーバーログに露出するのを防ぐため推奨されます。信頼できない環境ではHTTPSを使用してください。URL: HTTPサービスのURLを入力します。URLのホスト部分はプレースホルダーをサポートしていません。固定のホスト名またはIPアドレスを使用してください。
Precondition: Variform式で、クライアント接続に対してこのHTTP Server認証機構を適用するか制御します。式はクライアントの属性(
username、clientid、listenerなど)に対して評価され、結果が文字列の"true"の場合のみ認証機構が呼び出されます。詳細は認証の前提条件を参照してください。Headers(任意): 追加のHTTPリクエストヘッダーを指定します。
認証設定:
- Password Hash: パスワードハッシュアルゴリズムを選択(
sha256またはsha512)。 - TLSを有効化: スイッチを切り替えてTLSを有効化します。TLS有効化の詳細は外部リソースアクセスのTLSを参照してください。
- Body: リクエストテンプレートを定義します。
POSTリクエストの場合はJSON形式でリクエストボディに送信され、GETリクエストの場合はURLのクエリ文字列としてエンコードされます。プレースホルダーを使ってキーと値をマッピングしてください。
- Password Hash: パスワードハッシュアルゴリズムを選択(
詳細設定:
- 接続プールサイズ(任意): EMQXノードからHTTPサーバーへの同時接続数(整数値)を設定します。デフォルトは
8です。 - 接続タイムアウト(任意): EMQXが接続タイムアウトと判断するまでの待機時間を指定します。サポートされる単位は
milliseconds、second、minute、hourです。 - HTTPパイプライニング(任意): レスポンスを待たずに送信可能なHTTPリクエストの最大数を正の整数で指定します。デフォルトは
100です。 - リクエストタイムアウト(任意): EMQXがリクエストタイムアウトと判断するまでの待機時間を指定します。サポートされる単位は
milliseconds、second、minute、hourです。 - イテレーション回数(任意): SCRAMのイテレーション回数を設定します。デフォルトは
4096です。
- 接続プールサイズ(任意): EMQXノードからHTTPサーバーへの同時接続数(整数値)を設定します。デフォルトは
設定が完了したら、作成をクリックして設定を確定します。