物理的に通信を片方向に制限するデータダイオードを作ってみた(その1)

この記事は、 NTT Communications Advent Calendar 2024 23 日目の記事です。

本記事では、防衛や重要インフラなどで利用されることがある、データダイオード(片方向の通信のみを許可する装置)の動作と原理を理解するために、シンプルなデータダイオードを作成します。

具体的には、メディアコンバータ等の手軽に入手できる市販のネットワーク機器を使ってデータダイオードを作成し、実際に動作することを確認します。

こんにちは!

最近、データダイオードにはまっている上田です。

普段はOT(制御システム)セキュリティ製品の検証や、NTT Comが内製開発しているOsecTの開発に関わっています。

この記事は、市販されているネットワーク機器を利用して、データダイオード(ハードウェア部分)を作れないか試してみたものになります。

あくまでも検証用として作成したものなので、実務レベルのシステムではありません(業務環境で利用したことも、利用する予定も今のところありません)。本記事の情報を参考にされる場合は、自己責任でお願いします。

なお、タイトルに「その1」とつけましたが続編は未定です。筆者のやる気が出たら出せる範囲で出します。

この記事でやること・やらないことは下記のとおりです。

  • やること
    • ハードウェアの仕組みを利用したデータダイオードの作成
    • 動作確認
  • やらないこと
    • ソフトウェアの作成
    • パフォーマンステスト
    • 電子工作

データダイオードとは?

データダイオード(Data Diode)は片方向の通信のみ許可(強制)する装置です。

一般に、ハードウェアを利用して片方向通信を強制するものをさすことが多い印象です。

このため、脆弱性や設定ミス、管理者権限の窃取などにより突破される可能性があるファイヤーウォール(FW)などと比べて、(設置方法を間違えなければ)強固なセキュリティを確保できるようです。

ちなみに、データダイオードは、Unidirectional Gatewayと呼ぶこともあるようです。

ただ、場合によってはData DiodeとUnidirectional Gatewayそれぞれ使い分けることもあるようです。

データダイオードとUnidirectional Gatewayの定義は組織によって異なることもあるようですが、アメリカ国立標準技術研究所のOTセキュリティガイドであるNIST SP 800-82r3によると、下記のように定義されていました。

data diode
A network appliance or device that allows data to travel only in one direction. Also referred to as a unidirectional gateway, deterministic one-way boundary device, or unidirectional network.1

unidirectional gateway
Unidirectional gateways are a combination of hardware and software. The hardware permits data to flow from one network to another but is physically unable to send any information at all back to the source network. The software replicates databases and emulates protocol servers and devices.2

上記の定義によると、データダイオードは片方向の通信のみを許可する機器全般のことをさし、Unidirectional Gatewayは、ハードウェアによって片方向通信を強制しつつソフトウェアによって通信相手のデバイスやサーバをエミュレートする機能などを持つ機器のことをさすようです。

実際にWeb上を検索してみると、Unidirectional Gatewayと銘打っている製品は、TCPのようにコネクション型のプロトコルをはじめ、さまざまなプロトコルに対応している製品が多い印象です。

なお、今回作成するのはUnidirectional Gatewayではなく(原始的な?)データダイオードになります。

想定される利用シーン

データダイオードが利用される分野としては、防衛や重要インフラなどの分野で使われることが多いようです。

最近の例では、アメリカのマイアミ港のクレーン管理システムを保護するために、データダイオードを導入するようです3

データダイオードの設置方法は、可用性と機密性という観点に着目すると次の2つの場合に分けることができそうです。

可用性を重視するシステムを保護したい場合

1つめの例は、制御ネットワークなど、攻撃されると大きな事故につながる可能性があるネットワークを外部の攻撃から守りたい場合です。

そもそも、他のネットワークと接続しなければ良いのかもしれません。しかし、どうしても重要度の高いネットワークの外にネットワーク経由で情報を送りたいといった需要が発生することもあります。

そのような場合に、FWよりも強固なセキュリティを確保できるデータダイオードを採用することがあるようです。

この例では、可用性を重視するネットワーク外からの攻撃をブロックしつつ、外部へデータを送信することが可能になります。

