はじめに
これまで Proxmox サーバ上に中間者攻撃で遊ぶための環境を作ったり1、模擬制御システム(GRFICS2)を導入したり3、自宅内ネットワークを構築して遊んだり4していました。
しかし、この環境ではサイバー攻撃を試すことはできても監視する(例:IDSを導入)ことはできていませんでした。今回は、Proxmox 上に IDS を構築して攻撃を監視できるようにしたので、備忘録を残します。
この記事で書いていること
構築する環境と要求仕様
ここでは、今回構築する環境とその要求仕様について説明します。
検証環境
ここでは、下図に示す簡易的な環境を構築します。今後、複数の Target を考えたり、複数の IDS を考えたりするケースもあるかもしれませんが、今回は簡単のため Attacker、Target、IDS はそれぞれ1台ずつと想定しています。
要求仕様
今回は、ネットワーク型の IDS を導入して Internal-net を監視することを想定します。監視して異常時にアラートを発報するためには、IDS は Attacker と Target の間の(ユニキャスト)通信をキャプチャすることができる必要があります。また、今回は1つの Proxmox サーバのノード内に VM を構築して実現しようとしていますが、今後クラスタを利用してノードを増やしたときも同様に監視できる必要があります。
以上を要求仕様としてまとめます。
- IDS は Attacker と Target の間の(ユニキャスト)通信をキャプチャ可能
- Proxmox のノードが増えても監視可能
実現方法
要求仕様 1、2 を実現するために、以下の (1)、(2) を実施します。なお、この方法はあくまで執筆者が思いついたものなので、より良い方法がある可能性があります。
要求仕様1を実現する方法が(1)、2を実現する方法が(2)です。(2)、(1)の順に説明します。
ブリッジポートの指定とネットワーク構成の変更
Proxmox 上でブリッジネットワークを作成してブリッジポート(物理ポート)を指定すると、ブリッジネットワークに流れる通信をブリッジポートに流すことができたり、ブリッジポートが受け取った通信をブリッジネットワークでも受け取ることができます(書き方が間違っていたらごめんなさい)。過去記事でも同様のことをしています。下図のように設定すると、vmbr1 に流れる通信が enx... のポートに流れます。
この状態でネットワーク構成を変更します。下図はネットワーク構成後の構成図です。vmbr0 は物理NIC 1がブリッジになっていて、vmbr1 は物理NIC 2がブリッジになっています。物理NIC 1の先のスイッチはルーターとつながっていて、物理NIC 2(enx...)の先のスイッチは Internal-net 用で外部と接続していません。
Proxmox でのポートミラーリング
VMware vSphere6 の分散仮想スイッチにはポートミラーリング機能があります7。ポートミラーリング機能を使うと、ある分散仮想スイッチに接続しているVM間で発生した通信を別の分散仮想スイッチに接続したVMに流すことができます。vSphere 上に構築した VM で実施した攻撃を監視するためには、ポートミラーリングを使って IDS の VM に通信を流せばよいわけです。
Proxmox は vSphere の分散仮想スイッチのようなものがない(調べたり使ったりした限りでは)ですが、vSphere と同様にポートミラーリングによって Attacker と Target の間の通信を IDS が受け取れるようにできれば、IDS で監視可能になります。
Proxmox サーバでポートミラーリングする方法について書いてくれていた記事8を見つけたので、この方法を踏襲してポートミラーリングします。
vmbr1 に接続した Attacker と Target の間の通信(パケット)を、物理NIC 2(enx...)に接続したすべてのアセットで受け取れるようにすれば良いというアイデアで実現します。
設定方法
Proxmox サーバのシェルに入って、/etc/network/interfaces
を以下のように設定してネットワーク(またはサーバ本体)を再起動します。
auto vmbr1 iface vmbr1 inet manual bridge_ports [port] bridge_stp off bridge_fd 0 bridge_ageing 0
これによって、bridge_ageing
が 0 のブリッジが作成されるため、接続されている相手にすべてのパケットが転送されるそうです(このあたりがあまり理解できておらず上手く説明できませんが...)。
この状態で、監視したい VM で DHCP off で IPアドレスを割り当てないようにすると、そのVMにパケットが転送されるはずです。
動作確認
Attacker(192.168.50.99)から Target(192.168.50.5)に ping を飛ばして、それを IDS の VM でキャプチャできるか確かめました。IDS の ens19 が vmbr1 に接続していて、IPアドレスは割り当てていません。
確かに Attacker と Target と間の通信をキャプチャできていることが確認できました。
環境構築
ここでは、Attacker、Target、IDS の構築についてまとめます。
Attacker の構築
レッドチーム関連の書籍9を参考に、Ubuntu22 上に TrustedSec の PTF(The PenTesters Framework)10をインストールしました。
構築手順
PTF のダウンロードとプロンプトの表示するには以下コマンドを実行します。
$ sudo -s -E # apt-get update # git clone https://github.com/trustedsec/ptf.git /opt/ptf # cd /opt/ptf && ./ptf
例えば、エクスプロイトツールをインストールするには以下コマンドを実行します。ほかにもインストールできるツールがあるので、オプションを参照すること。
ptf > use modules/exploitation/install_update_all
インストール後は msfconsole
で Metasploit を起動できます。
Target の構築
ここでは Target は Metasploitable2 11にしました。
構築手順
Zip をダウンロードすると、中に vmdk
ファイルが入っているので、Proxmox サーバに送ります。
scp *.vmdk root@[IP address]:/root/
サーバに送った後、記事12を参考に新しい VM を立ててハードディスクを detach して remove します。その後、送った vmdk
ファイルをインポートします。
# qm importdisk [vmid] [import_disk] local-lvm -format raw
この状態では「未使用のディスク」という状態なので、追加します。追加時にはバスやデバイスをSATAにする等して調整する必要がありそうです。
IDS(Suricata)の導入
IDS は Suricata を導入することにしました。Suricata はオープンソースの IDS で、ルールも充実しています。
構築手順
依存関係のあるパッケージのインストール:
$ sudo apt-get install libpcre3 libpcre3-dbg libpcre3-dev build-essential libpcap-dev \ libnet1-dev libyaml-0-2 libyaml-dev pkg-config zlib1g zlib1g-dev \ libcap-ng-dev libcap-ng0 make libmagic-dev \ libnss3-dev libgeoip-dev liblua5.1-dev libhiredis-dev libevent-dev \ rustc cargo libjansson-dev
ダウンロードとインストール:
$ sudo -s -E # cd /opt # wget https://www.openinfosecfoundation.org/download/suricata-6.0.10.tar.gz # tar -zxvf suricata-6.0.10.tar.gz # cd suricata-6.0.10 # ./configure --prefix=/usr/ --sysconfdir=/etc --localstatedir=/var # make # make install # make install-full
設定:
/etc/default/suricata
の編集
RUN_AS_USER=[username] LISTENMODE=pcap IFACE=[interface]
/etc/suricata/suricata.yaml
の編集
Target(192.168.50.5)のみを監視対象のネットワークとします。また、pcap のログを取得するように設定しました。
HOME_NET: "[192.168.50.5]" EXTERNAL_NET: "!$HOME_NET" - pcap-log: enabled: yes pcap: - interface: [interface]
ルールの設定:
# apt install python3-pip # pip install --pre --upgrade pip # pip install --pre --upgrade pyyaml suricata-update # mkdir -p /var/lib/suricata/rules # mkdir -p /var/lib/suricata/update # touch /etc/suricata/update.yaml # touch /etc/suricata/enable.conf # touch /etc/suricata/disable.conf # touch /etc/suricata/drop.conf # touch /etc/suricata/modify.conf
suricata-update の docs 13 を参考に update.yaml
、enable.conf
、disable.conf
、modify.conf
を編集する。
suricata-update.readthedocs.io
ルールの入手:
# wget https://rules.emergingthreats.net/open/suricata/emerging.rules.tar.gz # tar -zxvf emerging.rules.tar.gz # cp -r rules /etc/suricata/rules
テスト
インストールした Suricata を起動し、アラートが出るかどうかを確認します。
シナリオ
Attacker(192.168.50.99)から Target(192.168.50.5)に ping を送ったときのアラートを見ます。
監視設定
# suricata -c /etc/suricata/suricata.yaml --pidfile /run/suricata.pid -i [interface]
で起動し、
# tail -f /var/log/suricata/fast.log
でアラートを確認します。
結果
外部ネットワークから監視対象のネットワークへのICMPのパケットのシグネチャに引っかかって、アラートが発報されました。
まとめ
今回は、Proxmox サーバ内でポートミラーリングの設定を行い、攻撃および監視を行うための環境を構築しました。ポートミラーリングの設定はほとんど記事が見つからなかったのでかなり詰まりました。現在は1台のノード内で環境を構築しましたが、負荷が大きくなっているように思います。
今後の目標は、
です。
- 自宅インフラを育てる (3) 遊ぶための環境を作って動かしてみる - 立ち話↩
- GitHub - Fortiphyd/GRFICSv2: Version 2 of the Graphical Realism Framework for Industrial Control Simulation (GRFICS)↩
- Proxmoxサーバ上に模擬制御システム (GRFICS) を構築してみた - 立ち話↩
- 自宅インフラを育てる (4) Proxmox サーバを利用した自宅内部ネットワークの構築 - 立ち話↩
- Home - Suricata↩
- VMware vSphere | エンタープライズ ワークロード対応プラットフォーム | JP↩
- ポート ミラーリング セッションの詳細、ソース、およびターゲットの編集↩
- Configuring a Port Mirror on Proxmox VE for Trisul NSM [Trisul Network Analytics Developer Zone ]↩
- サイバーセキュリティ レッドチーム実践ガイド | マイナビブックス↩
- GitHub - trustedsec/ptf: The Penetration Testers Framework (PTF) is a way for modular support for up-to-date tools.↩
- Metasploitable 2 | Metasploit Documentation↩
- proxmoxにvirtualboxのマシンをインポートする - 4ensiX↩
- suricata-update - Update — suricata-update 1.3.0 documentation↩