レート制限による MQTT ブローカーの信頼性とセキュリティの向上
導入
レート制限とは通常、特定の期間中のネットワーク内のデータ転送レートを制限し、ネットワーク トラフィックが許容範囲内に収まるようにすることを指します。これにより、受信側での輻輳や過負荷を防ぎ、安定性や信頼性への影響を回避できます。
このブログでは、レート制限の利点、つまり、IoT プラットフォームとアプリケーションのセキュリティをどのように強化できるかについて検討します。
レート制限はシステムをどのように保護しますか?
通常、レート制限にはネットワーク内の通常のトラフィックの管理が含まれます。トラフィックは正当なアクセスから発生し、ユーザーの動作に基づいて変化します。たとえば、ユーザーが起きている時間帯にはシステムの受信トラフィックが増加し、ユーザーが非アクティブになると減少します。このブログ投稿では、悪意のあるトラフィックの軽減に対するレート制限の影響について調査します。
システムに対する悪意のある攻撃のリスクを最小限に抑えるために認証および認可サービスを採用することもありますが、ユーザー アカウントがハッキングまたは盗難される可能性も認識する必要があります。レート制限ポリシーがないと、攻撃者は侵害されたアカウントを悪用してシステムに悪意のあるトラフィックを大量に送り込み、その結果、システムに過剰な負荷がかかる可能性があります。トラフィックのピーク時に、この過負荷により、正規のユーザーに高速で信頼性の高いサービスを提供するシステムの能力が損なわれる可能性があります。
ただし、適切なレート制限ポリシーを使用すると、侵害されたアカウントを所有する攻撃者であっても、限られた方法でのみシステムにアクセスできるようになり、システムが処理できる以上のトラフィックを生成することができなくなります。
MQTT の一般的なレート制限ポリシー
クライアント接続のレートと数を制限する
クライアントが接続を確立すると、サーバーは新しいスレッドの作成やクライアント ID の登録などのさまざまなタスクを実行します。認証サービスが有効になっている場合、接続要求ごとにサーバー側の認証プロセスがトリガーされます。このプロセスでは、特により安全なハッシュ アルゴリズムを使用する場合、データベースの検索と CPU を大量に使用するハッシュ計算が必要になる場合があります。
その結果、クライアントの最大接続速度を制限することで、攻撃者が短期間に多数の接続を開始してサーバー リソースを使い果たすことを効果的に防止できます。
さらに、サーバー側で接続を維持すると、CPU、メモリ、その他のリソースの消費が発生します。攻撃者は、サーバーとのアイドル状態の多数の接続を確立しようとすることでこれを悪用し、サーバーの通常の動作を妨害する可能性があります。したがって、サーバーは最大接続数の制限を強制することが不可欠になります。
EMQX の構成例:
listeners.tcp.default {
max_connections = 1024000
max_conn_rate = 1000
}
公開レートを制限するかクォータを設定する
1 秒あたりに公開できるメッセージの最大数または 1 秒あたりに公開できる合計メッセージ サイズに制限を設定することで、個々のクライアントの公開速度を制限する必要があります。後者は、攻撃者が少数の大きなメッセージをシステムに大量に送信してサーバー リソースを急速に使い果たすことを防ぎます。さらに、権限管理メカニズムと組み合わせると、クライアントの権限レベルに基づいてさまざまなレート制限を割り当てることができます。
クライアントの動作を管理するもう 1 つのアプローチは、クォータを設定することです。たとえば、クライアントは 1 秒あたり最大 100 メッセージを送信できますが、1 日あたり 5000 メッセージという制限が適用されます。制限に達すると、クライアントは翌日まで追加のメッセージを送信するまで待つ必要があります。
MQTT のさまざまな QoS によるシステム リソースの過度の使用を避けるために、QoS に基づいてメッセージの数を制限できます。たとえば、クライアントは 1 秒あたり 100 個の QoS 0 メッセージしか送信できませんが、1 秒あたり 50 個の QoS 1 および 2 メッセージしか送信できません。これにより、攻撃者がより高い QoS を悪用してサーバーのリソースを急速に枯渇させることを阻止できます。
EMQX の構成例:
listeners.tcp.default {
messages_rate = "1000/s"
bytes_rate = "100KB/s"
}
クライアントの購読率を制限する
MQTT を使用すると、クライアントは事前登録なしでトピックをサブスクライブできます。代わりに、このステップは、クライアントがサーバーとの接続を確立するまで延期されます。クライアントが新しいサブスクリプションを開始すると、サーバーはルーティング テーブルの更新などのタスクを実行する必要があります。攻撃者は、クライアントに短期間に多くのトピックをサブスクライブさせることでこれを悪用し、書き込み操作でサーバーに過負荷がかかり、通常のサービスが中断される可能性があります。これを防ぐために、1 つのクライアントが 1 秒あたりに作成できるサブスクリプションの数に制限を設定できます。
異常行為の防止
前述の攻撃には、攻撃者が正規のユーザーになりすまして悪意のあるリクエストを開始することが含まれます。ただし、攻撃者が有効なリクエストを送信せずにサービスを妨害する場合があります。たとえば、攻撃者は、未承認のトピックにメッセージを公開しようとする可能性があります。サーバーがこれらのメッセージを中継しない場合でも、攻撃者はこの状況を悪用して、特権検証プロセス中にサーバーの計算リソースを消費する可能性があります。
このタイプの攻撃は、一般に DOS 攻撃または DDOS 攻撃と呼ばれます。MQTT では、攻撃者が継続的に接続を確立し、認証リクエストを開始することで、同様の戦略を採用する可能性があります。攻撃者は最終的には最大接続速度制限によって阻止されますが、それでも他の正当なクライアントが接続を確立するのを妨げる可能性があります。
したがって、サーバーはこれらの潜在的なセキュリティ脅威を迅速に特定し、対応する必要があります。一般的な戦略の 1 つは、異常な動作を示すクライアントに関連付けられた IP アドレスまたはクライアント ID を含むブラックリストを維持し、それらのアクセスを効果的にブロックすることです。
まとめ
レート制限は、トラフィックを制限してバランスをとることにより、攻撃者が悪意を持ってサーバー リソースを消費し、サービスの信頼性に影響を与えることを防ぎます。また、通常のビジネス変更によるトラフィックの変動にも対応できます。ただし、一部の攻撃では攻撃者が有効なリクエストを送信する必要がなく、レート制限を回避する可能性があります。したがって、サーバー側でもこれらの潜在的なセキュリティ脅威を特定する必要があります。
EMQX は、ユーザーのセキュリティを優先しながら、高い拡張性と可用性を提供する、広く使用されているMQTT ブローカーです。EMQX では、リスナーごとに異なるレート制限を簡単に設定し、指定したクライアント ID または IP をバックリストに追加できます。詳細については、EMQX のレート制限とブラックリスト機能のドキュメントを参照してください。