機密性を重視するシステムを保護したい場合

2つめの例は、重要なデータを保管したり分析するためのネットワークからの情報流出を阻止したい場合です。

こちらも、他のネットワークと接続しなければ良いのかもしれません。しかし、必要なデータは他のネットワークから適宜取得できるようにしたいといった需要が発生することもあります。

このような場合にもデータダイオードを採用することがあるようです。

この例では、機密性を重視するネットワーク外への情報流出をブロックしつつ、外部からのデータ受信が可能になります。

ただ、いずれの場合もただ単にデータダイオードを導入するだけで十分なセキュリティを担保できるわけではないと考えます。たとえば、データダイオードによりネットワークのデータの流れを制限したとしても、ソフトウェアアップデートのために記憶媒体などを利用してデータダイオードによって許可したデータの流れとは逆方向に、データを移動させる必要がある場面などはどうしても出てくると思います。また、保護対象のネットワークが知らないうちに他のネットワークとつながっている可能性や、既存のデータダイオードと新たに導入するデータダイオードを組み合わせると双方向通信が可能になってしまうといったことが無いかなどを確認するといったことも必要になるかと思います。そのため、データダイオードの導入が本当に有効なのかを見極めつつ、記憶媒体の検疫やネットワークの可視化・検知など複数のセキュリティ対策を組み合わせることが重要になると考えます。

データダイオードを作ってみる

前章までは、一般的なデータダイオードに関して説明しました。

この章からは、データダイオードを実際に作ってみます。ただ、あくまでも検証レベルで、実用する際に必要な機能の実装や検証は行いません。

今回は、先行事例を参考にしながら自宅のネットワーク機器を利用して作成を試みます。

メディアコンバータ3台を利用したデータダイオード

1つめの自作データダイオードの先行事例としては、Arnaud Soullié氏らによって2016年のBSides Las Vegas等で発表されたDYODE (Do Your Own Diode)があります4

DYODEはDYODE v1とDYODE v2の2つのバージョンがあるようです。v2はフォトカプラを利用しており、電子工作の必要があります。対して、v1はメディアコンバータを利用しており、手軽に作ることができそうです。

そこで、まずはDYODE v1を参考にデータダイオードを作ってみます。

つくってみる

用意したもの下記のとおりです。

  • メディアコンバータ(DN5810SG2E)3台
  • LC-LCケーブル:2本
  • Raspberry Pi 4 Model B 8GB:2台
  • その他周辺機器:電源、LANケーブル等

配線は下記のようになりました。

DYODE v1と同じように、送信側メディアコンバータINの発光(TX)ポートと、受信側メディアコンバータOUTの受光(RX)ポートを光ケーブルで接続します。

この状態では、受信側のメディアコンバータOUTはリンクアップしますが、送信側のメディアコンバータINはリンクダウンしたままになります。

そこで、送信側のメディアコンバータINの受光(RX)ポートと3台目のメディアコンバータNCの発光(TX)ポートを接続します。こうすることで、3台目のメディアコンバータNCから送信用メディアコンバータINに信号が送られ、送信側メディアコンバータINは対向機器が接続されたと判断し、リンクアップします。

下記の画像は、実際に自宅の壁に設置した際の様子です。

余談ですが、電源やスイッチ、Raspberry Pi、メディアコンバータをDINレールに固定するためのパーツや、DINレールをピクチャーレールに固定するためのパーツは、FreeCADと3Dプリンタを使って自作しました。FreeCADは最近大幅にアップデートされ、以前よりも使いやすくなっているようなので近々アップデートして使ってみたいと思っています。

動作確認

下記の送信デバイスと受信デバイスの双方から、お互いにpingコマンドを打ってみます。

下記画像は、実際にpingコマンドを実行した際のCLIの様子です。

左の上下2つのCLIが送信デバイス(pi4b-8gb-exp01)、右の上下2つのCLIが受信デバイス(pi4b-8gb-exp02)のものになります。

上部にpingコマンドの実行結果、下部にtcpdumpコマンドの実行結果が出力されています。

下部のtcpdumpコマンドの実行結果を確認すると、pingコマンドによる受信デバイスへのARP要求パケットは正常に届いていることが分かります。

