Skip to content

EMQX Enterprise Version 6 ​

6.3.1 ​

リリース日: 2026-09-17

EMQX 6.3.1 にアップグレードする前に、破壊的変更を必ず確認してください。

強化点 ​

アクセス制御 ​

  • #18777 ダッシュボード JSON API ログインに対して、オプションの SCRAM-SHA-256 チャレンジレスポンス認証を追加し、組み込みの API Spec ログインページのデフォルトを SCRAM に切り替えました。既存のパスワードログインはデフォルトで有効のままです。

    dashboard.password_login = scram_only の場合、POST /api/v5/login をユーザー名とパスワードで使用しているスクリプトやサードパーティクライアントは、SCRAM チャレンジレスポンスフローに移行するか、API キーを使用する必要があります。

パッケージング ​

  • #18977 公式の EMQX Enterprise Docker リリースイメージを Docker Hardened Debian 13 (Trixie) に切り替えました。ランタイムイメージには apt や dpkg といったパッケージマネージャーは含まれなくなりました。

    リリースイメージにはビルドの出所情報とソフトウェア部品表(SBOM)証明が含まれ、Docker Scout による Hardened ベースイメージの脆弱性評価(VEX ステートメント)の適用が可能になりました。

パフォーマンス ​

  • #18806 MQTT 接続のメモリ使用量を削減しました。

    接続時にレートリミッターの状態を割り当てていましたが、レート制限が設定されていない場合でも割り当てていました。現在はクライアントが初めてパブリッシュまたはサブスクライブした時点で割り当てるため、接続のみで接続状態を維持する場合は約 2 KB のメモリ節約になります。設定されたレート制限の動作は従来通りです。

  • #18807 MQTT セッションのメモリ使用量を削減しました。

    セッション作成時に配信レートリミッターの状態を割り当てていましたが、配信レート制限が設定されていない場合でも割り当てていました。現在は配信レート制限が設定された後の最初の配信時に割り当てるため、セッションごとに約 0.5 KB の節約になります。設定された配信レート制限の動作は従来通りです。

  • #18808 パブリッシュまたはサブスクライブする MQTT 接続のメモリ使用量を削減しました。

    接続ごとのレートリミッター状態は、実際に設定されたレート制限に対してのみ割り当てられます。デフォルト設定(レート制限なし)ではアクティブな接続あたり約 1.6 KB のメモリ節約になります。設定されたレート制限の動作は従来通りで、実行時に追加された制限も含みます。

  • #18809 レート制限が設定されている場合の MQTT 接続のメモリ使用量を削減しました。

    全接続で共有されていたレートリミッターの管理情報を各接続にコピーしなくなり、レート制限が有効な接続ごとに約 0.5 KB の節約になります。レート制限の動作は変更ありません。

  • #18875 マルチテナントネームスペースに属する MQTT 接続のメモリ使用量を削減しました。

    ネームスペースクライアントのレートリミッター状態は、クライアントが初めてパブリッシュ、サブスクライブ、またはメッセージを受信した時点で、実際に設定された制限に対してのみ割り当てられます。これは通常の接続の動作と一致します。設定されたテナントおよびクライアントのレート制限の動作は従来通りです。ネームスペースのリミッター設定が削除された場合、そのクライアントに対する後続のリミッター検査は操作を拒否し続けます。

バグ修正 ​

コア MQTT 機能 ​

  • #18734 tcp_options.buffer = 0 がデフォルトの socket バックエンドで新規接続をすべて失敗させていた TCP リスナーの問題を修正しました。

    すべてのリスナータイプで tcp_options.active_n は 1..1000 の範囲に制限され、tcp_options.buffer は MQTT 固定ヘッダー最大長の 5 バイト以上に制限されます。範囲外の値は受け入れられますが静かに調整されます。

  • #18789 MQTT およびゲートウェイリスナー作成時に、64 バイトを超える名前や制限付き名前形式に合致しない名前は明確な BAD_REQUEST 応答で拒否されるようになりました。既存の長い名前のリスナーは編集可能なままです。

  • #18811 MQTT v5 クライアントがトピックエイリアスを受け入れない場合に送信されていたトピックエイリアスの送信を修正しました。

    Topic Alias Maximum プロパティを省略または 0 に設定したクライアントに対して、SCRAM などの拡張認証で認証された場合でも Topic-Alias プロパティを含む PUBLISH パケットが送信されていました。

  • #18828 MQTT リスナーは最初のパケットが CONNECT でない場合、パケット本体を解析せずに接続を閉じるようになりました。

アクセス制御 ​

  • #18681 REST API 認証エラーメッセージを対象エンドポイントに合わせて修正しました。API キーを拒否するエンドポイント(例: POST /api/v5/logout)で拒否されたベアラートークンまたは認可ヘッダーがない場合に API キー使用を示唆しなくなりました。メッセージから api_key.bootstrap_file 設定キー名も削除されました。

  • #18724 ダッシュボード SSO OIDC の設定時に、発行者の URL スキームと TLS オプションの不一致(https かつ TLS 無効、または http かつ TLS 有効)を設定時に拒否するようにしました。これにより、実行時に不明瞭な TLS エラーで繰り返し失敗したり TLS オプションを無視する問題を防ぎます。

  • #18737 認証・認可リクエストテンプレートで ${peerport} が空文字列になる問題を修正しました。

    また、クライアント情報に ${peername} を追加しました。これはクライアントのアドレスとポート(例: 192.168.0.1:51544)としてレンダリングされます。

  • #18852 6.2 から 6.3 へのローリングアップグレード中に、6.2 ノードがブートストラップ API キーを拒否する問題を修正しました。

    6.3 ノード起動時にクラスタ共有 API キーのレコードを 6.2 ノードが検証できない秘密ハッシュに書き換えていたため、6.2 ノードがキーを拒否していました。ブートストラップファイルローダーは、ファイルに同じ秘密が保持されている場合は保存済みハッシュを維持し、ロールやスコープなどのキーのメタデータのみを更新します。

    ブートストラップファイルの秘密を変更するとハッシュは置き換えられます。クラスタ全体が 6.3 にアップグレードされてから秘密をローテーションしてください。

  • #18904 有効なダッシュボード SSO バックエンドの作成または更新時に、リソースが開始タイムアウトまで connecting 状態のままで内部エラーになる問題を修正しました。

    バックエンドはリソース ID で追跡され、開始タイムアウト後にクリーンアップされます。

マルチテナンシー ​

  • #18774 クライアントが削除されたマルチテナンシーネームスペースに接続できてしまう問題を修正しました。これはリソースのクリーンアップ中に発生していました。

データ統合 ​

  • #18763 TDengine アクションのエラー報告を修正しました。アクションが見つからない場合、エラーにコネクターの ID ではなくアクションの ID が表示されるようになりました。

  • #18775 RocketMQ コネクターの namespace 設定フィールドを rocketmq_namespace に改名しました。

    旧名も引き続き受け入れるため、既存の設定、API 呼び出し、インポート済みバックアップは変更不要です。名前が EMQX のネームスペースと衝突し、ダッシュボードが RocketMQ インスタンス名のネームスペース所有として扱っていたため改名しました。

    API 応答とダッシュボードでは rocketmq_namespace として表示されます。

  • #18846 データ統合の SQL テンプレートレンダリングを修正しました。Doris のバッチ挿入は Doris 互換の構文とエスケープを使用し、MySQL テンプレートはエスケープされたドル記号を正しく処理します。

  • #18925 QuasarDB アクションの SQL テンプレート検証と、SQL コンテキストに応じた値のエスケープを修正しました。

  • #18941 書き込み負荷が高いときに接続と切断を繰り返す GreptimeDB コネクターを修正しました。ヘルスチェックは保留中の書き込みを待たず、応答しない場合のみ失敗します。

クラスター ​

  • #18826 バックアップインポート時に、クラスター内のすべてのノードが同じバージョンを実行していることを確認するようになりました。

    ローリングアップグレード中にインポートすると、未アップグレードノードが異なる解釈をする呼び出しでバックアップが適用される可能性がありました。インポートは開始前に停止し、未アップグレードノードを列挙してクラスターを元の状態に保ちます。

  • #18862 emqx_router_tool:scan_missing_routes/1 と emqx_router_tool:reconcile_missing_routes/1 に渡されるオプションの検証を追加しました。

    無効な chunk や sleep_ms の値はスキャンスロットリングを無効化したりランタイムエラーを引き起こしていました。ツールは無効な値や誤字のオプションキー(例: chunks)を拒否し、問題のあるオプションを特定するエラーを発生させます。

  • #18899 ローリングアップグレード中、6.3.0 未満のバージョンを実行するノードが混在するクラスターで、GET /api/v5/listeners と GET /api/v5/listeners_status が 500 INTERNAL_ERROR を返す回帰を修正しました。

永続ストレージ ​

  • #18822 ノード再起動やリーダーシップ変更後に Durable Storage シャードが復旧できない稀な問題を修正しました。EMQX は追加の一時的な DS Raft リーダーシップエラーを再試行可能とみなし、RocksDB スキーマ初期化の不完全さが復旧を妨げなくなりました。

ゲートウェイ ​

  • #18755 ダッシュボードから既存の NATS ゲートウェイ設定を保存すると、認証情報がフォームに表示されるマスク済み値で置き換わり、NATS クライアントの認証失敗を引き起こす問題を修正しました。

    認証設定を変更しない場合は認証情報を保持します。

    NATS ゲートウェイの認証設定は、重複する認証方法や認証情報(重複した NKey や JWT アカウントエントリ)を拒否し、あいまいな認証動作を防止します。

  • #18776 MQTT-SN は、スリーピングクライアントのスリープ期間が切れた際に設定された Will メッセージをパブリッシュし、クライアントが正常に切断した場合は Will メッセージをパブリッシュしなくなりました。

  • #18842 ゲートウェイプロトコルはクライアント ID のオーバーライドをサポートしません。ゲートウェイ接続は認証バックエンドが返す clientid_override 値を無視し、警告をログに記録します。

    ゲートウェイ接続のマウントポイントテンプレートは、認証結果のマージ後の共有ゲートウェイ認証フローで評価されます。

  • #18855 クライアント証明書で認証された DTLS クライアントの MQTT-SN セッションウェイクアップ認可を修正しました。証明書に紐づくセッションは、同じピア証明書を提示した場合のみ新しい関連付けから再開可能です。証明書なし、異なる証明書、再発行証明書の場合は拒否されます。

    証明書なしの平文 UDP および DTLS クライアントは従来の ClientId のみの PINGREQ ウェイクアップ動作を維持します。

プラグイン ​

  • #18891 EMQX 6.x で Sync Request プラグインのインストールと起動が missing_i18n_ref エラーで失敗する問題を修正しました。プラグインは正常に起動し、API エンドポイントが利用可能になりました。

