MQTTの特長 セキュリティベストプラクティスと実装

バイ Hema


MQTT security best practices

モノのインターネット(IoT)のエコシステムが、世界中から数十億台のデバイスを接続 産業機械へのホーム オートメーション システム。 小規模なIoTネットワークと連携しているか 管理された環境または大規模、エンタープライズレベルのIoTエコシステム、セキュリティの実装 見逃せない。 アクセス制限のあるクローズドネットワークの実装でも、アクセスの危険性 内部攻撃、不正なデバイスアクセス、データ侵害はまだ存在します。 弱いセキュリティ デプロイメントのあらゆる規模での慣行は、機密データを公開し、デバイスの完全性を損なうことができます。 システム全体を消滅させます。 このガイドでは、IoT のセキュリティ プラクティスを探求し、方法に焦点を当てます。 実装するMQTTによるセキュリティ対策(Paho(client)とCrystalMQ(server)の一例を持つメッセージキューイングテレメトリートランスポート。


セキュリティリスクの把握 IoTソリューション

IoTエコシステムの確保の第一歩は、様々な理解が進んでいます。 脆弱性:

  • データ Breaches:送信される敏感なデータ 暗号化されていないチャンネルを超えて。
  • 装置ハイジャック:不正なアクセス デバイス。
  • マン・イン・ザ・ミドル攻撃(MITM):データの傍受と変更。
  • サービスの拒否(DoS):システムのフラッド 圧倒的なリソースへの偽の要求。

これらのリスクを軽減するには、クライアントとサーバー側のセキュリティプロトコルの両方を実装することが重要です。 データの暗号化と安全なホスティングを確保するだけでなく、

MQTTとそのセキュリティ課題

MQTTの特長効率的な通信のために設計された軽量プロトコル IoTデバイスとセントラルサーバー間で 禁忌のデバイスにとって理想的ですが、そのシンプルさはそのようなセキュリティ上の課題につながることができます として:

  • 組み込み暗号化の欠如
  • 非認証デバイス接続
  • 細かいアクセス制御の欠如

これらの問題を克服するために、MQTTは、このようなセキュリティの追加の層を必要とします暗号化のためのSSL/TLS, デバイス認証、アクセス制御リスト(ACLs)の認証

クライアントサイド セキュリティ: Python MQTT

使い方Python MQTTクライアント例として、安全な接続を確立する方法を見てみましょう。 サーバ。 重要なセキュリティ設定は次のとおりです。

ステップ1:クライアント認証を有効にします(ユーザー名とパスワード)

セキュリティの第一層は基本認証です。 Pahoは、これをセットアップするための簡単な方法を提供します 設定。

インポート paho.mqtt.client として mqtt

クライアント = mqtt.Client()

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 認証のユーザー名とパスワードを設定する

client.username_pw_set(username="client_user") は、 パスワード="client_password"

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ブローカーに接続する

client.connect(「broker.example.com」、1883、60)

クライアント.loop_start()

ステップ2: TLS/SSL暗号化を有効にする

転送中のデータを保護するには、TLS/SSL を有効にする必要があります。 Paho は、シンプルな SSL をサポート 構成:

インポート paho.mqtt.client として mqtt

クライアント = mqtt.Client()

# CA証明書へのパス

client.tls_set(ca_certs="/path/to/ca.crt")

# TLS/SSL を有効にする

client.username_pw_set("client_user"、"client_password")

client.connect(「broker.example.com」、8883、60)

クライアント.loop_start()

ステップ3:証明書の検証

MITM攻撃を避けるためにブローカーの証明書を必ず確認してください。 ザ・オブ・ザ・ Paho クライアントは、データの完全性を確保するために、さまざまな証明書オプションをサポートしています。

Paho はデフォルトで証明書のバリデーションのオプションを提供し、デフォルトで設定できます。tls_set()そして、tls_insecure_set()お問い合わせ ここで例を示します。 クライアント ブローカーの証明書を証明書の認証機関(CA)に対して検証し、その認証を確実にします。 接続は安全です。

インポート paho.mqtt.client として mqtt

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 新しいMQTTクライアントインスタンスを作成する

クライアント = mqtt.Client()

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 基本的な認証のためのユーザー名とパスワードを設定する

client.username_pw_set(username="client_user") は、 パスワード="client_password"

# ブローカーの証明書を検証するためのCA証明書へのパス

ca_cert_path = "/path/to/ca.crt"

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 顧客の自身の証明書および秘密鍵への道(任意、相互TLSのための)

client_cert_path = "/path/to/client.crt"

client_key_path は "/path/to/client.key" です。

# TLS/SSL 暗号化を有効にして証明書の検証

client.tls_set(ca_certs=ca_cert_path,

certfile=client_cert_path,

キーファイル=client_key_path,

tls_version=mqtt.sl.PROTOCOL_TLSv1_2)

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 証明書が検証されていることを確認してください(検証を強制するためにFalseに設定)

client.tls_insecure_set(偽)

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 安全な港のブローカーに接続します(通常、SSL上のMQTTのための8883)

ブローカー_url = "broker.example.com"

ブローカー_port = 8883

client.connect(broker_url、ブローカー_port)

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # クライアントループを起動してネットワークイベントを処理します

クライアント.loop_start()

導入事例
  • ca_certs=ca_cert_path:これは、 CA 証明書ファイル。 クライアントはブローカーの証明書が行われたことを検証することができます 信頼できる証明書の権限によって署名される。
  • certfileとkeyfile(オプション):これらのパラメータは、クライアントが証明書を提示する相互TLS(mTLS)に使用されます。 ブローカー。 これは、両方の当事者が検証されていることを保証する、セキュリティの任意層です。 相互認証を必要としない場合、これらの行を省略できます。
  • tls_insecure_set(偽):これにより、 ブローカーの 証明書は常に検証されます。 False に設定することで、Paho が検証しなければならないことを強制します。 提供されたCA証明書に対するブローカーの証明書。 バリデーションが失敗した場合、接続は確立されません。
  • TLSのバージョン:TLSを明示的に設定 バージョンからPROTOCOL_TLSv1_2 まで、最新バージョンの TLS の使用を保証します。 (またはクライアントとブローカーの両方でサポートされている場合は、TLS 1.3などの新しいバージョン)。

4。 サーバーサイドセキュリティ:クリスタル MQ の MQTT ブローカー

MQTTブローカーは、IoT通信の心臓部にあります。 ブローカーの確保は、ブローカーが保証する 認証されたデバイスは、接続して通信することができます。 私たちについてMQTTブローカー(CrystalMQ)は保護するために多数の保証層を提供します IoTインフラ

ステップ1: SSL/TLS暗号化を有効にする

CrystalMQは通信を暗号化することを可能にするSSL/TLSを支えます ブローカーとIoTデバイス間で。

  • ブローカーが安全な通信のためにポート8883を使用するように設定します。
  • 自己署名またはCA署名証明書をアップロードします。
  • クライアントの接続に必須 TLS を有効にします。

自己署名されたCA証明書が付属しています。 CrystalMQ/認証フォルダ。 デフォルトの自己署名証明書を使用して、または独自のカスタム証明書に置き換えることができます。

参照して下さい'TLS/SSL暗号化 お問い合わせ私たちのセクション 当社のブローカーでTLS/SSLを構成するドキュメントを支援します。

ステップ2:ユーザー認証

CrystalMQは、簡単に構成できるユーザ認証システムを提供します。

認証キーとトークン(ユーザー名とトークン)を作成できます。 パスワード)セキュリティタブの下にMQTTブローカーダッシュボードを介して。 これにより、ダッシュボードから直接クライアント認証を簡単に管理できます。