対して、受信デバイスからのARP応答パケットやICMPエコー要求パケット、ARP要求パケットは送信デバイスに届いていないことを確認できます。

これにより、データダイオードとして正常に機能していることを確認できました。

パケットの流れを整理すると下記のようになります。

メディアコンバータ3台を利用したデータダイオードの動作

ちなみに、tcpdumpコマンドの出力結果に表示されているARPパケットのサイズ(length)が送信時は28なのに対して、受信時は46と増えていますが、こちらはEthernetの仕様(Ethernetフレームのデータ部分は最小46byte)を満たすためにパディングが追加された結果と思われます。

光ファイバースプリッターを利用したデータダイオード

DYODE v1は手軽に構築できるのですが、メディアコンバータを3台用意しなければならないというデメリットがあります。

そこで、このデメリットを解消する方法が無いかと、データダイオードについて調べたところ、OSDDというオープンソースプロジェクトを見つけました。

OSDDはデータダイオードの作り方が複数用意されているようです。複数ある作り方の1つに、光ファイバースプリッターを利用する方法がありました5

こちらの方式は、光ファイバースプリッターさえ用意できれば手軽にデータダイオードをつくることができそうです。そこで、今回はこちらの方法を試してみます。

つくってみる

用意したもの下記のとおりです。

  • メディアコンバータ(DN5810SG2E)2台
  • 1対2光ファイバースプリッタ―:1本
  • Raspberry Pi 4 Model B 8GB:2台
  • その他周辺機器:電源、LANケーブル等

配線は下記のようになりました。

参考文献と同じように、送信側メディアコンバータINの発光(TX)ポートと、光ファイバースプリッターを接続します。そして、2つに分岐したケーブルを各メディアコンバータの受光(RX)ポートに接続します。

こうすることで、送信側メディアコンバータINと受信側のメディアコンバータOUTの両方がリンクアップします。

下記の画像は、実際に自宅の壁に設置した際の様子です。

動作確認

下記の送信デバイスと受信デバイスの双方から、お互いにpingコマンドを打ってみます。

下記画像は、実際にpingコマンドを実行した際のCLIの様子です。

左の上下2つのCLIが送信デバイス(pi4b-8gb-exp01)、右の上下2つのCLIが受信デバイス(pi4b-8gb-exp02)のものになります。

上部にpingコマンドの実行結果、下部にtcpdumpコマンドの実行結果が出力されています。

下部のtcpdumpコマンドの実行結果を確認すると、pingコマンドによる受信デバイスへのARP要求パケットは正常に届いていることが分かります。

対して、受信デバイスからのARP応答パケットやICMPエコー要求パケット、ARP要求パケットは送信デバイスに届いていないことを確認できます。

これにより、データダイオードとして正常に機能していることを確認できました。

メディアコンバータ3台を利用した DYODE v1 との差分は、送信デバイス側で2倍のARP要求パケットが観測されている点です。これは下記動画のように、スプリッタ―を経由して送信したパケットが再度、送信デバイス側に送られてくるためです。

メディアコンバータ2台を利用したデータダイオードの動作

このため、同一のブロードキャストドメインに「メディアコンバータIN」が2台以上存在してしまった場合など、構成によってはブロードキャストストームが発生してしまいます(止まって困るようなネットワーク機器には接続しないことをおすすめします)

なおこちらもEthernetの仕様により、tcpdumpコマンドの出力結果に表示されているARPパケットのサイズ(length)が送信時は28なのに対して、受信時は46とパディング分が増えています。

おわりに

最後まで読んでくださりありがとうございました。

今回は、メディアコンバータと光ファイバースプリッタ―を利用したデータダイオード(ハードウェア部分)を作ってみました。

動作がシンプルなだけに使いどころが難しいデータダイオードですが、自宅ネットワークに導入するなどして遊べたらなと考えています。

もし機会があれば、ソフトウェアの部分まで踏み込んだ続編を(可能な範囲で)書きたいと思います。

それでは、明日のアドベントカレンダーもお楽しみに。

© NTT Communications Corporation 2014