可観測性 ​

  • #18664 ネームスペース付きリクエストの監査ログに対象ネームスペースを識別できる情報を追加しました。以前は、異なるネームスペースで同名のトピックメトリクスコレクションをリセットすると、監査ログが同一に見え、どのネームスペースのコレクションか判別できませんでした。監査ログはリクエストのクエリパラメータも記録します。

  • #18677 データバックアップリクエストの監査ログに対象ネームスペースを識別できる情報を追加しました。以前は異なるネームスペースのバックアップのエクスポート、インポート、アップロード、削除が同一に見え、どのネームスペースのバックアップか判別できませんでした。監査ログはリクエストのクエリパラメータも記録します。

  • #18678 A2A レジストリリクエストの監査ログに対象ネームスペースを識別できる情報を追加しました。以前は異なるネームスペースのエージェントカードの登録や削除が同一に見え、どのネームスペースのカードか判別できませんでした。監査ログはリクエストのクエリパラメータも記録します。

  • #18684 OpenTelemetry トレーシングが有効で、MQTT 5 クライアントの CONNECT パケットに will User-Property エントリが含まれる場合の接続時クラッシュを修正しました。

  • #18686 認可、認証、コネクター、ブリッジ、ルールエンジン、トレースリクエストの監査ログに対象ネームスペースを識別できる情報を追加しました。以前はこれらの監査ログがネームスペース間で同一に見え、どのネームスペースのリソースか判別できませんでした。監査ログはリクエストのクエリパラメータも記録します。

  • #18754 ヘルプのみを表示する CLI コマンドの監査ログ記録を停止しました。

    例: emqx ctl api_keys のようにサブコマンドなしで実行すると使用法を表示しますが、以前は空の引数リストで監査ログが記録され、操作が行われたように見えていました。実際に操作を行うコマンドは引き続き監査されます。

  • #18853 監査ログが有効な場合に SSO MFA のセットアップおよび検証認証情報がマスクされずに保存される問題を修正しました。

    SSO MFA リクエストボディは監査ログに username と backend のみを保持し、一時トークン、TOTP コード、未知の認証情報フィールドは監査ファイルや監査データベースに書き込む前にマスクされます。

  • #18961 emqx ctl plugins ... コマンドの監査ログで全引数が ****** とマスクされる回帰を修正しました。plugins の引数は機密情報を含まないため、マスクせずそのまま記録します。同時に CLI リファクタリングで誤って削除された plugins install --cluster オプションを復活させました。

管理 ​

  • #18600 永続セッションが有効な場合のクライアント一覧 API のフィルタリングを修正しました。

    GET /api/v5/clients は切断済み永続セッションをすべて結果に追加しており、conn_state、username、clientid などのクエリ文字列フィルターを無視していました。例えば conn_state=connected でも切断済み永続セッションを返していました。現在は切断済み永続セッションにもフィルターが適用されます。

    フィルター適用時に切断済み永続セッションが存在する場合、誤った数値を返す代わりに meta.count フィールドを省略します。conn_state=connected でフィルターすると正確な meta.count を返します。

  • #18666 GET /api/v5/topics は永続共有サブスクリプションに対して、$share/group/a/1 のような完全な共有サブスクリプショントピックを返すようになりました。

    以前は a/1 のような素のトピックのみを返していたため、永続共有サブスクリプションと同じトピックへの通常の永続サブスクリプションを区別できませんでした。

  • #18817 リクエストボディに enable フィールドがない場合、PUT /api/v5/telemetry/status が Erlang スタックトレース付きで 500 INTERNAL_ERROR を返す問題を修正しました。

    現在は 400 BAD_REQUEST と検証メッセージを返します。API ドキュメントは enable を必須にマークし、デフォルト値は表示しません。エンドポイントはこれまでデフォルトを適用していませんでした。

  • #18859 設定更新時に HTTP ヘッダー名の大文字小文字だけを変更すると保存済み値が削除される問題を修正しました。

  • #18860 クライアントメッセージページネーションで最終ページに継続位置を返していた問題を修正しました。

    GET /clients/{clientid}/mqueue_messages と GET /clients/{clientid}/inflight_messages は、メッセージがもうない場合に meta.position を end_of_data と返します。API クライアントは追加の空ページを要求せずに停止できます。

デプロイメントとセキュリティ ​

  • #18836 クラスター設定同期のデバッグログに成功した設定変更結果を含めるのをやめました。

    結果に HTTP 認証ヘッダーテンプレートなどのコンパイル済みランタイム状態が含まれ、ログのマスク処理がカバーしない秘密情報が含まれる可能性がありました。

6.3.0 ​

リリース日: 2026-09-03

EMQX 6.3.0 にアップグレードする前に、破壊的変更と既知の問題を必ず確認してください。

強化点 ​

コア MQTT 機能 ​

  • #16694 QUIC 接続からピア証明書を抽出するサポートを追加し、QUIC mTLS リスナーで peer_cert_as_username を有効にできるようにしました。

  • #17307 リスナーで SUBSCRIBE パケットに対するクライアント単位のレートリミッターを追加しました。デフォルトで無効です。有限のレートに設定すると、制限を超えたパケットに対して EMQX は Quota Exceeded 理由コードを含む SUBACK を返し、処理しません。ネームスペースはリスナーレベルのレートを上書きする独立したレートを設定できます。

  • #17546 #18477 MQTT 5.0 クライアントが Session-Expiry-Interval プロパティで要求するセッション有効期限の上限を制限する mqtt.max_session_expiry_interval 設定を追加しました。クライアントが上限を超えて要求した場合、サーバーは静かに制限値に丸めて CONNACK に反映します。デフォルトは infinity(制限なし)で従来動作を維持します。MQTT 3.1.1/3.1 クライアントには影響しません。

    この制限は DISCONNECT パケットのセッション有効期限にも適用され、切断時に有効期限を延長できなくなります。

  • #17603 直接接続された TLS クライアント証明書から Subject Alternative Names を抽出し、mqtt.client_attrs_init の cert_san.dns、cert_san.ip、cert_san.email、cert_san.uri として MQTT クライアント属性に追加するサポートを追加しました。

  • #17854 MQTT TCP リスナーのデフォルト tcp_backend を socket に変更し、メッセージレイテンシとリソース使用量を改善しました。tcp_backend = gen_tcp で従来の gen_tcp バックエンドも利用可能です。

  • #17870 遅いまたは混雑したサブスクライバー向けのインメモリセッション配信動作を改善しました。

    • EMQX は接続の送信キュー混雑を追跡し、必要に応じて QoS 0 配信を直接混雑した接続にプッシュし続ける代わりにセッションメッセージキュー経由に移動します。
    • セッションメッセージキューは容量に達した際に古い QoS 0 メッセージを優先的に削除し、QoS 1 および QoS 2 配信の進行を助けます。
    • セッション配信レート制限到達時の配信順序を修正し、後続メッセージが先行メッセージを追い越さないようにしました。
    • ソケットバックド接続の send_timeout 処理を改善し、ソケットキューがウォーターマークを超えた後にのみタイムアウトを設定します。

アクセス制御 ​

  • #17145 認可ソースで Variform ベースの前提条件をサポートしました。前提条件が true の場合のみソースが呼ばれ、クライアント属性、アクション、トピックなどのクライアントとリクエストコンテキストに応じて異なる認可バックエンドを選択可能です。

  • #17487 ダッシュボード管理者パスワードと API キーシークレットのハッシュ強化。

    ダッシュボード管理者パスワードは PBKDF2-HMAC-SHA256(60万回反復)と 16 バイトランダムソルトでハッシュされます。API キーシークレットは同じ自己記述形式で同じ 16 バイトソルトを使いますが反復はなく、HTTP API 認証のコストを抑えます。従来の単一 SHA-256 と 2 バイトソルトの方式は両方とも置き換えられます。

    既存のハッシュは認証に引き続き使用可能で、ユーザーがパスワードを変更するか API キーを再作成した際に新形式に書き換えられます。

  • #17671 認証拒否ログと認可拒否ログにバックエンドごとの情報を追加しました。

    認証拒否時は拒否を生成した認証器の ID とプロバイダーを警告ログで出力します。認可拒否時はソースタイプ、モジュール、トピック、アクションを警告レベルでログに記録します(従来はクライアントトレースでのみ確認可能)。

    複数の認証器や認可ソースを使う環境で、クライアントトレースを有効にしなくてもどのバックエンドが決定を出したか判別可能です。新しいログは認証器・認可ソースごとにスロットリングされ、ログ洪水を防ぎます。

  • #18130 HTTP 認証器と認可器の URL ホストにテンプレート変数をサポートしました。例: https://${client_attrs.tns}.auth.example.com/authn。外部ルーティング層なしでテナントごとの認証・認可エンドポイントを実現できます。

    hostname_resolution 設定は URL ホストの扱いを制御します。デフォルトの static は固定ホスト名と設定時に確立された永続接続プールを維持します。dynamic(URL ホストにテンプレートが含まれる場合必須)はリクエストごとにホスト名を解決し、リクエストごとの接続でチェックを送信します。TLS オプションはホストに適用され、pool_size でアイドル接続の最大数を制限します(0 は再利用無効)。パイプライン設定は無効です。

    テンプレートホストの場合、新しい allowed_hosts 設定にホスト名のリスト(完全名または *.suffix ワイルドカード)を指定する必要があります。レンダリングされたホスト名がリストにない場合、リクエストは送信されずチェックは失敗します。リテラルホスト名の URL は従来通り接続プールを使用します。

  • #18239 #18371 フラッピング検出がクライアント ID に加えて、ユーザー名と接続元 IP アドレスでも動作するようになりました。

    各次元は独自の検出ウィンドウ、接続試行閾値、禁止期間を持ち、flapping_detect.by_clientid、flapping_detect.by_username、flapping_detect.by_peerhost で設定します(ユーザー名と IP 検出はデフォルト無効)。クライアント ID 次元は従来のフラットな flapping_detect 設定で構成可能で非推奨ですが自動的に by_clientid にマッピングされます。検出ウィンドウ内で閾値を超えたユーザー名または IP は一時禁止され、新規接続試行は認証前に拒否されます。既接続クライアントは影響を受けません。禁止エントリは自動的に期限切れとなり、/banned REST API で確認・早期削除可能です。各エントリは禁止タイプ(clientid、username、peerhost)と by=flapping detector を持ち、タイプでフィルター可能です。

    カウンターはゾーンと次元ごとに分離され、異なる検出ウィンドウのゾーン間でカウンターが相互に破棄されません。

    新しいメトリクス: flapping.detected.clientid、flapping.detected.username、flapping.detected.peerhost(次元ごとのフラッピング検出回数)、client.banned(禁止エントリによる接続試行拒否回数)。

マルチテナンシー ​

  • #17454 /api/v5/prometheus/data_integration で返す Prometheus データをリクエスト元のアクターのネームスペースに限定しました。グローバル管理者はすべてのネームスペースのデータを閲覧・フィルター可能です。

