SSL/TLSによるMQTT通信のセキュリティ強化

![SSL/TLSによるMQTT通信のセキュリティ強化](https://assets.emqx.com/images/9ec30d3dc166719608cd89953d047275.png?imageMogr2/thumbnail/1520x684)
https://www.emqx.com/ja/blog/fortifying-mqtt-communication-security-with-ssl-tls

**目次**

- [導入](https://www.emqx.com/ja/blog/fortifying-mqtt-communication-security-with-ssl-tls#導入)
- [概念の説明](https://www.emqx.com/ja/blog/fortifying-mqtt-communication-security-with-ssl-tls#概念-説明)
- [TLSの概要](https://www.emqx.com/ja/blog/fortifying-mqtt-communication-security-with-ssl-tls#tls-概要)
- [MQTT セキュリティに TLS が不可欠なのはなぜですか?](https://www.emqx.com/ja/blog/fortifying-mqtt-communication-security-with-ssl-tls#mqtt-tls-不可欠)
- [TLS 認証方式](https://www.emqx.com/ja/blog/fortifying-mqtt-communication-security-with-ssl-tls#tls-認証方式)
- [認証方法の選択](https://www.emqx.com/ja/blog/fortifying-mqtt-communication-security-with-ssl-tls#認証方法-選択)
- [実装に関する推奨事項](https://www.emqx.com/ja/blog/fortifying-mqtt-communication-security-with-ssl-tls#実装-関-推奨事項)

## 導入

[前の記事](https://www.emqx.com/ja/blog/category/security)では、認証とアクセス制御のメカニズムについて説明しました。ここで、MQTT 通信の強化におけるトランスポート層セキュリティ (TLS) の重要な役割に光を当てます。このブログ投稿では、特に TLS と、MQTT 通信の整合性、機密性、信頼性を確保する TLS の機能に焦点を当てます。

## 概念の説明

始める前に、いくつかの重要な概念を説明しましょう。

- ハンドシェイク: TLS ハンドシェイクは、クライアントとサーバーの間に安全な接続を確立するプロセスです。ハンドシェイク中に、クライアントとサーバーはメッセージを交換して、使用する暗号化アルゴリズム、セッション キー、認証方法などの安全な接続のパラメータを確立します。
- 暗号スイート: 暗号スイートは、暗号化、ハッシュ、キー交換アルゴリズムを組み合わせて接続を保護します。TLS は複数の暗号スイートをサポートしており、クライアントとサーバーはハンドシェイク中に暗号スイートをネゴシエートします。
- 証明書: 証明書は、サーバーまたはクライアントの ID を確立するために使用されるデジタル文書です。証明書にはサーバーまたはクライアントの公開キーが含まれており、信頼された認証局 (CA) によって署名されています。
- セッション: セッションは、クライアントとサーバー間の通信期間です。セッション中、クライアントとサーバーは安全な接続を介してデータを交換します。セッションはクライアントまたはサーバーによって終了できます。

## TLSの概要

Transport Layer Security (TLS) は、インターネット上で安全な通信を提供する暗号化プロトコルです。TLS は、パスワード、クレジット カード情報、個人情報などの機密データを不正なアクセスや傍受から保護します。TLS は、Web アプリケーション、電子メール、インスタント メッセージング、およびインターネット上での安全な通信を必要とするその他のアプリケーションで広く使用されています。

TLS は、暗号化、データの整合性、認証を通じてセキュリティを提供します。

- 暗号化により、クライアントとサーバー間で送信されるデータが確実に暗号化されるため、権限のないユーザーはデータを読み取ることができません。
- データの整合性により、送信中にデータが変更されないことが保証されます。
- 認証により、クライアントが偽者ではなく目的のサーバーと通信していることが保証されます。

TLS は、公開キー暗号化と対称キー暗号化を組み合わせて使用して、これらのセキュリティ機能を実現します。

これらは、クライアントとサーバー間の最初の接続でハンドシェイク プロセスを実行します。ハンドシェイク中に、クライアントとサーバーはメッセージを交換して、使用する暗号化アルゴリズム、セッション キー、認証方法などの安全な接続のパラメータを確立します。TLS は複数の暗号スイートをサポートしており、クライアントとサーバーはハンドシェイク中に暗号スイートをネゴシエートします。証明書は、サーバーまたはクライアントの ID を確立するために使用されるデジタル文書です。証明書にはサーバーまたはクライアントの公開キーが含まれており、信頼された認証局 (CA) によって署名されています。公開キー基盤 (PKI) は、クライアントとサーバー間の信頼を確立します。

## MQTT セキュリティに TLS が不可欠なのはなぜですか?

[MQTT セキュリティ](https://www.emqx.com/en/blog/essential-things-to-know-about-mqtt-security)に関しては、TLS は MQTT メッセージの機密性、完全性、認証、および否認防止を保証することで重要な役割を果たします。機密データを不正アクセス、改ざん、傍受から保護し、 [MQTT クライアント](https://www.emqx.com/ja/blog/mqtt-client-tools)とブローカー間に安全で信頼できる通信チャネルを提供します。

TLS は、MQTT クライアントとブローカーの間で送信されるデータを暗号化することで機密性を確保します。TLS を使用しない場合、MQTT メッセージはプレーン テキストで送信されるため、ネットワークにアクセスできる人は誰でもデータを傍受して読み取ることができます。TLS を実装することにより、メッセージの内容は暗号化されたままとなり、権限のない者はアクセスできなくなります。

TLS はデータの整合性も提供します。これにより、送信中の MQTT メッセージの改ざんや変更が防止されます。各メッセージは TLS を使用してデジタル署名され、検出されずに変更できないことが保証されます。不正な変更が行われた場合、整合性チェックは失敗し、データが改ざんされたことを示します。

さらに、TLS により認証が有効になり、MQTT クライアントとブローカーが互いの ID を確認できるようになります。SSL/TLS 証明書を通じて、クライアントは正規の承認されたブローカーへの接続を検証できます。このプロセスは、ブローカーになりすまそうとする悪意のあるエンティティから保護し、クライアントと MQTT インフラストラクチャの間に信頼を確立します。

さらに、TLS は否認防止機能を提供します。デジタル署名を使用して、送信者がメッセージの送信を拒否できないようにします。デジタル署名によりメッセージの信頼性と送信元が確認され、特定のクライアントが特定のメッセージを送信したことを証明できます。

最後に、TLS は、攻撃者が MQTT メッセージを傍受して傍受する盗聴攻撃から MQTT 通信を保護します。また、攻撃者がクライアントとブローカーの間で交換されるメッセージを傍受して操作しようとする中間者攻撃からも保護します。

## TLS 認証方式

### 一方向認証

一方向認証は、TLS で使用される最も単純な認証形式です。一方向認証では、サーバーはデジタル証明書をクライアントに提示します。クライアントは証明書を検証して、それが有効であり、信頼できる CA によって発行されたものであることを確認します。証明書が確認されると、クライアントはサーバーとの安全な接続を確立できます。クライアントを認証する必要がない場合、またはクライアントの ID が重要でない場合は、一方向認証で十分です。

### 双方向認証

双方向認証、つまり相互認証 (mTLS) は、TLS で使用される、より安全な認証形式です。双方向認証では、クライアントとサーバーの両方が相互に認証します。クライアントはデジタル証明書をサーバーに提示し、サーバーはその証明書が有効であり、信頼できる CA によって発行されたものであることを確認します。また、サーバーはそのデジタル証明書をクライアントに提示し、クライアントはその証明書が有効であり、信頼できる CA によって発行されたものであることを確認します。両方の証明書が検証されると、クライアントとサーバーは安全な接続を確立できます。双方向認証は、クライアントとサーバーを認証する必要がある場合、またはクライアントの ID が重要な場合に使用されます。

### PSK認証

事前共有キー (PSK) では、クライアントとサーバーの認証に共有秘密キーが使用されます。クライアントとサーバーは、接続を確立する前に秘密キーに同意します。ハンドシェイク中、クライアントとサーバーは秘密キーを使用して相互に認証します。PSK は、公開キー暗号化の使用が困難または不可能な場合に使用されます。この方法は、すべての接続に同じキーが使用されるため、他の方法よりも安全性が低くなります。

### 証明書不要の暗号化

証明書のない暗号化では、クライアントとサーバーは、Diffie-Hellman などの鍵合意プロトコルを使用して共有秘密鍵を生成します。共有秘密キーは、クライアントとサーバーの間に安全な接続を確立します。共有秘密キーはネットワーク経由で送信されないため、傍受や盗聴に対して脆弱ではありません。また、証明書不要の暗号化により、信頼できるサードパーティがデジタル証明書を発行および管理する必要がなくなり、TLS の実装と管理が簡素化されます。大きな制限の 1 つは、クライアントとサーバーの両方が同じ鍵合意パラメータを持つ必要があることです。これは状況によっては困難になる可能性があります。さらに、証明書のない暗号化は TLS 実装で広くサポートされていないため、実際の適用性が制限される可能性があります。

## 認証方法の選択

TLS のセキュリティを確保するには、正しい認証方法を選択することが重要です。認証方法の選択は、必要なセキュリティのレベル、実装の容易さ、利用可能なリソースによって異なります。

- 一方向認証は、クライアントの ID が重要ではない場合に適しています。
- 双方向認証は、クライアントとサーバーの両方を認証する必要がある場合に必要です。
- PSK は、公開キー暗号化が使用できない場合に役立ちますが、公開キー暗号化よりも安全性が低くなります。
- 証明書不要の暗号化は、デジタル証明書が利用できない場合、または信頼できない場合に役立ちます。
- デバイスごとの専用シークレットは、ネットワーク内のデバイスにさまざまなレベルのセキュリティ要件がある場合、またはネットワーク全体のセキュリティが各デバイスのセキュリティに依存するシナリオで特に役立ちます。

認証方法の選択は、関連する要件とリスクの徹底的な分析に基づいて行う必要があります。

## 実装に関する推奨事項

TLS を実装するには、通信のセキュリティを確保するために慎重な計画と実行が必要です。TLS 実装のベスト プラクティスは次のとおりです。

- 最新バージョンの TLS を使用する: 最も安全な暗号化およびハッシュ アルゴリズムを提供する、最新バージョンの TLS を使用します。
- 強力な暗号スイートを使用する: 高レベルの暗号化とデータ整合性を提供する強力な暗号スイートを使用します。
- 信頼できる証明書を使用する: 信頼できる CA によって発行されたデジタル証明書を使用して、サーバーまたはクライアントの ID を確立します。
- 証明書失効の実装: 証明書失効メカニズムを実装して、侵害された証明書または有効期限が切れた証明書を取り消します。
- 証明書の有効期限を監視する: デジタル証明書の有効期限を監視して、期限内に更新されていることを確認します。
- 安全なキー管理: 安全なキー管理システムを実装して、認証に使用される秘密キーを管理します。
- ソフトウェアを定期的に更新してパッチを適用する: TLS の実装に使用されるソフトウェアを定期的に更新してパッチを適用し、脆弱性が確実に解決されるようにします。

## まとめ

TLS は、インターネット上で安全に通信する方法を提供します。デバイスごとに専用のシークレットを使用し、正しい認証方法を選択すると、TLS のセキュリティを強化できます。このブログで提供されている実装のベスト プラクティスに従うことで、TLS の能力を最大限に活用して、より安全な IoT プラットフォームを構築できます。

[EMQX に](https://www.emqx.io/ja)は、一方向/双方向認証、X.509 証明書、ロード バランス SSL、その他多くのセキュリティ証明書を含む TLS/SSL のサポートが組み込まれています。EMQX でサポートされるすべてのプロトコルに対して SSL/TLS を有効にし、TLS を使用するように EMQX が提供する HTTP API を構成できます。さらに詳しいガイダンスが必要な場合は、EMQX が提供するものを引き続き調べてください。

- [EMQX Enterprise の一方向認証](https://www.emqx.com/en/blog/emqx-server-ssl-tls-secure-connection-configuration-guide)
- [EMQX Enterprise の双方向認証](https://www.emqx.com/en/blog/enable-two-way-ssl-for-emqx)
- [カスタム ドメインとサードパーティ証明書を使用した EMQX クラウドの双方向認証の有効化](https://www.emqx.com/en/blog/two-way-tls-ssl-with-emqx-cloud)

EMQX の詳細については、[ドキュメント](https://www.emqx.io/docs/en/v5.0/)、[GitHub](https://github.com/emqx/emqx)、[Slack チャネル](https://slack-invite.emqx.io/)、および[フォーラム](https://www.emqx.io/forum/)を確認してください。