MCプロトコルの通信をセキュアにできるのか？

## はじめに
三菱電機製のPLCとMCプロトコルを使用した通信は、本来ローカルネットワーク内で完結することが前提とされています。しかし、「見える化」やクラウドとの連携需要が高まり、インターネットを経由した遠隔地からの監視・操作のニーズも一般化しています。

既存のMCプロトコルをインターネット経由で使用することは技術的には可能ですが、MCプロトコルは通信内容が暗号化されておらず平文で送信されるため、第三者に傍受・改ざんされるリスクがあり、極めて危険です。

この記事では、MCプロトコルの使用を前提とした構成でセキュアにPLCと接続する方向性で調査した内容を紹介します。

:::note alert
本記事で紹介する内容は、すべてのセキュリティリスクを排除できるわけではありません。

:::

## セキュリティリスク
MCプロトコルをインターネット経由で使用する際の主なセキュリティリスクは以下の通りです。
- 通信電文が平文のため、通信内容が第三者に傍受される可能性がある
- 通信電文が平文のため、通信内容が改ざんされる可能性がある
- PLCのデバイスが不正に読み書きされるリスクがある
- PLCの脆弱性を悪用した攻撃の対象となる可能性がある[^0]

[^0]:https://www.mitsubishielectric.co.jp/psirt/vulnerability/pdf/2021-019.pdf

## MCプロトコルの通信は本当に平文なのか
下記は、MCプロトコルでリモートパスワードを解除した際のパケットをWiresharkでキャプチャした内容です。
![スクリーンショット_20250519_232130.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4041526/b3fd4b89-b4d5-4b07-9132-726548cf9fe5.png)

右下の赤枠の箇所がBinary、Ascii各々のパケットです。
パケットの説明は割愛しますが、Binary表記の下６桁、Ascii表記の下４桁がパスワードです。

- Binary表記（下６桁）
```
313233
```
- Ascii表記（下4桁）
```
a123
```
Asciiコード **313233** は **a123** を意味しており、これはそのままパスワードとして使用されていることを示しています。

## 対策方法の検討
三菱電機が公開している脆弱性の「軽減策・対策」には、下記記載があります。

> ・当該製品をインターネットに接続する場合には、ファイアウォールや仮想プライベートネットワーク(VPN)等を使用し、不正アクセスを防止してください。

対策として最も一般的に挙げられるのはVPN接続ですが、以下のような課題も存在します。
- VPN接続は、通常、すべての通信をVPN経由にする「フルトンネル」構成となるため、遠隔地のPCの全通信がPLC側ネットワークへ流れ、トラフィックが増大する可能性がある
- 1台のPCで複数の遠隔PLCに接続する場合、VPNの接続先を都度切り替える必要がある

> ・当該製品を LAN 内で使用し、信頼できないネットワークやホストからのアクセスをファイアウォールでブロックしてください。
> ・リモートパスワード機能または IP フィルタ機能※9 を使用し、信頼できないホストからのアクセスをブロックしてください

通信が平文である以上、たとえリモートパスワード機能やIPフィルタを設定していても、通信内容の傍受によってパスワードが漏洩したり、IPなりすましによる回避が行われるリスクが残ります。


上記のようなリスクや制限を踏まえ、MCプロトコル通信をセキュアに行うために、以下の方法を検討しました。

- VPNを使用してスプリットトンネルを設定する[^1]
- 専用のセキュリティゲートウェイを使用する[^2]
- MCプロトコルをTLSに対応する
- MCプロトコルを相互TLS（mTLS）に対応する 

[^1]:https://www.startpassion.life/entry/2022/02/13/205336
[^2]:https://www.mgco.jp/products/remote/remote34.html

本記事では、**MCプロトコルを相互TLS（mTLS）に対応** について紹介します。

## MCプロトコルを相互TLS（mTLS）に対応
TLSとmTLSの詳細につきましては、Cloudflareのページに図解で紹介されていますのでそちらを参考にしました。

### TLSとは？
> Transport Layer Security（TLS）はインターネット上で広く使用されている暗号化プロトコルです。TLSは、以前はSSLと呼ばれていましたが、クライアント-サーバー間接続において、サーバーの認証およびクライアントとサーバー間の通信の暗号化を行い、部外者が通信を盗み見できないようにします。[^3]

### mTLS（相互TLS）とは？
> 相互TLS認証（略してmTLS）は、相互認証方式です。 mTLSは、ネットワーク接続の両端にいる当事者がお互いに正しい秘密鍵を持っていることを確認することで、彼らが主張する人物であることを保証します。各自のTLS証明書内の情報に従って、追加の検証が行われます。
mTLSは、Zero Trustセキュリティフレームワーク*で組織内のユーザー、デバイス、サーバーを確認するために良く使用されます。また、APIのセキュリティの維持にも役立ちます。
*ゼロトラストとは、ユーザー、デバイス、ネットワークトラフィックをデフォルトで一切信頼しないことを意味し、多くのセキュリティ上の脆弱性を排除するのに役立つアプローチです。[^4]

### なぜmTLS（相互TLS）なのか
**TLS** は、Web サーバーなどで不特定多数のユーザーに対して安全な通信を提供するのに適しています。このとき、証明書の検証はクライアント側のみで行われ、サーバーの正当性や、サーバーから取得したデータが改ざんされていないことが保証されます。

一方、**mTLS** では、信頼されたクライアントのみが接続可能であることを前提としています。証明書の検証をサーバー・クライアント双方で行うことで、認証済みのクライアントのみがアクセスでき、通信の両方向において改ざんがないことが保証されます。

このように、事前に認証されたクライアントのみアクセスを許可したい場合には、mTLS が有効な選択肢となります。

[^3]:https://www.cloudflare.com/ja-jp/learning/ssl/transport-layer-security-tls/
[^4]:https://www.cloudflare.com/ja-jp/learning/access-management/what-is-mutual-tls/

### 構成
#### ネットワーク
- サーバー仕様
  - Proxyサーバー構築
  - クライアント用ポート（10001）へのアクセスは、TLSかつTCPのみを許可
  - クライアント用ポート（10001）で受信したパケットをそのままPLCへ転送[^5]
  - PLC用ポート（10000）で受信したパケットをそのままクライアントへ転送[^6]
- クライアント仕様
  - McpXをmTLS対応

![TLS.drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4041526/8ca38f4d-2545-4f35-b4fc-c0d0b71b1d30.png)

[^5]:クライアントとサーバーを結ぶ実線（TLS暗号）
[^6]:サーバーとPLCを結ぶ点線（平文）

#### 使用ソフト
- Nginx
- OpenSSL
- Docker、DockerCompose
- [McpX](https://github.com/YudaiKitamura/McpX)

:::note info
mTLS構成を導入しても、ProxyサーバーからPLCへの通信は平文のままであるため、サーバーとPLC間の通信経路に対しては引き続き物理的・ネットワーク的な保護が必要です。
:::

## まとめ
この記事では、三菱電機が公開している「VPNやファイアウォールの活用」といった基本対策に加えて、実際にMCプロトコルが平文でパスワードを送信している実例を示し、リスクの具体性をもとに対策方法、MCプロトコル通信をmTLSに対応する場合の構成を紹介しました。

次回は、実際にMCプロトコルをmTLSに対応させる手順と実装方法を紹介します。