新しいユーザーを追加または作成するには:
  • ダッシュボードのセキュリティタブに移動します。
  • クライアント認証用のユーザー名とパスワードで新しいユーザーを追加します。

作成したキーは、Pahoクライアントで設定/設定されます。 username_pw_set() 関数。

セキュリティの設定に関する詳細は、当社にてご確認ください。ブローカーヘルプ文書お問い合わせ

ステップ3:アクセス制御リスト(ACL)による認可

正規化はクライアントが認証されると、クライアントが認証されると、 特定のトピックへの公開やサブスクライブなどの特定のアクションを実行できます。アクセス制御リスト(ACL)一般的な方法は、 これらの許可をMQTTシステムで管理します。

CrystalMQ では、管理者は ACL を個人のために構成できます ユーザー名または接続されたクライアントID。 これは、MQTTブローカーを介して行うことができます セキュリティメニューにナビゲートしてダッシュボードを操作します。

  • ユーザー名ベースの ACL:各MQTTのユーザー名は、 公開/購読のトピックの特定の権限を割り当てられます。 デフォルトでは、新しいユーザーはアクセス権を持っています すべてのトピックに、 ユーザーの設定を編集することで変更できます。
  • クライアントベースの ACL:管理者は設定できます クライアント ID に基づいて、既に接続されているクライアントの ACL です。

たとえば、クライアントは、拒否される間、特定のトピックへの公開だけに限定される 他人へのアクセス

5。 トランジットとレストでデータを保護

特にIoTシステムにとってデータセキュリティは極めて重要です。 送信される間の保護を要求する敏感な情報を扱う() 転送)と保存時(休憩時)。 セキュアなIoTエコシステムにより、データが暗号化されるようにします。 安全に保管し、不正なアクセスを防ぎ、データのリスクを最小限に抑える 違反。

トランジットのデータ

トランジットのデータとは、IoTデバイスからサーバー、またはサーバーから転送されるデータを指します。 クライアント。 このフェーズにおける最大のリスクは、攻撃者による傍受であり、 マン・イン・ザ・ミドル(MITM)攻撃 そのような攻撃を防ぐため、このような暗号化プロトコルTLS/SSLの特長必須です。

残りデータ

残りデータとは、サーバーやデータベースに保存されているデータを指します。 ストーリング 不正なアクセスを防ぐため、データの安全性が極めて重要です。 特にサーバーへのデータ侵害や物理的アクセスの場合。

