立ち話

興味があることを書いてます。正確な内容は公式ドキュメントや参考文献を確認してください。ブログに示された意見はすべて個人の見解であり、所属する組織の公式見解ではありません。

Proxmoxサーバ上に模擬制御システム (GRFICS) を構築してみた

はじめに

産業用制御システム (ICS) まわりを勉強しようとしたとき実機を使った環境を用意するのはハードルが高いので、学習用に仮想環境が用意されていることがあります。例えば、GRFICSv2 あたりは調べればすぐ出てくると思います。

このような仮想環境上に構築できるものは大抵VirtualBox用のVMとして用意されていて、Proxmoxサーバなどに導入するにはそこから自分で少し作業する必要があったので、今回はその作業ログをまとめたいと思います。

Proxmoxサーバに構築するモチベ

  • VirtualBoxは重い
    • 今回のように4台同時に動かそうと思うとかなり重くなると思う
  • ホストマシンのスペックに依存する
    • VMのストレージやメモリがホストマシン依存
  • VirtualBoxだと、ホストOSを再起動するときにVMも再起動される
    • 常時起動したいような場合に向いていない

参考情報

前準備

ネットワークの全体像の理解

GRFICSv2 は、下図のようなシステム構成をしている。

GRFICSv2のシステム構成

5つのVMから構成されており、DMZのサブネット (192.168.90.0/24) とICSのサブネット (192.168.95.0/24) を持ち、pfsense がルーティング機能とファイアウォール機能を担っている。

VM IPアドレス
Simulation VM 192.168.95.10-15
HMI VM 192.168.90.5
pfsense VM 192.168.90.100
192.168.95.1
PLC VM 192.168.95.2
Workstation VM 192.168.95.5

今回構築するシステム構成

今回は、Proxmoxサーバと物理マシンを用いて以下のように構築することにした。

今回構築したもの

GRFICSv2のVM以外は、次のような機器から構成される。

機器 IPアドレス 用途
Kali (VM) 192.168.90.99 攻撃実験用
Ubuntu (VM) 192.168.90.125 HMIへのアクセス用
Ubuntu (物理マシン) 192.168.95.125 シミュレータの表示用

今回物理マシンをICSのサブネットに接続することにしたのは、仮想マシンでシミュレータにアクセスしようとしたが、重くてGUIが表示されなかったため。

ブリッジネットワークの作成

上記構成を踏まえて、ブリッジネットワークを2つ作成する。今回は、以下のように作成する。

DMZのサブネット

ICSのサブネット

192.168.95.0/24ブリッジポート (執筆者の環境では enp33s0) を割り当てているのは、物理マシンを接続できるようにするためである。

スイッチングハブの用意

物理マシンを接続するため、以下のようにスイッチングハブを用意した。

用意したスイッチングハブ (上側)

ブリッジポートからLANケーブルをスイッチングハブの5番ポートにつなぎ、1番ポートに物理マシンを接続した。

Pre-build VMs のダウンロードとサーバへの転送

GRFICSv2VM 5つをダウンロードする。

  • Simulation VM (ChemicalPlant.ova)
  • HMI VM (ScadaBR.ova)
  • pfsense VM (pfSense.ova)
  • PLC VM (plc_2.ova)
  • Workstation (workstation.ova)

ダウンロードしたOVAファイルを解凍し、VMDKファイルを得る。例えば、Lhaplusなどを使うと解凍できる。または、WSLなどのターミナル上で tar コマンドを実行。

tar xvf [filename].ova

このVMDKファイルを scp などを使って Proxmox サーバに送信する。

環境構築

VMDKのインポート

参考proxmoxにvirtualboxのマシンをインポートする

