立ち話

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

自宅インフラを育てる (6) Proxmoxサーバ上に攻撃と監視をするための環境を構築する

はじめに

これまで Proxmox サーバ上に中間者攻撃で遊ぶための環境を作ったり1、模擬制御システム(GRFICS2)を導入したり3、自宅内ネットワークを構築して遊んだり4していました。

seekt.hatenablog.com

しかし、この環境ではサイバー攻撃を試すことはできても監視する(例:IDSを導入)ことはできていませんでした。今回は、Proxmox 上に IDS を構築して攻撃を監視できるようにしたので、備忘録を残します。

この記事で書いていること

  • Proxmoxでポートミラーリングする方法の一例
    • なぜか日本語記事が見つからなかった(検索の仕方が悪い?)
  • Proxmox 上に IDS(Suricata5)の VM を構築する方法

構築する環境と要求仕様

ここでは、今回構築する環境とその要求仕様について説明します。

検証環境

ここでは、下図に示す簡易的な環境を構築します。今後、複数の Target を考えたり、複数の IDS を考えたりするケースもあるかもしれませんが、今回は簡単のため Attacker、Target、IDS はそれぞれ1台ずつと想定しています。

構築する環境の論理構成

要求仕様

今回は、ネットワーク型の IDS を導入して Internal-net を監視することを想定します。監視して異常時にアラートを発報するためには、IDS は Attacker と Target の間の(ユニキャスト)通信をキャプチャすることができる必要があります。また、今回は1つの Proxmox サーバのノード内に VM を構築して実現しようとしていますが、今後クラスタを利用してノードを増やしたときも同様に監視できる必要があります。

以上を要求仕様としてまとめます。

  1. IDS は Attacker と Target の間の(ユニキャスト)通信をキャプチャ可能
  2. 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を見つけたので、この方法を踏襲してポートミラーリングします。

www.trisul.org

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 のブリッジが作成されるため、接続されている相手にすべてのパケットが転送されるそうです(このあたりがあまり理解できておらず上手く説明できませんが...)。

この状態で、監視したい VMDHCP 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をインストールしました。

github.com

構築手順

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にしました。

docs.rapid7.com

構築手順

Zip をダウンロードすると、中に vmdk ファイルが入っているので、Proxmox サーバに送ります。

scp *.vmdk root@[IP address]:/root/

サーバに送った後、記事12を参考に新しい VM を立ててハードディスクを detach して remove します。その後、送った vmdk ファイルをインポートします。

zarat.hatenablog.com

# 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.yamlenable.confdisable.confmodify.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のパケットのシグネチャに引っかかって、アラートが発報されました。

Suricata のアラート

まとめ

今回は、Proxmox サーバ内でポートミラーリングの設定を行い、攻撃および監視を行うための環境を構築しました。ポートミラーリングの設定はほとんど記事が見つからなかったのでかなり詰まりました。現在は1台のノード内で環境を構築しましたが、負荷が大きくなっているように思います。

今後の目標は、

です。