やること。
ハードニング競技会に向けて、チーム内で演習をするため、ZANSINをクラウド上に構築していく。
自分のクラウド構築能力の向上も目指してやっていく。
【ZANSINとは?】
【スクリプトのエラーなど、ローカルでの構築の記事はこちら】
想定する物
【各サーバの詳細】
| サーバ名 | 役割 | 詳細 |
|---|---|---|
| VPNサーバ | 演習環境に接続する踏み台サーバ | OpenVPN |
| トレーニングサーバ | 実際にプレイするところ。攻撃を受ける | ー |
| コントロールサーバ | 攻撃をする。採点をする | ー |
構築していく
スイッチの追加
今回は3つのサーバを束ねるためのスイッチを用意する。
1️⃣ ネットワーク>スイッチ を選択して、追加を押す

サーバの追加方法(共通)
※画像はVPNサーバを例。
1️⃣ さくらのクラウドにログインしてプロジェクトの画面にて、右上の「追加」をクリック

3️⃣ ディスクの項目では基本的に初期設定のまま、OSの選択とディスクサイズの選択を行う

4️⃣ NICの項目では、何に接続するかを選択する。
※NICの追加は作成後に行える

5️⃣ ディスクの修正の項目では、軽く初期設定をできる。ホスト名やパスワード、公開鍵の追加などを行う。
公開鍵の登録とパスワードログインの拒否の設定は入れたほうが良い。
※OSによっては対応していない物もある。

6️⃣ その他の項目は任意。
VPNサーバ
構成内容
- CPU:2コア
- メモリ:4G
- ディスク:20G
- NIC:2枚(インターネット接続用及びローカルスイッチ接続用)
- OS:Ubuntu Server 26.04 LTS
- VPN:OpenVPN
NICの追加
VPNをサーバについては、「インターネット接続用」と「ZANSIN環境(スイッチ)への接続用」の2つのNICが必要になる。
サーバを作成後にシャットダウンした状態で以下の操作を行う。
2️⃣ NIC画面で「追加」をクリック
※すでに作成されているものはインターネット接続用

3️⃣ 作成されたNICの右端の三角を押して接続の編集に入る

VPNの設定
さくらのクラウドでは初期のユーザ名はubuntuになっている。
任意の方法でSSH等で接続して作業を行う。
openvpnの設定
1️⃣ インストール
sudo apt install openvpn easy-rsa -y
2️⃣ PKI(証明書基盤)の準備
make-cadir ~/easy-rsa
cd ~/easy-rsa
./easyrsa init-pki
以下の作業は
~/easy-rsaディレクトリ配下で行うことを想定
3️⃣ CA(認証局)の作成
./easyrsa build-ca nopass
Common Name(組織名など)を聞かれるので、わかりやすい名前を入力します。
4️⃣ サーバ証明書の作成
./easyrsa gen-req server nopass
./easyrsa sign-req server server
- Common Nameを聞かれるので今回はデフォルト(server)で良いので、何も入力せずにEnter
- 次はyes
5️⃣ Diffie-Hellman鍵とHMAC署名鍵
./easyrsa gen-dh
openvpn --genkey secret ta.key
6️⃣ サーバ用ファイルの配置
sudo mkdir -p /etc/openvpn/server
sudo cp pki/ca.crt pki/issued/server.crt pki/private/server.key pki/dh.pem ta.key /etc/openvpn/server/
7️⃣ server.confの作成
sudo vi /etc/openvpn/server/server.conf
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh.pem
tls-auth ta.key 0
topology subnet
server 10.0.10.0 255.255.255.0
# ZANSIN内部ネットワーク(スイッチ側)への経路をクライアントに知らせる
push "route 10.0.0.0 255.255.255.0"
# クライアント間の直接通信は許可しない(演習環境のため、デフォルトのまま=無効)
keepalive 10 120
cipher AES-256-GCM
auth SHA256
persist-key
persist-tun
status /var/log/openvpn-status.log
log-append /var/log/openvpn.log
verb 3
user nobody
group nogroup
8️⃣ 起動
sudo systemctl enable openvpn-server@server
sudo systemctl start openvpn-server@server
sudo systemctl status openvpn-server@server
active(running)になっていればOK
クライアント用の接続用ファイル(.opvn)の作成
1️⃣から3️⃣は
~/easy-rsa配下で以下の作業を行います
1️⃣ クライアント証明書の発行
クライアントごとにユニークな名前で作成します。
./easyrsa gen-req client1 nopass
./easyrsa sign-req client client1
sign-req実行時にyes確認が求められます
複数人いる場合は以下が便利(10人の場合)
for i in $(seq 1 10); do
./easyrsa --batch gen-req client$i nopass
./easyrsa --batch sign-req client client$i
done
2️⃣ クライアント用のテンプレートの作成
mkdir -p ~/client-configs/files
vi ~/client-configs/base.conf
client
dev tun
proto udp
remote <VPNサーバのグローバルIP> 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-GCM
auth SHA256
verb 3
key-direction 1
3️⃣ 証明書と鍵をまとめるスクリプトの作成
OpenVPNクライアントは、証明書・鍵をすべて1つの.ovpnファイルに埋め込む形式が扱いやすいです。以下のスクリプトを使います。
vi ~/client-configs/make_config.sh
#!/bin/bash
KEY_DIR=~/easy-rsa/pki
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/client-configs/base.conf
cat ${BASE_CONFIG} \
<(echo -e '<ca>') \
${KEY_DIR}/ca.crt \
<(echo -e '</ca>\n<cert>') \
${KEY_DIR}/issued/${1}.crt \
<(echo -e '</cert>\n<key>') \
${KEY_DIR}/private/${1}.key \
<(echo -e '</key>\n<tls-auth>') \
~/easy-rsa/ta.key \
<(echo -e '</tls-auth>') \
> ${OUTPUT_DIR}/${1}.ovpn
4️⃣ ovpnファイルの作成
~/client-configsで作業を行います
./make_config.sh client1
複数人の場合は
for i in $(seq 1 10); do
./make_config.sh client$i
done
5️⃣ VPN参加者とZANSIN内部が通信できるように設定
sudo iptables -A FORWARD -i tun0 -o eth1 -j ACCEPT
sudo iptables -A FORWARD -i eth1 -o tun0 -m state --state ESTABLISHED,RELATED -j ACCEPT
これにてOpenVPNの構築は完了
NAT設定
改めて、今回は以下の構成にするのだが、ZANSINの構築にはインターネットの接続が必要。