データ統合 ​

  • #17129 GCP ベースのコネクター(GCP PubSub Producer、GCP PubSub Consumer、BigQuery)に対して、GCP VM にアタッチされたサービスアカウント認証を追加しました。EMQX はインスタンスのメタデータエンドポイントからトークンを取得できます。

  • #17222 Bigtable へのデータ追加をサポートする Bigtable データ統合を追加しました。

  • #17547 Kafka Producer と Consumer コネクターで AWS IAM Roles Anywhere をサポートしました。クレデンシャルヘルパープロセスが公開する HTTP エンドポイントを設定できます。

    クレデンシャルヘルパープロセスは EMQX からアクセス可能で稼働している必要があります。詳細は AWS IAM Roles Anywhere credential helper ドキュメント を参照してください。

  • #17783 PostgreSQL 系コネクターに application_name オプションを追加しました。デフォルトは emqx で、PostgreSQL の起動パラメーターとして送信され、PostgreSQL のアクティビティビューやログでコネクターセッションを識別可能にします。値は 1~63 バイトでゼロバイトを含めません。

  • #18119 Disk Log コネクターがサイズベース回転に加え、時間ベースのファイルローテーションをサポートしました。

    新しいオプション rotation が追加されました:

    • rotation.period: none(デフォルト)、day、hour。day または hour の場合、各期間境界で別のログファイルセットを開始し、ファイル名に期間の日付スタンプ (YYYYMMDDHH) を付与します(例: mqtt-trace-2026062400.log.1)。サイズベース回転は各期間内で適用されます。
    • rotation.retention_period: 以前の期間のファイルを保持する期間(例: 30d)。期間ローテーションごとに保持期間外のファイルは自動削除されます。デフォルトは infinity(無期限保持)。
    • rotation.timezone: 期間境界の判定に使うタイムゾーン。UTC(デフォルト)、local、または +02:00 のような固定オフセット。

    デフォルト動作(rotation 未設定または rotation.period = none)は変更ありません。

  • #18319 BigQuery アクションでアクション固有のプロジェクト ID を指定可能にしました。

  • #18624 emqx ctl actions show と emqx ctl actions status コマンドを追加しました。ローカルノードのアクション状態を JSON で表示し、REST API 認証情報やネットワーク呼び出しは不要です。

    status は {"<type>:<name>": "<status>"} のコンパクトな JSON 配列を出力し、show は GET /api/v5/actions/{id} と同様の情報をローカルノードのみで表示します。両方とも --name <type:name> でアクション選択、--ns <namespace> でネームスペース選択が可能で、デフォルトはグローバルネームスペースのすべてのアクションです。

    これはローカルノードのレディネスプローブに適しており、REST API のクラスタ集約 status フィールドではローカルノードの状態を判別できません。