一度VMを立てて qm を用いて既存のVMDKファイルをインポートする、という方法をとる。詳しくは上記参考サイトにやり方が載っている。

  1. VM を立てた後、コンソールの Hardware で、VMを立てた際に作成した Hard Disk を Detach して Remove する
  2. Proxmox のターミナルで qm コマンドを使って、VMDKファイルをインポートする

     # qm importdisk [vmid] [vmdk file] local-lvm -format raw
    
    • vmid: 立てたVMのID
    • vmdk file: Proxmoxサーバに送ったVMDKファイル
  3. コンソールの Hardware を見て追加された Unused Disk を Edit で見て、問題なければ Add する

  4. コンソールの Options で Boot Order に先ほど追加した Hard Disk を追加し、優先度を一番高くする

この状態で VM を起動する。

個々のVMIPアドレス設定

前手順までで、VMをProxmoxサーバ上に構築することはできた。ここでは、VMIPアドレスの設定を行う。

公式サイトでは VirtualBox の Host-Only Adapter の DHCP サーバを有効化してIPアドレスを割り当てているが、ここでは各仮想マシンに手動でIPアドレスを割り当てる方法を採用する。

IPアドレスの設定方法 (pfsense, Workstation 以外)

pfsense, Workstation 以外のVM (Simulation, HMI, PLC) については、以下の手順でIPアドレスを設定する。

  1. Link を Up にする
  2. /etc/network/interfaces に記載
  3. 再起動
# ip link set [interface] up

ただし、interface は、自分の環境のインタフェース (例:ens18)。

/etc/network/interfaces への記載
# cp /etc/network/interfaces /etc/network/interfaces.bk
# vi /etc/network/interfaces

/etc/network/interfaces に記載されている設定を、インタフェースが適切になるように書き換える。例えば、執筆者の環境の場合、Simulation VM の設定は以下。

auto ens18:0
iface ens18:0 inet static
address 192.168.95.10
netmask 255.255.255.0
gateway 192.168.95.1

auto ens18:1
iface ens18:1 inet static
address 192.168.95.11
netmask 255.255.255.0

auto ens18:2
iface ens18:2 inet static
address 192.168.95.12
netmask 255.255.255.0

auto ens18:3
iface ens18:3 inet static
address 192.168.95.13
netmask 255.255.255.0

auto ens18:4
iface ens18:4 inet static
address 192.168.95.14
netmask 255.255.255.0

auto ens18:5
iface ens18:5 inet static
address 192.168.95.15
netmask 255.255.255.0

IPアドレスの設定 (pfsense)

参考Fortiphyd ICS Security Training - GRFICS Setup

pfsenseについては、以下のように設定する。

  1. VMを作るときに、192.168.90.0/24 のネットワークを先に追加する。その後の設定で 192.168.95.0/24 のネットワークを追加する。
  2. 以下のように初期設定する
    • Should VLANS be set up now [y|n]? → n
    • Enter the WAN interface name of 'a' for auto-detection → vtnet0
    • Enter the LAN interface name or 'a' for auto-detection → vtnet1
    • Do you want to proceed [y|n]? → y

IPアドレスの設定 (Workstation)

GUI上で設定する。

WorkstationでのIPアドレスの設定

テンプレート化

Proxmox のテンプレートにすることで、導入しなおそうとしたときにわざわざVMDKから読み込んだりネットワークの設定をしたりするといったことが必要なくなる。

テンプレート化したもの

テンプレートから仮想マシンを作成

テンプレートからクローンすることで、テンプレート化したところまでの設定を引き継いだ仮想マシンを作成できる。

動作確認

起動

シミュレーション環境を立ち上げる。

  1. Workstation以外のVMの電源を付ける
  2. Simulation VM のターミナルに入り、以下コマンドを実行
$ cd ~/GRFICSv2/simulation_vm/simulation/remote_io/modbus
$ sudo bash run_all.sh

シミュレータの確認

Ubuntu (物理マシン) で、http://192.168.95.10 にアクセス。

シミュレータ

Scadaの確認

Ubuntu (VM) で、http://192.168.90.5:8080/ScadaBR にアクセス。

ScadaBR

まとめ

Proxmox 上に模擬環境 GRFICSv2 を構築しました。暇なときに遊びたいと思います。