そのために、VPNサーバ(ubuntu)にNAT設定を入れていく。
0️⃣ 内部ネットワーク側のIPアドレスの設定
以下の記事を参考に、今回は10.0.0.1/24に設定していく
1️⃣ IPフォワーディング設定
eth0 = インターネット側
eth1 = ローカルネットワーク側
sudo vi /etc/sysctl.conf
net.ipv4.ip_forward=1
確認しておく
sudo sysctl -p
先程のファイル内容が出力されればOK
2️⃣ ZANSIN内部(eth1側)→インターネット通信のNAT設定
sudo iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE
3️⃣ ZANSIN内部(eth1)⇔ インターネット(eth0)のフォワーディング許可
sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
4️⃣ 確認
以下のコマンドで5つの設定が出てこればOK
sudo iptables -t nat -L POSTROUTING -v -n
sudo iptables -L FORWARD -v -n
Chain POSTROUTING
target prot opt in out source destination
MASQUERADE all -- * eth0 10.0.0.0/24 0.0.0.0/0
Chain FORWARD
target prot opt in out source destination
ACCEPT all -- tun0 eth1 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- eth1 tun0 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT all -- eth1 eth0 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- eth0 eth1 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
6️⃣ 永続化
sudo apt install iptables-persistent -y
sudo netfilter-persistent save
これにて、NAT設定も完了。
ZANSIN構築後はこの設定は消しておいたほうが良いと思う。
ZANSIN トレーニングサーバ
構成内容
- CPU:2コア
- メモリ:4G
- ディスク:20G
- NIC:1枚(スイッチに接続)
- OS:Ubuntu Server 22.04.5 LTS
基本的に以下の記事に則って進めていく
新規サーバ作成時の注意点
ZANSINの構築準備
1️⃣ 事前準備としてZANSINユーザを作成する
sudo useradd zansin
sudo usermod -aG sudo zansin
echo "zansin:YOUR_PASSWORD" | sudo chpasswd
sudo mkdir -p /home/zansin
sudo chown zansin:zansin /home/zansin
ZANSIN コントロールサーバ
構成内容
- CPU:2コア
- メモリ:4G
- ディスク:20G
- NIC:1枚(スイッチに接続)
- OS:Ubuntu Server 22.04.5 LTS
こちらも基本的に以下の記事に則って進めていく
新規サーバ作成時の注意点
ZANSINの構築
1️⃣ 事前準備としてZANSINユーザを作成する
sudo useradd zansin
sudo usermod -aG sudo zansin
echo "zansin:YOUR_PASSWORD" | sudo chpasswd
sudo mkdir -p /home/zansin
sudo chown zansin:zansin /home/zansin
2️⃣ スクリプトの実行
作成したzansinユーザでログインを実施
zansinユーザはホームディレクトリが無いので、私は/tmpで実行した。
wget https://raw.githubusercontent.com/ZANSIN-sec/ZANSIN/main/zansin.sh
chmod +x zansin.sh
./zansin.sh
4回入力を求められる。
- zansinのパスワード
- トレーニングサーバのIPアドレス
- コントロールサーバのIPアドレス
- zansinのパスワード
このまま実行してエラーが出る場合は、先程貼り付けた記事に沿って修正して実行する。
ZANSIN構築後のバックアップ
ZANSINをプレイすると、トレーニングサーバは攻撃された状態になり、再利用できない。
そのため、構築後の状態でバックサップを作成して復元できるようにする
今回はさくらのクラウドのアーカイブ機能を使用する
1️⃣ ダッシュボードから、ストレージ>アーカイブを選択し、作成をクリック

コントロールサーバも同様に行う
構築したもの
【構成図】

【トポロジ】
ネットワーク>スイッチ>トポロジ で見れる
きれいに並べるのが難しすぎる。。。
最後に
これから、チーム内で演習してみる