残りのデータを保護するためのベストプラクティス:
  • 暗号化された貯蔵:水晶 MQは、ハッシュとソルトメソッドを使用して、クライアント認証キーを保存します。 これにより、攻撃者がストレージにアクセスできる場合でも、 元のキーは取得できません。 ハッシュ関数は、それぞれにユニークな塩と組み合わせて キーは、保存した値をリバースエンジニアリングすることを可能にします。 機密認証データ。
  • CrystalMQはメッセージデータを安全に保存し、ブローカーがログを保存できるようにします。 暗号化されたデータベースの永続的なメッセージ。
  • 暗号化キー管理: 安全なキー管理慣行は保護するために置かれるべきです 暗号化キー。 キーが定期的に回転していることを確認してください ハードウェアセキュリティモジュール(HSM)またはセキュアなキーボルトを使用して安全に保存します。
  • アクセス制御と認証:ソリューションプロバイダー IoTプラットフォームマルチファクターを使用してデータストレージへのアクセスを制限 認証 (MFA)、ロールベースアクセス制御(RBAC) これにより、認定された人材のみが確保される 保存されたデータにアクセスできるサービス
  • データ保持ポリシー:当社のクラウドホストMQTTブローカー不要なデータの保存を最小限にするために、明確なデータ保持ポリシーを持っています。 古いデータや冗長データを削除すると、攻撃者に対する危険性を低下させ、コンプライアンスを確保 データのプライバシーに関する法律などGDPRについてまたは CCPA。 ローカル環境で自分のデータベースを管理するときにもこのポリシーを実践することができます。

6。 ホスティング環境のセキュリティ

ホスティング環境のセキュリティは、重要な役割を果たしています IoTエコシステム全体の保護 CrystalMQ をデプロイするかどうか オンプレミスまたは使用 クラウドベースのインフラ, ホスティング環境が安全であることは、完全性を維持し、 システムの可用性。

オンプレミスホスティング

IoTインフラをオンプレミスに保つことを好む企業のために、 ホスティングセキュリティは、物理的およびネットワークを含みます ローカルデータセンターまたはサーバールームのセキュリティ。

オンプレミスホスティングの主な考慮事項:
  • ネットワークの区分:IoTのセグレーション 仮想LAN(VLAN)またはソフトウェア定義のネットワークを使用して、企業ネットワークからのネットワーク (SDN)。 これにより、企業を通じてIoTデバイスに到達する攻撃者のチャンスを最小限に抑えます ネットワーク
  • 防火壁および侵入の検出システム(IDS):ファイアウォールをデプロイして、不正なトラフィックとIDSをブロックし、悪意のあるトラフィックを監視および検出する リアルタイムでの活動
  • 規則的なパッチ:皆様のお越しをお待ちしております。 サーバー, ブローカーソフトウェア、およびオペレーティングシステムは、最新のセキュリティパッチで定期的に更新されます。 古いソフトウェアの脆弱性は、攻撃者によって簡単に悪用することができます。

クラウドベースのホスティング

クラウドベースの展開はスケーラビリティと柔軟性を提供しますが、クラウド 脅威に IoT システムを公開しないように、環境を安全に設定する必要があります。

クラウドベースのホスティングの主な考慮事項:
  • セキュアクラウドプロバイダ:クラウドの選択 Amazon Web Services(AWS)、Microsoftなどの強力なセキュリティ機能を提供するプロバイダ Azure、デジタルオーシャンなど これらのプロバイダは、内蔵ファイアウォール、DDoS保護、および 暗号化サービス。
  • 隔離された仮想マシン(VM)または 容器:隔離された VM またはコンテナ化された環境 (例: Docker) をホストするMQTTブローカーお問い合わせ これは、他のサービスからブローカーを隔離し、セキュリティ侵害を1つに保障します コンテナはシステム全体に影響を与えません。
  • クラウド内のデータの暗号化:インフォメーション クラウドに保存されているすべてのデータは、クラウドネイティブ暗号化サービスを使用して、残りで暗号化されます。 のために AWS はAWS を提供しています。 キー管理サービス(KMS)は、セキュアなキー管理を実現します。
  • ネットワークセキュリティグループ(NSG)とVPN:NSGや仮想プライベートネットワーク(VPN)の設定で、ブローカーやIoTへのアクセスを制限 プラットフォームは、信頼できるデバイスとサービスのみが接続できるようにします。
  • バックアップと災害 回復:導入事例 ブローカー構成とデータの定期的なバックアップ。 災害・データ侵害の場合 ダウンタイムを最小限にするために回復計画があります。

IoTセキュリティ規格への対応

オンプレミスとクラウド環境の両方がIoTセキュリティに準拠 のような標準:

  • GDPRについて(一般データ保護規則): EUにおけるIoTシステムのデータのプライバシー確保

堅牢で安全なIoTエコシステムを構築する方法です。 まずはMQTTのセキュリティプロトコル クライアントとサーバーの両側に、安全なデータ処理と組み合わせ、 ホスティング慣行は、IoT環境における一般的なセキュリティリスクの多くを緩和できます。

クリスタルMQを使って MQTT サーバーとしてのブローカーは、最先端のIoTセキュリティプラクティスを実装できます。 データとデバイスを保護するため、より安全なIoTインフラを確保します。