はじめに
産業用制御システム (ICS) まわりを勉強しようとしたとき実機を使った環境を用意するのはハードルが高いので、学習用に仮想環境が用意されていることがあります。例えば、GRFICSv2 あたりは調べればすぐ出てくると思います。
このような仮想環境上に構築できるものは大抵VirtualBox用のVMとして用意されていて、Proxmoxサーバなどに導入するにはそこから自分で少し作業する必要があったので、今回はその作業ログをまとめたいと思います。
Proxmoxサーバに構築するモチベ
- VirtualBoxは重い
- 今回のように4台同時に動かそうと思うとかなり重くなると思う
- ホストマシンのスペックに依存する
- VMのストレージやメモリがホストマシン依存
- VirtualBoxだと、ホストOSを再起動するときにVMも再起動される
- 常時起動したいような場合に向いていない
参考情報
前準備
ネットワークの全体像の理解
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つ作成する。今回は、以下のように作成する。
192.168.95.0/24
にブリッジポート (執筆者の環境では enp33s0
) を割り当てているのは、物理マシンを接続できるようにするためである。
スイッチングハブの用意
物理マシンを接続するため、以下のようにスイッチングハブを用意した。
ブリッジポートからLANケーブルをスイッチングハブの5番ポートにつなぎ、1番ポートに物理マシンを接続した。
Pre-build VMs のダウンロードとサーバへの転送
- 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ファイルをインポートする、という方法をとる。詳しくは上記参考サイトにやり方が載っている。
- VM を立てた後、コンソールの Hardware で、VMを立てた際に作成した Hard Disk を Detach して Remove する
Proxmox のターミナルで
qm
コマンドを使って、VMDKファイルをインポートする# qm importdisk [vmid] [vmdk file] local-lvm -format raw
vmid
: 立てたVMのIDvmdk file
: Proxmoxサーバに送ったVMDKファイル
コンソールの Hardware を見て追加された Unused Disk を Edit で見て、問題なければ Add する
- コンソールの Options で Boot Order に先ほど追加した Hard Disk を追加し、優先度を一番高くする
この状態で VM を起動する。
個々のVMのIPアドレス設定
前手順までで、VMをProxmoxサーバ上に構築することはできた。ここでは、VMのIPアドレスの設定を行う。
公式サイトでは VirtualBox の Host-Only Adapter の DHCP サーバを有効化してIPアドレスを割り当てているが、ここでは各仮想マシンに手動でIPアドレスを割り当てる方法を採用する。
IPアドレスの設定方法 (pfsense, Workstation 以外)
pfsense, Workstation 以外のVM (Simulation, HMI, PLC) については、以下の手順でIPアドレスを設定する。
- Link を Up にする
/etc/network/interfaces
に記載- 再起動
Link を Up にする方法
# 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については、以下のように設定する。
- VMを作るときに、
192.168.90.0/24
のネットワークを先に追加する。その後の設定で192.168.95.0/24
のネットワークを追加する。 - 以下のように初期設定する
- 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上で設定する。
テンプレート化
Proxmox のテンプレートにすることで、導入しなおそうとしたときにわざわざVMDKから読み込んだりネットワークの設定をしたりするといったことが必要なくなる。
テンプレートから仮想マシンを作成
テンプレートからクローンすることで、テンプレート化したところまでの設定を引き継いだ仮想マシンを作成できる。
動作確認
起動
シミュレーション環境を立ち上げる。
$ 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
にアクセス。
まとめ
Proxmox 上に模擬環境 GRFICSv2 を構築しました。暇なときに遊びたいと思います。