可観測性 ​

  • #17493 セッションバッファの可観測性を追加しました。クライアント API は total_payload_bytes を報告し、sysmon.session.total_payload_bytes_high_watermark はペイロードバイト数閾値超過のスロットル警告を出し、emqx ctl session-top はクラスタのトップセッションを total_payload_bytes または mqueue_length でエクスポート可能です。

  • #17582 Prometheus メトリクス収集を prometheus.erl バージョン 6.1.2 に更新し、パフォーマンスとスケーラビリティを改善しました。

    vm_dist、vm_statistics、vm_system_info、vm_memory コレクターはデフォルトで有効です。廃止された emqx_vm_process_messages_in_queues メトリクスは Prometheus 出力から削除されました。

  • #17607 #17998 名前付きコレクション、ワイルドカードトピックフィルター、ネームスペース所有権、REST CRUD、Prometheus スクレイプエンドポイントを備えた v2 トピックメトリクスを追加しました。

    • /api/v5/mqtt/topic_metrics2/:name 以下の新ルートで、トピック自体ではなくユーザー選択の名前(例: my-pressure、vehicle-events)でトピックメトリクスコレクションを登録可能です。ワイルドカード(t/#、sensor/+/temp)もトピックフィルターとして受け入れられ、1 つのパブリッシュメッセージが複数のコレクションにマッチしてカウントされます。
    • コレクションはネームスペーススコープです。ネームスペース管理者が作成したコレクションは client_attrs.tns が一致するパブリッシャーのみをカウントします。グローバルコレクションはすべてのパブリッシャーをカウントします。ネームスペース管理者は自身のコレクションのみ閲覧・変更可能です。グローバル管理者は ns クエリパラメータで個別のネームスペースコレクションにアクセス可能で、他ネームスペース名を指定すると 403 Forbidden となり、省略時は自身のネームスペースになります。
    • カウンターは /api/v5/prometheus/topic_metrics で Prometheus 形式で公開され、ラベルは name、topic_filter、namespace です。レートは Prometheus の rate() で算出可能です。
    • v1 API (/api/v5/mqtt/topic_metrics と /api/v5/mqtt/topic_metrics/:topic) は変更なく動作し続けますが Swagger 仕様で非推奨とマークされており、統合は v2 を使うべきです。
  • #18148 OpenTelemetry 経由の Dynatrace 統合を追加しました。対応シグナルはトレースとログで、OAuth2 トークンを使って認証します。

デプロイメントとセキュリティ ​

  • #17381 OpenAPI 仕様エンドポイントはデフォルトで認証が必要になりました。対象は GET /api-docs/swagger.json、GET /api-spec.json、GET /api-spec.md、GET /api-spec/:tag[/:name] です。

    未認証リクエストは WWW-Authenticate ヘッダー付きの 401 を受け取り、サポートされるセキュリティスキームと公開ブートストラップエンドポイント(POST /api/v5/login、GET /api/v5/status)を記載した最小限の OpenAPI ドキュメント(または /api-spec.md の Markdown 相当)を受け取ります。これによりダッシュボードは匿名で API 全体を公開せずに認証方法を発見できます。

    ダッシュボードの api-spec.html エクスプローラーは匿名で読み込み、既存のセッション Cookie やトークンで仕様を取得し続けます。

  • #17407 #17808 Feature Gates を追加しました。

    EMQX_FEATURES 環境変数で指定した限定的な機能セットで EMQX を起動可能です。無効なプリセットや機能名はノードの起動を妨げます。依存機能は自動的に有効化されます。

    利用可能なプリセットは以下の 2 つです:

    • FULL: デフォルト。すべての機能を有効にして起動。
    • ESSENTIAL: 最小機能セットで起動。コア MQTT ブローカーと認証・認可のみ。

    カスタムの EMQX_FEATURES リストで選択可能な機能:

    • dashboard: ダッシュボード UI(SSO と RBAC 含む)、REST API。
    • data_integration: コネクター、アクション、ソース、ルールエンジン。
    • message_transformation: メッセージ変換。
    • schema_validation: スキーマ検証。
    • schema_registry: スキーマレジストリ。
    • gateways: ゲートウェイプロトコル。
    • cluster_link: クラスターリンク。
    • multi_tenancy: マルチテナンシーとネームスペース。
    • ai: AI 機能(A2A レジストリ、AI 補完)。
    • metrics: Prometheus メトリクスエクスポート。
    • mqtt_extensions: MQTT 拡張(遅延パブリッシュ、トピック書き換え、自動サブスクライブ、スローサブスクリプション、メッセージキュー、ストリーム)。
    • plugins: サードパーティプラグインのインストールと管理のためのプラグインフレームワーク。
    • file_transfer: MQTT のファイル転送拡張。
    • exhook: 外部 gRPC フック。
    • opentelemetry: OpenTelemetry エクスポーター。

    自動的に有効化される依存関係:

    機能自動有効化される依存機能
    data_integrationschema_registry
    message_transformationschema_registry
    schema_validationschema_registry
    aischema_registry
    metricsdashboard
    opentelemetrydashboard

    その他の機能は依存関係なし。

  • #17768 node.cookie をファイルから読み込む file:// URL 形式をサポートしました。

    オペレーターは node.cookie = "file:///path/to/cookie"(または環境変数 EMQX_NODE__COOKIE に file:// URL)を設定可能で、クラスタシークレットを設定ファイルに平文で保存しなくなります。参照先は通常ファイルか FIFO(名前付きパイプ)で、ノード起動時に一度だけ読み込みます。FIFO の場合はオーケストレーターが起動時に書き込む必要があります。

    解決されたクッキーは Erlang VM に直接渡され、生成された data/configs/vm.*.args ファイルには書き込まれなくなりました。これにより起動時に秘密がディスクに残りません。

  • #17803 EMQX_FEATURES=ESSENTIAL で起動した場合、Erlang のコードロードモードがデフォルトで interactive になり、無効化された機能の .beam ファイルは必要時にロードされます。これにより必須モードノードの常駐メモリフットプリントが大幅に削減されます。CODE_LOADING_MODE で明示的に上書き可能です。

  • #18451 起動時環境変数を etc/emqx.env(RPM/DEB では /etc/emqx/emqx.env、Docker では /opt/emqx/etc/emqx.env)から読み込むサポートを追加しました。

    ファイルにはデフォルトコメント付きで EMQX_FEATURES と EMQX_SECURITY_PROFILE の説明が記載されています。これらは emqx.conf より先に読み込まれるため、emqx.conf で設定できません。emqx コマンドは毎回このファイルをソースし、サービス起動、フォアグラウンド起動、emqx ctl で同じ値を使います。パッケージアップグレードで編集内容は保持されます。

  • #18452 GET /nodes と GET /nodes/{node} のノード情報に security_profile(legacy または hardened)と feature_preset(full、essential、custom)を追加しました。これらはノード起動時に固定され、クラスター内のノードが異なる設定で動作していることを一覧で示します。停止中のノードはこれらのフィールドを返しません。

  • #18453 security_profile_divergence アラームを追加しました。

    hardened セキュリティプロファイルのノードはクラスタ内の他の稼働ノードのセキュリティプロファイルを定期的にチェックし、legacy プロファイルのノードがあればアラームを上げます。legacy プロファイルのノードはチェックを行いません。古い EMQX リリースのノードは legacy と見なされます。アラームメッセージは legacy ノードを列挙し、アラーム詳細はアラーム発生中のノードリストを保持します。すべての稼働ノードが hardened プロファイルになるか、最後の legacy ノードがクラスタを離れるとアラームは自動解除されます。

    ローリングアップグレード中に一時的に発生することが想定されます。長期間解除されない場合は、EMQX_SECURITY_PROFILE を新しい値で再起動していないノードが存在します。

  • #18471 node_dump 診断スクリプトに、起動時環境ファイル etc/emqx.env の EMQX_FEATURES と EMQX_SECURITY_PROFILE 設定を追加しました(ファイルが存在する場合)。他の変数は収集しません。

  • #18557 #18609 node.default_listener_address 設定オプションを追加しました。MQTT リスナー、ゲートウェイリスナー、ダッシュボード HTTP リスナーの bind に明示的なアドレスがない場合にバインドするアドレスを設定します。

    有効な値は loopback(127.0.0.1 にバインド)、nodename(Erlang ノード名のホスト部のアドレスにバインド)、all(0.0.0.0 にバインド)、リテラル IPv4/IPv6 アドレス、または起動時に解決するホスト名です。設定しない場合はセキュリティプロファイルがデフォルトアドレスを決定します。明示的な IP:port バインドが優先されます。環境変数 EMQX_NODE__DEFAULT_LISTENER_ADDRESS でも設定可能です。

    公式 Docker イメージは EMQX_NODE__DEFAULT_LISTENER_ADDRESS=all を設定し、セキュリティプロファイルに関係なく公開コンテナポートからリスナーにアクセス可能にしています。

    リスナービューは resolved_address(実際にバインドされた IP アドレス)を報告します。bind は設定値(ポート含む)を表示し続け、resolved_address はセキュリティプロファイルや node.default_listener_address 適用後の IP アドレス(ポートなし)を表示します。bind に明示的なアドレスがある場合は resolved_address_from が bind となり、裸ポートバインドの場合は 0.0.0.0、127.0.0.1、nodename、または node.default_listener_address のリテラル値を示します。

    これらはノードローカルで、GET /api/v5/listeners/:id はリクエストを処理するノードの値を返し、GET /api/v5/listeners はノードごとに node_status 以下で返します。同じ ID のリスナーがクラスター内のノードごとに異なるアドレスに解決される場合があります(例: node.default_listener_address = nodename)。

    emqx ctl listeners は既存の listen_on とともに両フィールドを表示します。

  • #18628 データバックアップのエクスポート時に、エクスポート元ノードのセキュリティプロファイルを記録するようになりました。

    legacy プロファイルでエクスポートされたバックアップを hardened プロファイルのノードにリストアすると、以下のように振る舞いが異なるデータや設定が持ち込まれます。

    • 裸ポート MQTT、ゲートウェイ、ダッシュボード HTTP リスナーのバインドは全インターフェースではなくループバックに解決されます。
    • 認証チェーンが空または無効の場合はすべてのクライアントを拒否します。
    • リストアされたダッシュボードアカウントはデフォルトパスワードのままログインできません。
    • 以前は無視されていた認証・認可バックエンドの失敗が操作拒否になります。

    このようなバックアップをリストアするには --allow-security-profile-mismatch CLI フラグまたは allow_security_profile_mismatch API パラメータが必要で、オペレーターが問題を確認できます。この変更前のバックアップは legacy と同様に扱われます。legacy プロファイルのノードへのリストアは影響を受けません。

プラグイン ​

  • #18455 hardened セキュリティプロファイルでは、emqx ctl plugins allow <Name-Vsn> に sha256:<hex> 引数が必須になりました。付与はプラグインパッケージを指定された SHA-256 ダイジェストにバインドし、バイトが一致するアップロードのみインストール可能です。ダイジェストなしの付与は拒否され、必要なコマンドを表示します。hardened プロファイルのノードはクラスターピアから送られたダイジェストなし付与も拒否します。

    legacy プロファイルは変更ありません。sha256:<hex> 引数は任意です。

パッケージング ​

  • #17335 RPM または DEB パッケージからインストール後、/opt/emqx ディレクトリを作成し、パッケージで散在する FHS パスを指す便利なシンボリックリンク(bin、data、etc、lib、log、plugins、releases、erts-*)を配置するようになりました。これにより、EMQX のインストール方法に関わらず公式 Docker イメージと同じ /opt/emqx/... パスを使用可能です。

パフォーマンス ​

  • #17583 JSON エンコード・デコードのパフォーマンスを改善しました。

    この変更により、JSON 出力の浮動小数点数は Erlang/OTP 標準に合わせて一貫したフォーマットになり、以前のリリースと若干異なる場合があります(例: 科学記数法の切り替えが早まるなど)。

  • #18033 ESSENTIAL 機能モード(およびダッシュボード/管理クライアント情報 API が無効なデプロイ)では、GET /clients エンドポイントにのみ供給される接続ごとの統計報告を定期的に行わなくなり、高接続数時のオーバーヘッドを削減しました。

  • #18424 プラグイン設定スキーマ(config_schema.avsc)をプラグイン設定検証時にインストール済みプラグインパッケージから毎回読み込むように変更しました。これまではすべてのインストール済みプラグインでメモリに保持していました。

    インストール済みプラグインのスキーマファイルが存在しないか読み込み不能な場合、プラグイン設定検証はファイルエラーを報告します。

  • #18688 ダーティ I/O スケジューラースレッド数(+SDio)を node.dirty_io_schedulers で設定可能にしました。デフォルトの auto は、node.schedulers が 2 より大きいノードでは従来の固定値 8 を維持し、小規模ノード(例: 2 vCPU コンテナや cgroup)では 4 を使用します。これにより小規模ノードの起動時メモリフットプリントを削減しつつ、ブロッキング I/O の重複を維持します。

バグ修正 ​

コア MQTT 機能 ​

  • #18010 クライアントが送信する不正な MQTT パケットはブローカーエラーとしてログに記録しなくなりました。

    無効な入力はリスナーの接続シャットダウンカウンターにカウントされ、ポートスキャナーやプロトコルファジングツール、誤動作クライアントによるアラートノイズを削減します。パケット固有の詳細を持つ解析エラーは単一の frame_error カウンターで共有され、新しいカウンター名を生成しません。

    解析エラーの詳細(問題のバイト列など)はトレースで報告されます。クライアント ID、IP アドレス、トピックでトレースを開始して確認してください。

  • #18027 共有サブスクリプションが無効な場合に共有サブスクリプションを試みたクライアントを切断するよう共有サブスクリプション処理を変更しました。

    mqtt.shared_subscription が false の場合、共有トピックフィルター($share/... または $queue/...)を含む SUBSCRIBE を送信したクライアントはネットワーク接続を閉じます。MQTT 5.0 クライアントは理由コード 0x9E(共有サブスクリプション非対応)付きの DISCONNECT パケットを受け取り、MQTT 3.1/3.1.1 クライアントは単に接続が閉じられます。

    以前は SUBACK で失敗理由コードを返し、接続は維持されていました。

  • #18116 strict_mode 有効時(デフォルト)、MQTT v5 パケットで繰り返し不可のプロパティが複数回含まれている場合(例: CONNECT パケットに Session-Expiry-Interval が 2 回)をプロトコルエラーとして拒否するようにしました。User-Property は繰り返し可能なので影響ありません。

    従来の寛容な動作はリスナー設定の strict_mode = false で復元可能です。

  • #18438 送信パケットのサイズチェックのオフバイワンを修正しました。

    クライアントの Maximum Packet Size と完全に一致するサイズのパケットが破棄され、frame_is_too_large とログに記録されていました。MQTT 5.0 仕様では制限を超えるパケットのみ破棄すべきなので修正しました。制限未満のパケットは影響ありません。

  • #18470 元のパケットが受信される前にパブリッシャーが切断した場合に、再送された QoS 2 PUBLISH パケットを EMQX がアックしたが配信しなかった問題を修正しました。

    この修正は #16721 の QoS 2 重複処理変更の一部を元に戻します。awaiting-PUBREL 状態が期限切れ後、再送された QoS 2 PUBLISH パケットは新しい QoS 2 交換として扱われ、サブスクライバーに複数回配信される可能性があります。EMQX 7.0.0 以降は awaiting-PUBREL 状態の期限切れをデフォルトで無効化し、再配信を防止します。

  • #18487 不明なパケット識別子を持つ PUBACK、PUBREC、PUBREL、PUBCOMP パケットのログ量を削減しました。これらはデバッグレベルでログ記録され、クライアントトレースで確認可能です。

  • #18523 シャットダウン時に MQTT リスナーをアプリケーションより先に停止するようシャットダウン順序を変更しました。

    以前はパブリッシュ経路のアプリケーションが停止している間もリスナーがクライアントトラフィックを受け付けており、パブリッシャーがルールエンジンなどで hook_callback_exception エラーを大量に発生させていました。現在はリスナーを先に停止し、アプリケーション停止中はクライアントトラフィックを処理しません。

    ノードはシャットダウン開始時点で GET /status にて実行中でないと報告し、ロードバランサーが新規接続を停止します。

  • #18585 セッションテイクオーバー時に、接続が切断されるまでセッションが存続しない場合は MQTT 仕様に従いセッションを終了するよう修正しました。対象は MQTT 5.0 クライアントのセッション有効期限 0 と MQTT 3.1.1 クライアントのクリーンセッション 1 です。

    修正前は新接続が旧セッションのサブスクリプションやキューイングメッセージを継承し、Will Delay Interval が 0 超の遺言メッセージは黙って破棄されていました。現在は新接続は新規セッション(CONNACK Session Present 0)を開始し、旧接続は理由コード 0x8E(Session taken over)付きで DISCONNECT され、遺言メッセージがあればテイクオーバー時にパブリッシュされます。

アクセス制御 ​

  • #18246 ハード化セキュリティプロファイルで遅延メッセージの認可を追加しました。

    • ハード化プロファイルでは遅延メッセージの再生時に再認可されます。MQTT とゲートウェイクライアントの遅延メッセージは制限付き認可コンテキストを持ち、パブリッシュ認可ルールと禁止レコードを現在の状態でチェックします。スケジュール時に認可されたメッセージが再生時に破棄される可能性があります。
    • ハード化プロファイルではアップグレード前に作成された保留遅延メッセージは認可コンテキストを持たないため再生時に破棄されます。レガシープロファイルは再生します。
    • 複数ゲートウェイのマウントポイント処理を修正しました。ゲートウェイは認可に論理的でマウントされていないトピックを渡します。authorization.include_mountpoint = false の場合は論理トピックをチェックし、true の場合は認可チェックに対してマウントポイントを 1 回適用します。パブリッシュやサブスクライブ時は常にマウントポイントを 1 回適用します。
    • GBT 32960、JT/T 808、LwM2M、NATS、STOMP ゲートウェイは認可にマウント済みトピックを渡さなくなりました。これにより authorization.include_mountpoint = true でも二重マウントチェックを防止します。
    • GBT 32960 の dnstream、JT/T 808 の proto.dn_topic、LwM2M コマンドの自動サブスクライブは認可前にマウントポイントを適用しません。
    • JT/T 808 の proto.up_topic と proto.dn_topic はゲートウェイマウントポイント相対になりました。デフォルトは jt808/${clientid}/${phone}/up と jt808/${clientid}/${phone}/dn から ${phone}/up と ${phone}/dn に変更されました。
    • MQTT-SN のアイドル QoS -1 パブリッシュと遺言メッセージは設定されたマウントポイントを適用します。以前は適用されていませんでした。
    • NATS はマウントポイント適用前に MQTT トピックに変換した NATS サブジェクトをパブリッシュ認可チェックします。NATS JWT 権限と EMQX 認可はマウント済みトピックをチェックしません。
    • ブリッジ、リテーナー、スキーマバリデーターなど他システムによる遅延メッセージの重複処理を修正しました。EMQX は実際の再生時にのみ遅延メッセージを処理します。プラグインなどの直接内部パブリッシャーは遅延メッセージをスケジュールするために message.ingress フックを呼び出す必要があります。直接の emqx:publish/1 呼び出しや $delayed/... への管理 API パブリッシュはメッセージイングレスをバイパスし、遅延メッセージをスケジュールしません。
  • #18458 oidcc を 3.2.3 にアップグレードしました。

    プロバイダー設定ワーカーがキャッシュを更新中に忙しい場合に発生していたダッシュボード SSO (OIDC) ログインタイムアウト(INTERNAL_ERROR: exit,{timeout,{gen_server,call,[...]}})を修正しました。

  • #18576 OIDC SSO 設定 API (GET /api/v5/sso/oidc) はクライアント JWKS が未設定の場合に client_jwks を none と返すようになりました。CLI 出力と一致します。設定済みのクライアント JWKS はマスクされたままです。

  • #18580 bin/node_dump スクリプトが生成する conf.hocon ファイルで機密設定値をマスクしました。

    設定スキーマで機密とマークされた値(例: dashboard.default_password、license.key)は ****** として書き込まれます。修正前は固定リストのキー名のみマスクされており、これらは平文で書き込まれていました。

マルチテナンシー ​

  • #18423 ネームスペース管理者によるデータバックアップのインポートは自身のネームスペース設定のみに適用されます。認証、認可、ExHook、リスナーなどクラスタ全体設定は警告付きでスキップされ、グローバル設定に書き込まれません。

  • #18466 名前に特殊文字を含むネームスペースのバックアップファイル一覧表示を修正しました。

    以前は *、?、{、}、[、] などを含むネームスペース名のバックアップファイル一覧が空でしたが、バックアップファイルはディスク上に存在していました。ネームスペース名をリテラルのディレクトリ名として扱うようにしました。

  • #18539 永続セッションが再接続時にネームスペースが変わった場合のマルチテナンシークライアント一覧を修正しました。

    以前は既存セッションを再開したクライアントがネームスペースを変更した場合、GET /api/v5/mt/ns/{ns}/client_list は古いネームスペースにクライアントを表示し続け、新しいネームスペースの一覧に含まれませんでした。クライアント一覧とネームスペースごとのクライアント数は常に接続時のネームスペースを反映するようになりました。永続セッション再開後にクライアントが一覧から消える問題も修正されました。

データ統合 ​

  • #18300 コネクターの TLS 設定で証明書ファイルフィールドが空白の場合、verify モードに関わらず未設定として扱うようにしました。以前は verify = verify_peer でクライアント証明書が空白だと検証エラーになっていました。

  • #18392 名前が同じだが異なるネームスペースにある集約アクション(S3、S3Tables、Azure Blob Storage、Snowflake Aggregated)が一時ファイルの作業ディレクトリを共有していた問題を修正しました。

  • #18449 PostgreSQL アクションで書き込み中に sock_closed エラーが発生し、回復不能と誤判定していた稀な競合状態を修正しました。EMQX はこのエラーを回復可能と扱います。

  • #18767 RocketMQ インスタンスネームスペースをコネクターの EMQX ネームスペースとして誤認識していた問題を修正しました。

    RocketMQ コネクターの namespace 設定は RocketMQ インスタンスネームスペースを保持しますが、API 応答では EMQX ネームスペースとして同じ JSON キーを使っていました。結果としてダッシュボードはコネクターを RocketMQ インスタンス名と同名の EMQX ネームスペース所有とみなし、「ネームスペース <name> の管理者のみ操作可能」と表示し、「管理ネームスペースが見つかりません」で開けませんでした。

    コネクター API 応答の namespace フィールドは常に EMQX ネームスペースを表し、RocketMQ インスタンスネームスペースは含まれません。更新リクエストで RocketMQ namespace 設定を省略すると既存値を保持します。

ルールエンジン ​

  • #18527 スキーマ検証、メッセージ変換、ルールエンジントピックインデックステーブルが利用不可の間にメッセージをパブリッシュすると、ログに繰り返し badarg エラーが出ていた問題を修正しました。

    この場合は検証・変換・ルールがトピックにマッチしない場合と同様に処理し、ブローカーはスロットルされた topic_index_table_missing メッセージをログに出すだけにしました。インデックステーブルは所有プロセスの再起動に耐え、アプリケーションシャットダウン時はテーブルより先にフックを削除し、テーブル欠落の既知のウィンドウを除去しました。

クラスター ​

  • #18409 server フィールドに複数アドレスを持つリンクのクラスタリンクを修正しました。

    このようなリンクはすべてのアドレスに接続し、各接続は順にアドレスを選択し接続できない場合は他のアドレスにフェイルオーバーします。変更前はリンクが接続できず、ノード再起動までリンクの作成・更新・削除ができませんでした。

  • #18447 ノードが他のクラスターメンバーから設定を同期した後に base.hocon の変更が無視される問題を修正しました。

    設定同期はピアの base.hocon を cluster.hocon に永続化しなくなり、ローカルの base.hocon 変更は明示的にクラスタ設定で上書きされない限り再起動後に有効になります。

  • #18537 一時的なメッセージ転送接続エラーを回復可能と分類するようクラスタリンクを修正しました。ネットワーク障害によるメッセージはバッファリングされ再試行され、失敗としてカウントされません。

ゲートウェイ ​

  • #18312 接続モード有効な平文 CoAP UDP リスナーで、他の送信元からの拒否リクエストが後続のダウンリンクメッセージをリダイレクトする問題を修正しました。

  • #18436 NATS ゲートウェイの内部 JWT 認証でアカウント JWT の exp/nbf クレームやアカウントレベルのユーザー無効化を強制しなかった問題を修正しました。

    期限切れまたは未有効アカウント JWT とアカウントにより無効化されたユーザー JWT は認証時に拒否されます。ユーザー JWT またはアカウント JWT の早い方の有効期限到達時に既存接続は切断されます。解決済みアカウント JWT はゲートウェイ設定検証時に拒否されます。

  • #18494 CoAP ゲートウェイクライアントが内部キープアライブ間隔ではなく設定されたハートビート間隔を報告するよう修正しました。

    ゲートウェイ API と emqx ctl gateway-clients list coap のクライアント情報は秒単位の設定済みハートビート値を返します。

  • #18504 STOMP フレームのエスケープされたヘッダー文字と CRLF 行末の解析を修正しました。

    STOMP 1.2 仕様に従い、ヘッダー名と値のエスケープシーケンス \c、\r、\n、\\ をデコードします。CONNECT と CONNECTED フレームはヘッダーエスケープ対象外で、パスワードにコロンやバックスラッシュが含まれていても変更しません。未定義のエスケープシーケンスはフレームエラーで拒否します。

    フレームとハートビートで CRLF (\r\n) 行末を受け入れるようになりました。修正前は CRLF 行末のクライアントは接続できませんでした。

  • #18700 ダッシュボードから既存の NATS ゲートウェイ設定を保存すると、認証情報がフォームに表示されるマスク済み値で置き換わり、NATS クライアントの認証失敗を引き起こす問題を修正しました。

    認証設定を変更しない場合は認証情報を保持します。

    NATS ゲートウェイの認証設定は、重複する認証方法や認証情報(重複した NKey や JWT アカウントエントリ)を拒否し、あいまいな認証動作を防止します。

プラグイン ​

  • #18188 プラグインフレームワークのパッケージとランタイム整合性チェックを強化しました。

    • オペレーターは emqx ctl plugins allow を実行してから emqx ctl plugins install を実行する必要があります。HTTP アップロード API と同じ許可ゲートを強制します。
    • プラグイン API コールバックのレスポンスは安全なレスポンスヘッダーの許可リストに制限されます。ブラウザに影響するヘッダー(set-cookie、location、access-control-*、content-security-policy、認証・セキュリティポリシーヘッダー)や x-plugin- プレフィックスなしのカスタムヘッダーは削除されます。
    • プラグインパッケージ抽出の制限を plugins.package_limits 設定で追加しました。max_package_size(デフォルト 10MB)、max_decompressed_size(50MB)、max_file_count(10000)、max_path_depth(32)、max_extraction_time_ms(60秒、クラスターパッケージコピーの RPC タイムアウトにも使用)。これらを超えるパッケージは抽出前または抽出中に拒否されます。インストールディレクトリ外へのパス(パストラバーサル)を含む tar エントリも拒否されます。
  • #18468 ホットアップグレード(relup)プラグインで、ターゲットバージョン文字列の検証とアップグレードパスの互換性チェックを追加しました。互換性がないか不正なアップグレードパッケージは、インストール済みリリースを削除・上書きせずに拒否されます。

  • #18540 emqx_relup プラグインパッケージにデフォルト設定ファイル(priv/config.hocon)を同梱しました。プラグインインストール時の failed_to_copy_plugin_default_hocon_config 警告が繰り返し出なくなりました。

ExHook ​

  • #18464 設定更新中に ExHook サーバーが非正常になった際の稀なクラッシュを修正しました。マネージャーは設定されたサーバー順序を保持し、サーバー再接続中も設定変更の提供を継続します。

  • #18473 コールバックサーバーが稼働していない場合の ExHook 認証・認可動作を修正しました。レガシーセキュリティプロファイルは設定された failed_action を尊重し、ハード化プロファイルはフェイルクローズのままです。

可観測性 ​

  • #17602 設定に基づく emqx ctl log outputs コマンドを追加し、CLI でのロガー出力変更が HTTP API やダッシュボードの設定と一貫するようにしました。

  • #17912 OpenTelemetry W3C Baggage ヘッダー抽出のセキュリティ脆弱性を修正しました(GHSA-64w2-whjg-q7q7)。受信 baggage ヘッダーのサイズとエントリ数をそれぞれ 8192 バイト、180 エントリに制限し、破損したペアはスキップしてクラッシュを防止します。

  • #18521 強制シャットダウン制限(force_shutdown.max_mailbox_size または force_shutdown.max_heap_size)超過時に出力される接続シャットダウンレポートに識別用 label を追加しました。

    確立済み接続ではクライアント ID を保持し、CONNECT 完了前にシャットダウンされた接続ではリスナー名とピアアドレスを保持します。以前は制限と測定値のみで影響を受ける接続を特定できませんでした。

  • #18696 SSO 認証ユーザーによる監査ログクエリでエラーが返される問題を修正しました。

管理 ​

  • #18289 クォートされた HOCON 文字列とキー内の JSON 互換 Unicode エスケープシーケンスがデコードされずエスケープされたままになる問題を修正しました。

  • #18403 UTF-8 ロケールがないシェル(例: 非対話 SSH、cron、LANG 未設定)で emqx ctl コマンドが非 ASCII 文字を \x{...} エスケープや無効バイトで表示する問題を修正しました。

    emqx スクリプトで起動される Erlang VM(ノード本体、emqx ctl、emqx eval、emqx remote_console、emqx escript)は常に標準入出力を UTF-8 で読み書きします。

  • #18444 設定ファイルでバイトサイズ単位 b と B にクォートが必要だった問題を修正しました。

    max_packet_size = 1MB は受け入れられましたが、max_packet_size = 1B は解析失敗し "1B" と書く必要がありました。すべてのバイトサイズ単位はクォートなしで受け入れられます。

  • #18509 GET /clients/{clientid}/mqueue_messages と GET /clients/{clientid}/inflight_messages のメッセージページングを修正しました。

    これらの API は 1 ページのペイロードサイズを max_payload_bytes(デフォルト 1MB)で制限します。制限でページが途中で切られた場合、返される meta.position が残りのメッセージを飛ばす位置を指していました。これによりメッセージが失われたように見えたり、mqueue_len と返されるメッセージ数が合わないことがありました。現在は meta.position は最後に返したメッセージを指し、次のページは残りの最初のメッセージから開始します。

  • #18544 GET /clients_v2 がメモリセッションの全クライアント返却後にカーソルを返し、続くカーソルで空ページを返していた問題を修正しました。データがない場合はカーソルを返しません。

  • #18558 GET /clients_v2 が fields クエリパラメータを無視していた問題を修正しました。

  • #18590 ノードが起動していない場合の emqx stop の出力を修正しました。

    コマンドはノードが応答しないことを 2 回報告し、その後 Graceful shutdown failed PID=[] で失敗していました。現在は一度だけ報告し、見つからないノードに対してシャットダウン失敗を表示しません。終了コードは変更ありません。

  • #18619 GET /nodes/{node} が対象ノードが API の生存確認と情報取得 RPC の間に到達不能になると 400 ではなく 500 エラーを返していた問題を修正しました。

デプロイメントとセキュリティ ​

  • #17921 protobuf 依存を v0.17.0 にアップグレードしました。これは SBOM 生成にのみ使用され、EMQX ランタイムには含まれません。深くネストされたメッセージのデコード時の無限再帰 DoS(GHSA-rv48-qqj5-crxg)修正と Elixir 1.19/1.20 のコンパイラ警告修正を含みます。以前は開発用の特定リファレンスを使っていましたが、正式リリースに置き換えました。

  • #18706 デバッグモードでのログに機密情報が含まれないようにしました。

    bin/emqx コマンドを DEBUG=1 または DEBUG=2 で実行しても Erlang クッキーやライセンスキーはシェルトレースに表示されません。

6.2.3 ​

リリース日: 2026-08-21

EMQX 6.2.3 にアップグレードする前に、破壊的変更と既知の問題を必ず確認してください。

強化点 ​

アクセス制御 ​

  • #17813 ダッシュボードのユーザーおよび API キーエンドポイントで、特権スコープ(system、user_management、api_key_management、sso_management)とその他のスコープを混在させたスコープリストを拒否するようになりました。これらの特権スコープは管理者相当の権限を持つため、制限付きスコープと組み合わせても意味のある制限になりません。アカウントに管理者相当の権限が必要な場合は特権スコープのみのリストを、そうでなければ非特権スコープのみのリストを使用してください。既存の混在スコープは次回更新まで動作しますが、更新時は分割が必要です。

  • #17980 ハード化セキュリティプロファイルで、サーバー発行のサブスクライブに対してトピック検証、認可、MQTT 機能チェック、クライアントサブスクライブフックを適用するようになりました。

  • #18002 ハード化セキュリティプロファイルで SAML レスポンスとアサーションの署名検証をデフォルトで有効にしました。

  • #18296 認証器の precondition 式(および Variform 式全般)で使える新関数 is_jwt(value) を追加しました。値が構造的に JWT(JWS コンパクト形式)であれば真を返し、署名検証は行いません。これにより JWT 以外のパスワードを提示するクライアントに対して JWT 認証器をスキップ可能になり、特にハード化プロファイルで非 JWT 資格情報が JWT 認証器により拒否される問題を回避できます。

マルチテナンシー ​

  • #17732 API キー作成・更新エンドポイントに namespace フィールドを追加しました。オペレーターは role 文字列にネームスペースを埋め込む必要がなくなりました(既存の ns:<namespace>::<role> 形式は引き続き有効)。両方が指定された場合は一致が必要です。

  • #17855 ネームスペーススコープ付きダッシュボード管理者は自身のネームスペース内の API キーを作成、一覧、参照、更新、削除できるようになりました。グローバル API キーや他ネームスペースのキーは作成できず、他ネームスペースの API キーは非表示です。

データ統合 ​

  • #17933 RabbitMQ コネクターで複数ノードの servers リスト(例: rmq1:5672,rmq2:5672)をサポートしました。接続時のフェイルオーバーとプール開始オフセットのローテーションを提供します。server と port は servers 未設定時に引き続き使用可能です。

  • #17944 HTTP コネクターおよび HTTP 認証・認可に OAuth2 クライアントクレデンシャル認証を追加しました。有効化すると、EMQX は設定されたトークンエンドポイントからアクセストークンを取得・更新し、アウトバウンドリクエストに Bearer 認証ヘッダーとして追加します。

    コネクターのヘルスチェックはトークン取得不能時に disconnected を報告します。OAuth2 と Authorization ヘッダーの両方を設定した構成は拒否されます。

    クライアント ID とシークレットはトークンリクエストボディのフォームフィールドとして送信し、HTTP Basic Authorization ヘッダーでの送信はサポートしません。

  • #18014 Datalayers Arrow Flight コネクターで準備済みステートメントの自動再構築を有効にしました。サーバーが準備済みステートメントを失った場合(例: 再起動後)、クライアントは自動的に再作成し書き込み操作を再試行します。書き込み失敗を回避します。

  • #18042 DynamoDB コネクターに AWS IAM ロールクレデンシャルを追加しました。

    アクセスキー ID とシークレットアクセスキーが省略された場合、EMQX は ECS タスクロールまたは EC2 インスタンスメタデータから一時クレデンシャルを取得し、有効期限前に更新します。

  • #18081 Snowflake ストリーミングアクションのレジリエンスを改善しました。チャネルの内部状態が同期外になった特定のエラー時に、失敗した行を再試行し、手動介入なしにチャネルを再オープンします。

  • #18085 Kafka、Confluent、Azure Event Hubs プロデューサーに以下の設定オプションを追加しました。

    • max_batch_age(アクション): プロデューサーバッファに一定時間以上滞留したメッセージを破棄し、dropped.expired メトリクスを増加させます。デフォルトは infinity(破棄しない)。
    • max_retries(アクション): 失敗したリトライ回数の上限。上限超過でメッセージバッチを破棄し、failed メトリクスを増加させます。リトライカウンターは Kafka がエラーコードを返した場合のみ増加し、接続喪失後の再送は増加しません。デフォルトは infinity(無制限リトライ)。
    • reconnect_delay(アクション): 接続喪失後の再接続遅延。デフォルトは 2s(従来はハードコード)。
    • request_timeout(コネクター): Kafka からの応答待機時間。これを超えると接続が古くなり再確立されます。デフォルトは 30s。

    Kafka クライアントライブラリを wolff 4.2.1 にアップグレードし、メモリモードバッファの max_linger_time サポートを復活させました。小規模バッチは max_linger_time まで追加メッセージを待ち、プロデュース要求率を低減します。満杯バッチは遅延なく送信されます。

  • #18110 スキーマレジストリで JSON Schema draft 2019-09 と 2020-12 をサポートしました。

  • #18137 GCP Pub/Sub プロデューサーとコンシューマーで、トピック設定に完全修飾トピックパス(projects/<project-id>/topics/<topic-name>)を受け入れるようになりました。これにより、サービスアカウントのプロジェクトとは異なる GCP プロジェクトのトピックにパブリッシュまたはサブスクライブ可能です。ベアトピック名は従来通りサービスアカウントのプロジェクトに解決されます。コンシューマーはサブスクリプションをサービスアカウントのプロジェクトに作成し、トピック参照のみ別プロジェクトを指定可能です。

プラグイン ​

  • #18012 EMQX REST API 経由の同期 MQTT リクエスト/レスポンスフローを提供する emqx_sync_request プラグインを追加しました。ノードローカルの CLI 診断でリクエストカウンターと現在の保留状態を確認可能です。

パッケージング ​

  • #18037 Enterprise Linux 10(RHEL 10、Rocky Linux 10、互換ディストリビューション)向けパッケージを追加しました。

  • #18127 macOS 26(Tahoe)向けパッケージのリリースを開始しました。

バグ修正 ​

コア MQTT 機能 ​

  • #17895 TLS/WSS リスナーを管理証明書バンドルからファイルベース証明書に切り替える際、参照先バンドルが既に削除されていても成功するように修正しました。

  • #17911 Erlang/OTP の ssl アプリケーションがサポートする場合、DTLS リスナーで ECDHE-PSK-CHACHA20-POLY1305 暗号スイートの検証を許可しました。

  • #18102 配信レート制限が有効な場合に MQTT クライアントが QoS 1 と QoS 2 メッセージを順不同で受信する問題を修正しました。EMQX はブロックされたメッセージが送信可能になるまで後続メッセージをキューに保持します。

  • #18108 まだ参照されている管理証明書バンドル(またはそのファイル)を削除しようとすると、参照設定を列挙した明確なエラーで常に失敗するようにしました。force_delete クエリパラメータはこのチェックをバイパスしなくなり、API スキーマから削除されました。

    さらに、リスナーがディスク上に存在しない証明書バンドルを参照している場合、Prometheus 統計エンドポイントが完全に失敗しなくなりました。対象リスナーは証明書有効期限メトリクスから除外され、警告がログに記録されます。

  • #18111 mqtt.strict_mode 検証を MQTT v3.1 CONNECT パケットに拡張しました。パスワードフラグがセットされているがユーザー名フラグがないパケットを拒否し、MQTT v3.1.1 と同様の動作にしました。MQTT v3.1 仕様ではパスワードのみの送信は無効です。

    接続ログの可読性も改善し、パスワード未設定は Password=undefined と表示し、ログの peername フィールドは 10.0.0.1:54123 のようなプレーン文字列で表示されます。

ルールエンジン ​

  • #17957 rule_engine.limit_selects_in_namespace = true の場合にグローバルネームスペースの複数ルールイベント(例: $events/client/connack)がルールをトリガーしなかった問題を修正しました。

  • #18049 rule_engine.limit_selects_in_namespace = true が有効な場合に、アラームの有効化・無効化トリガーでグローバルルールが発火しなかった問題を修正しました。

データ統合 ​

  • #17859 MQTT コネクターが IPv6 ブローカーに接続できるように修正しました。

    以前は IPv6 リテラル(例: [::1]:1883)が保存時に bad_host_port バリデーションエラーで拒否され、IPv6 のみ解決するホスト名は IPv4 で接続しようとしてホスト解決失敗していました。

    サーバーアドレスパーサーは角括弧付き IPv6 リテラル(例: [::1]、[::1]:1883、mqtt://[::1]:1883)を受け入れ、MQTT コネクターは接続時に IPv6 プローブを有効にして IPv6 専用ブローカーに到達可能にしました。

    MQTT コネクターとクラスタリンクの server アドレスは公式 MQTT URI スキーム mqtt(平文 TCP)と mqtts(TLS)を受け入れます。例: mqtt://broker:1883、mqtts://broker:8883。スキームなしの host:port も受け入れます。その他のスキームは unsupported_scheme バリデーションエラーで拒否します。

  • #17947 HTTP コネクター更新時にアクションバッファワーカーがブロックされ、メッセージが次のリトライ間隔までキューイングされる問題を修正しました。

  • #17955 低書き込みレート時に GreptimeDB 非同期バッチがヘルスチェック後にフラッシュされない問題を修正しました。

  • #17961 Kafka または Pulsar コネクターがヘルスチェックタイムアウトで disconnected 状態に遷移し、内部キューを再作成する問題を修正しました。現在は connecting に遷移します。

クラスター ​

  • #17995 永続化された mqtt.max_packet_size がローカル設定と異なるクラスターに参加するとノードが終了する問題を修正しました。EMQX はリスナー起動前にリスナーリフレッシュの副作用をスキップし、EMQX アプリケーション起動時に同期済み設定からリスナーを作成します。

  • #17999 コミュニティ(シングルノード)ライセンスのノードがクラスタリング対応ライセンスを持つクラスタに参加すると、クラッシュループする起動クラッシュを修正しました。

    以前はピアのライセンスが同期される前にクラスタメンバーシップが確立されると、ノードは SINGLE_NODE_LICENSE エラーで起動を拒否し、自動再起動監視下でクラッシュループしました。現在はクラスタリングライセンスの同期を有限期間待機し、その後起動します。クラスタリングライセンスを持つノードが 1 つもないクラスタは待機期間後に拒否されます。

  • #18077 ノードが完全起動前に cluster join リクエストを受けるとクラッシュする問題を修正しました。内部データベースが起動中に再起動されるためです。現在は明確なエラーメッセージで拒否し、ノード完全起動後に再試行を促します。

アクセス制御 ​

  • #17806 データバックアップのインポート・エクスポートエンドポイントを最小権限の原則に合わせて修正しました。user_management と api_key_management の両スコープを持たないダッシュボードユーザーは、dashboard_users と api_keys テーブルセットを含むアーカイブのインポート・エクスポートができなくなりました。グローバル管理者と必要なスコープを持つ API キー呼び出しは影響ありません。

  • #17853 コネクターのデバッグログで機密 HTTP リクエストヘッダーのマスキングを強化しました。x-api-key、x-auth-token、api-key、cookie ヘッダーは Authorization / Proxy-Authorization と同様にコネクター状態で秘密として扱われ、トレース・デバッグレベルでの状態出力時に値が表示されません。

    共通のヘッダーマスキングヘルパーは、コネクターのテンプレートパーサーが生成する iolist 形式のヘッダー名も認識するようになりました。

  • #17871 ネームスペース外のスーパーユーザー作成を拒否するように修正しました。ビルトインデータベースユーザーの一括インポートやブートストラップファイル読み込み時に適用され、ユーザー管理 API と一致します。該当行は失敗として報告され保存されません。

  • #17974 接続ログで MQTT 生パケットデータをデフォルトでマスクするようにしました。信頼済みクライアント IP はリスナーごとに許可リスト化可能です。

  • #18005 CLI 監査ログで機密コマンド引数が記録される問題を修正しました。

  • #18009 管理者と API キーのロールの暗黙的デフォルトスコープ(unset 表示)を使うレコードのスコープ処理を一貫化しました。読み書きは unset 相当のスコープリストを受け入れ、これらのレコードは将来のリリースで追加されるスコープを自動的に取得します。

    • ダッシュボードユーザー API でデフォルト管理者の注釈(説明)だけを編集しても失敗しなくなりました。ユーザー API はロールの暗黙的完全スコープセット(unset 値)と一致するスコープリストを「明示的スコープなし」と扱います。
    • #18196 API キー作成・更新リクエストは同様に unset 相当のスコープリストを受け入れ、読み取り時に返された値をそのまま再送しても失敗しません。
    • #18221 デフォルト管理者は起動時に明示的スコープリストを持たず作成され、明示的スコープリストを持つ既存レコードは起動時に暗黙的形式に更新されます。

マルチテナンシー ​

  • #17807 ネームスペース管理者は自身のネームスペースのバックアップ領域を分離されました。エクスポート、アップロード、一覧、ダウンロード、インポート、削除は自身のネームスペースのバックアップにのみ作用し、グローバルバックアップや他ネームスペースのバックアップは見えません。

    グローバル管理者は引き続きグローバルバックアップを管理でき、GET/DELETE /data/files と GET /data/files/:filename に namespace クエリパラメータを渡して特定ネームスペースのバックアップを操作可能です。

  • #17975 /tracing 設定エンドポイント(PUT /api/v5/tracing)はグローバル管理者のみに制限されました。ネームスペーススコープ付きダッシュボード管理者と API キーはグローバル [trace] 設定を変更できず、403 が返されます。

  • #18008 グローバル管理者はバックアップのインポート・アップロード時にオプションの namespace クエリパラメータを渡して特定ネームスペースのバックアップを操作可能になりました。省略時はグローバルスコープを使います。

    ネームスペーススコープ付き管理者は namespace パラメータを無視し、自身のネームスペースに限定されます。バックアップの一覧とダウンロード操作と一貫しています。

  • #18117 ネームスペース削除時に、そのネームスペースのビルトインデータベース認証ユーザー(パスワードベースと SCRAM)と認可ルールも削除されるようになりました。以前はネームスペース削除後もこれらのレコードが残り、同名ネームスペース作成時に復活していました。

    さらに新しい CLI コマンド emqx ctl mt purge_ns <namespace> を追加し、ネームスペースとそのデータを完全に削除可能にしました。このコマンドは冪等で、ネームスペースが存在しなくても実行可能です。以前の削除が中断された場合の最終手段として利用できます。

ゲートウェイ ​

  • #17796 MQTT-SN ゲートウェイで、UDP ソースポートが最近切断されたデバイスと同じポートから新しいデバイスが接続するとクラッシュする問題を修正しました。ループバックや NAT 背後で OS や NAT ボックスが同じポートを再割り当てする場合に発生します。古いチャネルは正常に廃棄され、新しい接続は新規セッションとして処理されます。

  • #17805 ゲートウェイの再読み込みが途中で中断された場合(無効な設定やリスナーポート競合など)に already_started エラーで失敗する問題を修正しました。失敗した試行のロッカープロセスは自動的に解放され、次の読み込みやオペレーターの再試行はクリーンな状態から開始されます。

  • #17815 MQTT-SN UDP セッションルーティングで UDP ソースタプルが変わったり再利用された場合の問題を修正しました。

    MQTT-SN UDP リスナーはパケットをパースした ClientId で esockd_udp_proxy 経由でルーティングし、スリーピングセッションが異なる UDP ソースタプルから再開可能にしつつ、再利用された UDP ソースタプルが別の ClientId のパケットを古いセッションに届けるのを防止します。

  • #17888 LwM2M ゲートウェイが登録・更新 MQTT レポートに password、secret、private_key、access_token などの機密クエリフィールドを含める問題を修正しました。

  • #18051 CoAP デバッグログで機密 URI クエリ値が漏洩する問題を修正しました。

プラグイン ​

  • #17861 ノード起動時やクラスタ再参加時に、クラスタプラグイン設定に存在しないローカルプラグインパッケージを削除しないようにし、以前のプラグイン起動動作を復元しました。

  • #17884 プラグイン管理 HTTP API が、クラスタプラグイン設定に存在せずローカルで起動していない古いアンパック済みプラグインディレクトリを無視するように修正しました。

    これらの古いパッケージはプラグイン一覧、詳細、設定、スキーマレスポンスに表示されず、プラグイン操作 API で操作できず、HTTP インストール API での再インストールもブロックしません。設定済みのプリインストールプラグインは引き続き表示され、ドキュメント化されたプリインストールワークフローに従います。

    プラグインパッケージがアンパックされているが plugins.states で有効化も無効化もされていない場合、起動時と HTTP API アクセス時にエラーをログに記録します。

  • #17932 CLI からプラグインをインストールする際の failed_to_get_plugin_config_from_cluster 警告のノイズを軽減しました。

    emqx ctl plugins install は HTTP API と同様に fresh_install モードでインストールし、クラスタ設定の検索をスキップしてクラスタ内のすべてのノードで繰り返される警告を防止します。

    emqx ctl plugins install にクラスタ全体インストール用の --cluster フラグを追加しました。指定時は単一コマンドで稼働中のすべてのノードにパッケージを配布・インストールします。

  • #18018 プラグインパッケージインストール時に、パッケージのアプリケーション宣言、設定スキーマ、デフォルト設定の検証前にコードをロードしていた問題を修正しました。

可観測性 ​

  • #17886 パブリッシュクオータ超過パケットメトリクスを Prometheus で emqx_packets_publish_quota_exceeded として公開しました。

  • #18114 ノードがクラスタ参加中にダッシュボードメトリクス API(GET /api/v5/monitor_current と GET /api/v5/monitor)が 500 INTERNAL_ERROR を返す問題を修正しました。

    参加中ノードがアプリケーションを再起動している間はメトリクスサンプリングに失敗しますが、API は残りの到達可能ノードの集約を返し、警告をログに出してリクエスト失敗を防ぎます。

    また、DELETE /api/v5/monitor の成功時に毎回ログされていた不要な clear_monitor_metrics_rpc_errors 警告を修正しました。

ファイル転送 ​

  • #18069 ファイル転送ファイル API(GET /api/v5/file_transfer/files)がファイル名に非 ASCII 文字(例: 中国語)を含むファイルを一覧表示すると 500 エラーになる問題を修正しました。

デプロイメント ​

  • #17877 emqx-enterprise Helm チャートがノードのホスト名に svc.cluster.local をハードコードしていた問題を修正しました。DNS ドメインが cluster.local でない Kubernetes クラスターで、ノードが解決不能な FQDN を名乗り Erlang 分散が開始できずクラスター形成に失敗していました。ホスト名はチャートの clusterDomain 値に従うようになりました。

AI 相互運用性 ​

  • #17936 HTTP API でグローバルネームスペースの A2A カードのフォーマットを修正しました。以前は文字列 "global" と表示されていましたが、null として特定ネームスペースと区別可能にしました。

6.2.2 ​

リリース日: 2026-07-02

EMQX 6.2.2 にアップグレードする前に、破壊的変更と既知の問題を必ず確認してください。

強化点 ​

クラスター ​

  • #17530 クラスターリンクは非コミュニティライセンスが必要になりました。デフォルトのコミュニティライセンスでは設定済みリンクは非アクティブ(メッセージ転送やルート複製なし)で、REST API は非コミュニティライセンスをロードするよう明確に拒否します。リンクの無効化と削除は可能で、レガシー設定の整理に使えます。ライセンスアップグレード後はダッシュボードや REST API からリンクを有効化でき、ノード再起動は不要です。

  • #17549 EMQX Backup Sync プラグインを追加しました。プライマリクラスタからセカンダリクラスタへ Data Backup API を使って選択した設定を定期同期します。HTTPS 呼び出しの TLS 設定を構成可能です。

  • #17620 ルーティングテーブルを検査・調整するオペレーター向け診断モジュール emqx_router_tool を追加しました。emqx ctl eval で実行します。

    • cluster_schema_view/0: クラスター各ノードのルートストレージスキーマを報告。
    • scan_missing_routes/0,1: ローカルサブスクリプションテーブルをストリームし、このノードにルートエントリがないトピックを報告。2 パスで実行し、スロットリングされ、同時サブスクライブ・アンサブスクライブを許容。
    • reconcile_missing_routes/0,1: 既存の emqx_router:add_route/2 API を使って欠落ルートを再追加。

    スキーマ非依存でライブクラスターで安全に実行可能です。

マルチテナンシー ​

  • #17665 マルチテナンシーアプリでネームスペースごとのドロップメッセージとドロップ配信のカウンターを追加しました。/api/v5/prometheus/namespaced_stats で namespace ラベル付きで既存のネームスペースメトリクスと並べて公開します。オペレーターは Prometheus でテナントごとのドロップ率をログ確認なしに診断可能です。

    既知の制限: QoS 2 PUBREL 待機タイムアウトによるドロップはまだネームスペース帰属がなく、グローバルカウンターのみ増加します。

  • #17711 ビルトインデータベース認証ユーザー HTTP API でネームスペース選択を一貫化し、削除済みネームスペースのレコードのクリーンアップを可能にしました。

    以前はユーザー作成のみリクエストボディに namespace フィールドを受け入れ、更新・削除は ns クエリパラメータのみ受け入れていました。更新・削除エンドポイントもリクエストボディの namespace を受け入れ、両方指定時は ns が優先されます。ユーザー一覧は引き続き ns クエリパラメータを使います。

アクセス制御 ​

  • #17564 ハード化セキュリティプロファイルで認可バックエンド障害時にフェイルクローズ動作を追加しました。ハード化モードではバックエンド障害や無効な応答はアクセス拒否し、レガシーモードは従来の無視・フォールバック動作を維持します。

  • #17589 ハード化セキュリティプロファイルでアクセス制御フックコールバック障害時にフェイルクローズ動作を追加しました。認証・認可フックコールバックのクラッシュはアクセス拒否となり、無視されません。

  • #17674 ハード化セキュリティプロファイルで認証バックエンド障害や不正応答時にフェイルクローズ動作を追加しました。レガシー動作は authentication_settings.ignore_backend_failures で維持可能です。

  • #17696 ハード化セキュリティプロファイルで JWKS エンドポイントの TLS 証明書検証をデフォルトで有効化し、JWKS キーが利用不可の場合は JWT を拒否し、JWT 資格情報がない場合は拒否するようにしました。

データ統合 ​

  • #17481 MQTT ブリッジのイングレス(ソース)サブスクリプションに retain_as_published オプションを追加しました。ブリッジが MQTT 5.0 で接続し、retain_as_published = true の場合、転送メッセージの元の retain フラグを保持し、上流の保持メッセージを忠実に再パブリッシュします。デフォルトは false で従来動作を維持します。proto_ver が v3 または v4 の場合は効果なし。

    また、bridge_mode = true と proto_ver = v5 の同時設定時に警告ログを出すようになりました。MQTT 5.0 ではレガシーブリッジモードフラグは無効で、個別サブスクリプションで retain_as_published を設定してください。

  • #17508 PostgreSQL と TimescaleDB コネクションで application_name 起動パラメーターを emqx に設定しました。

    これにより PostgreSQL ログや pg_stat_activity で EMQX データベースセッションを識別しやすくなります。

  • #17576 GreptimeDB コネクターで TLS 暗号スイート設定を ssl.ciphers でサポートしました。暗号リスト指定時は TLS ネゴシエーションがそれらに制限され、サポート外の暗号は起動時に拒否されます。

  • #17594 Google Cloud Pub/Sub と BigQuery コネクターの service_account_json 値を file:// 秘密ファイルで設定可能にし、外部ファイルからサービスアカウント認証情報を注入可能にしました。

  • #17717 Confluent Producer コネクターで TLS ピア検証を有効にするオプションを追加しました。

  • #17718 GCP PubSub Producer/Consumer と BigQuery コネクターで TLS ピア検証を有効にするオプションを追加しました。

クラスター ​

  • #17586 グローバルセッションレジストリの古いエントリを定期的に削除するようにしました。

    セッションの所有プロセスがクリーンに登録解除されずに死ぬと、同じクライアント ID が再接続しない限りレジストリ行が永続的に残っていました。新しいスロットル付きバックグラウンドスイープが各コアノードで最大 1 秒あたり 500 行、10 分に 1 回以下の頻度で実行され、数百万セッションのレジストリでもスループットに影響しません。

  • #17773 クラスター RPC レイヤーが予期せず中断した際に設定更新コマンド(REST API と CLI)が function_clause クラッシュする問題を修正しました。例: ノード起動やリカバリー中に cluster_rpc_mfa が存在しない場合。これらの失敗は構造化エラーとして呼び出し元に返されます。

  • #17764 オフライン時にアンインストールされたプラグインがノード再参加後に古いエントリとして残る問題を修正しました。プラグイン起動時にクラスタプラグイン設定に存在しないローカルプラグインパッケージを削除します。

アクセス制御 ​

  • #17575 emqx_username_quota プラグインの競合状態を修正しました。ユーザー名ごとのセッションカウンターが実際のクライアント数と不整合になることがありました。カウンターがゼロ未満に減算され、削除された後に同時にインクリメントされるとインクリメントが失われていました。

  • #17644 plain パスワードハッシュアルゴリズムが大文字小文字のみ異なるパスワードを認証していた問題を修正しました。

  • #17646 JWT 認証で使用する JWKS 取得クライアントの HTTP/1.1 プロトコル準拠問題を修正しました。以前のバージョンは Erlang/OTP inets HTTP クライアントの既定で空の TE: ヘッダーを送信していました(upstream で修正済み)。一部 ID プロバイダー(PingFederate など)がこれを拒否します。EMQX は JWKS 取得時に明示的で有効な TE: trailers ヘッダーを送信します。

  • #17653 Prometheus 設定 API がプッシュゲートウェイの Authorization ヘッダー値を返すセキュリティ問題を修正しました。API はこれらの値を応答でマスクします。

  • #17654 POST /authentication で認証器を作成すると、JWT HMAC シークレット、HTTP Authorization ヘッダー、リクエストボディのパスワードなどのプロバイダー秘密をマスクせずに返していた問題を修正しました。作成応答は一覧・取得エンドポイントと同様のマスクを適用します。

  • #17657 生の authorization と cookie ヘッダーがプラグイン API コールバックに転送されていたセキュリティ問題を修正しました。これらの認証情報を含むヘッダーはプラグインコードに渡る前にマスクされます。

  • #17711 ビルトインデータベースユーザーの作成・更新で、ターゲットネームスペースが存在しない管理ネームスペースの場合に「Managed namespace not found」エラーで失敗するように修正しました。以前はリクエストボディにネームスペースを指定すると存在しないネームスペースでユーザーが作成可能でした。

    さらに、グローバル管理者は削除済みネームスペースに属するビルトインデータベースユーザーを削除可能になりました。以前は「Managed namespace not found」エラーでした。

  • #17736 JWT 認証器で、設定された鍵タイプに一致する JWS アルゴリズムのみ検証するよう制限しました。HMAC 認証器は HS256、HS384、HS512 のみ受け入れ、公開鍵と JWKS 認証器は RS*、PS*、ES*、EdDSA を受け入れます。alg=none を含む鍵タイプと一致しないトークンは拒否されます。

  • #17739 ログ、トレース、監査レコードの機密データのマスキングを改善しました。

  • #17787 HTTP コネクターの ehttpc ワーカーがリクエスト完了前に終了すると、リクエストヘッダーがエラーログに含まれていた問題を修正しました。

    以前はリクエスト中に ehttpc ワーカーが終了すると、gen_server:call の引数が EXIT 理由に含まれ、リクエストヘッダーがそのままエラーログに書き込まれていました。EMQX はログ出力前に呼び出し引数を削除します。

  • #17790 初回 MFA 設定時に dashboard_login_failed サーバーログに TOTP 共有シークレットを書き込むのをやめました。

  • #17791 設定更新時に出力される cluster_rpc_apply_result と cluster_rpc_apply_ok のデバッグログに JWT HMAC 鍵バイトが表示されなくなりました。

    ロガーマスクは内部 JWK レコードの形状を認識し、ログ出力前にプレースホルダーに置換し、jwk フィールドも機密として扱います。

マルチテナンシー ​

  • #17715 multi_tenancy.post_auth_tns_expression が空文字列またはエラーを返す場合、ネームスペースゲート(allow_only_managed_namespaces 適用、セッションクォータなど)がスキップされていた問題を修正しました。

    空文字列とエラーは「ネームスペース未割当」とみなし、認証前にネームスペースを指定しなかったクライアントと同じゲートを通過します。allow_only_managed_namespaces = true の場合は拒否され、false の場合はネームスペースなしで許可されます。この場合、認証前の client_attrs.tns にあったネームスペース値もクリアされ、式が割り当てを拒否した場合に保持されません。

  • #17757 /prometheus/namespaced_stats でネームスペース管理者・API キーが自身のネームスペースのデータのみ閲覧可能になりました。グローバル管理者・API キーはすべてのネームスペースのデータを閲覧可能です。

ゲートウェイ ​

  • #17528 MQTT-SN 遺言メッセージパブリッシュ、JT/T 808 上流パブリッシュと自動ダウンリンクサブスクライブ、GBT32960 上流パブリッシュと自動ダウンリンクサブスクライブ、OCPP 上流パブリッシュと自動ダウンリンクサブスクライブの前に認可チェックを行うよう修正しました。

  • #17556 OCPP ゲートウェイがリスナーの enable_authn オプションを共有認証フローに渡していなかった問題を修正しました。クライアント情報キーの誤記が原因でした。

  • #17581 JT/T 808 ゲートウェイで認証時に受け入れた電話番号を接続識別に使うように修正しました。登録コード認証の不一致や異なる電話番号のアップリンクフレームは拒否されます。

  • #17604 GBT32960 ゲートウェイのルーティングで、車両の下流コマンド(パラメータクエリ、パラメータ設定、端末制御)への応答が upstream/response に正しくパブリッシュされるよう修正しました。以前は upstream/transparent でした。

可観測性 ​

  • #17497 非バッチモード(batch_size = 1)のアクションで actions.executed メトリクスが actions.messages を過小集計していた問題を修正しました。

    従来はバッファワーカーテレメトリフラッシュごとに 1 回インクリメントしていたため、複数の個別完了を 1 つのイベントに集約し、actions.executed が actions.messages に追いついていませんでした。

    現在は 2 つのメトリクスが独立した呼び出し箇所でインクリメントされます。actions.executed はアクションコールバック呼び出しごと(バッチモードはバッチごと、単一モードはメッセージごと)、actions.messages は処理したメッセージごとに増加します。

  • #17513 Prometheus の認可マッチング許可・拒否メトリクスが実際の認可決定を反映するよう修正しました。

ファイル転送 ​

  • #18069 ファイル転送ファイル API(GET /api/v5/file_transfer/files)が非 ASCII 文字(例: 中国語)を含むファイル名のファイル一覧で 500 エラーになる問題を修正しました。

デプロイメント ​

  • #17877 emqx-enterprise Helm チャートがノードのホスト名に svc.cluster.local をハードコードしていた問題を修正しました。DNS ドメインが cluster.local でない Kubernetes クラスターで、ノードが解決不能な FQDN を名乗り Erlang 分散が開始できずクラスター形成に失敗していました。ホスト名はチャートの clusterDomain 値に従うようになりました。

6.2.1 ​

リリース日: 2026-06-11

EMQX 6.2.1 にアップグレードする前に、破壊的変更と既知の問題を必ず確認してください。

強化点 ​

セキュリティ強化 ​

  • #17040 API キーによるダッシュボードユーザーアカウント管理エンドポイントへのアクセスを制限しました。

    以前は administrator ロールの API キーが HTTP Basic 認証で POST/DELETE /users/:username/mfa と POST /users/:username/change_pwd を呼び出せました。これにより API キーで他ユーザーの MFA をリセット・無効化したり、パスワードを変更できていました。

    これらのエンドポイントは API キー経由でアクセスすると 401 API_KEY_NOT_ALLOW を返し、既存の /users、/users/:username、/logout、/api_key への API キーアクセス制限と整合します。ダッシュボードユーザーはベアラートークン(JWT)セッションでダッシュボード UI から自身の MFA とパスワードを管理できます。

  • #17173 API キーによるダッシュボードアカウントと API キーのエクスポート・インポートを制限しました。

    API キーで呼び出した POST /data/export はアーカイブから dashboard_users と api_keys の mnesia テーブルセットを静かに除外し、POST /data/import はこれらのテーブルセットを含むアップロード時に 403 FORBIDDEN を返します。

    ダッシュボードのベアラートークン(ログイン)呼び出しは影響なく、ダッシュボードユーザーと API キーを含む完全なデータベースのバックアップと復元が可能です。

    これは特権昇格のギャップを解消します。既存の /users と /api_key エンドポイントは API キーによるダッシュボードログイン資格情報と API キーのアクセスを拒否しますが、API キー保持者はデータバックアップ経由でこれらの制限を回避できていました。

  • #17187 未認証の GET /status?format=json 応答から EMQX リリースバージョン(rel_vsn)を削除しました。バージョンは認証済みノード情報 API で引き続き取得可能です。

  • #17201 アップロードされた tarball のパストラバーサルに対してプラグインインストールエンドポイントを強化し、許可リストを