wolfMQTT ブローカー:永続化、保存データの暗号化、堅牢性の強化

wolfMQTT は10年にわたり、クライアントライブラリとしてのみ提供してきました。v2.0.0 では、新たに軽量な MQTT ブローカーを追加しました。クライアントと同じコードベース上に構築し、厳しいフットプリント要件と TLS スタックをそのまま引き継いでいます。直近の2回のリリースでは、プロセスを再起動しても状態を保持するために必要な中核機能を追加したほか、ネットワークに高い負荷がかかったときに表面化するエッジケースを修正しました。

再起動後も状態を保持する永続化機能

v2.1.0 では、MqttBroker_SetPersistHooks による差し替え可能な永続化フックを導入し、すぐに使える POSIX バックエンド(MqttBrokerNet_PersistPosix_Init と MqttBrokerNet_PersistPosix_Free)も用意しました。これらのフックを使えば、内部フラッシュや外部のキーバリューストアなど、ターゲットが備える任意のストレージを保存先にできます。これにより、セッション、保持メッセージ、配信待ちのメッセージを再起動後も維持できます。

また、メッセージの順序保証とオフラインメッセージキューも追加しました。サブスクライバーが CleanSession=0 で再接続すると、オフライン中に届いたメッセージを欠落なく受信できます。

AES-GCM による保存データの暗号化

永続化したブローカーの状態には、保持メッセージのペイロード、キューに入ったメッセージ、セッションのメタデータが含まれるため、機密性の高いアプリケーションデータがローカルに保存されることになります。そこでブローカーは、保存する状態を wolfCrypt の AES-GCM で暗号化して保護します。物理的に人の手が届く場所にあるエッジデバイスやゲートウェイを特に想定した機能です。

フェイルクローズ型の認証

先日、認証に関する重要なエッジケースを修正しました。これまでは、認証情報の一方だけを設定した場合(たとえば CLI フラグ -u を -P なしで指定した場合)、何の警告もなく単一要素の認証が有効になっていました。設定されていない側のフィールドを検証していなかったため、有効なユーザー名であればどのパスワードでも、有効なパスワードであればどのユーザー名でも受け入れていました。

MqttBroker_Start が不完全な認証情報の設定を MQTT_CODE_ERROR_BAD_ARG で拒否するように変更し、あわせて安全策として接続ハンドラもフェイルクローズするようにしました。両方の認証情報を NULL のままにした場合は引き続き認証が無効になるため、認証なしで運用されるのは、利用者が明示的にそう選んだ場合に限られます。

master ブランチでの信頼性向上

master ブランチに最近加えた更新では、部分書き込み(ブローカーがパケットの一部を送信した時点でソケットがブロックまたは失敗するケース)に対処しました。

  • 接続拒否の CONNACK パケットは、これまで書き込みが MQTT_CODE_CONTINUE を返すと途中で打ち切られ、クライアントには不完全なパケットが届いていました。応答を最後まで書き込むまで接続を維持し、その後でクローズするように変更しました
  • WOLFMQTT_NONBLOCK ビルドでハンドシェイクの完了前に接続をクローズしないよう、接続を受け入れる CONNACK の送信中はキープアライブタイマーを一時停止するようにしました。ハンドシェイクにかかる時間は、引き続き BROKER_CONNECT_TIMEOUT_SEC で適切に制限されます
  • QoS > 0 の PUBLISH の送信が途中で失敗した場合は、再送対象としてマークするようにしました。セッションの復旧時に DUP フラグを立てて再送します [MQTT-3.3.1-1]
  • 部分的に書き込まれた QoS 0 の PUBLISH メッセージは、再接続時に再びキューに入れず破棄するようにし、QoS 0 の再送を禁じる MQTT の規則に準拠させました。また、一時的なタイムアウト(MQTT_CODE_ERROR_TIMEOUT)で予期しないドロップが発生しないようにしました
  • 静的メモリビルドでは、ACK を受け取っていない QoS 1/2 のパケット識別子(Packet Identifier)をサブスクライバーごとに追跡するようにし、新しい PUBLISH メッセージが送信中(in-flight)の識別子を再利用しないようにしました [MQTT-2.3.1-4]。BROKER_MAX_INFLIGHT_PER_SUB 個のスロットがすべて埋まっている場合は、使用中の識別子を再利用せず、それ以降の配信を一時停止します

その他の特長

ブローカーは、セキュアな接続と平文の接続の同時利用、MQTT over WebSockets、保持メッセージ、グレースフルな切断に対応しています。標準的な TCP/IP スタックを持たない組み込みターゲットでは、wolfIP 上で直接動作します。継続的インテグレーション(CI)のテストには、libFuzzer ベースのファジング、AddressSanitizer、複数のコンパイラツールチェーンでのビルドを含めています。

入手方法

プロジェクトは GitHub で公開しています。最新リリースはダウンロードページから入手できます。ブローカーのソースコードは src/mqtt_broker.c に、使用例は examples/ ディレクトリにあります。

今すぐ wolfSSL をダウンロード

もし弊社製品についてご質問があれば、お問い合わせ窓口info@wolfssl.jpまでご連絡をお願い致します。

原文:https://www.wolfssl.com/the-wolfmqtt-broker-persistence-encryption-at-rest-and-a-round-of-hardening/