セキュリティトレーニング「ZANSIN」サーバの構築

## ZANSINとは

ZANSINとは、実際のサイバー攻撃を想定したインシデント・レスポンスを体験するためのトレーニングツールとして公開されたツールです。

ZANSINはコントロールサーバとトレーニングサーバの2台のサーバから構成されます。

![00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3793767/da3eb10c-873b-4f93-d59f-7b45fcfce70d.png)


- コントロールサーバ
攻撃の実施やクローリング、スコアの算出といった訓練の制御を行う。
 
- トレーニングサーバ
訓練を受ける側が操作して防御を実践する訓練用マシン。

### 構築
ZANSINサーバはUbuntu Serverで構築します。
Ubuntu Serverは20.04以上が必要とされており、22.04まではインストールが正常な確認されています。
それ以降ではインストール時にエラーが出ることもあるようです。
可能であれば20.04～22.04で構築しましょう。

また、繰り返しトレーニングを可能にするため、仮想環境で構築することがお勧めです。

#### Ubuntuのインストール
まずはUbuntuのインストールを行います。
インストールする際に必要となる条件は以下のとおり。

* コントロールサーバとトレーニングサーバが互いに通信できること
* 2台ともインターネットにアクセス可能であること
* 2台ともsudo可能な”zansin”ユーザが作成されていること
* zansinユーザのパスワードは2台で共通であること
* 2台ともパスワード認証可能なSSHサーバが導入されていること

１つ目と2つ目の要件を満たすネットワーク環境を整備します。
コントロールサーバとトレーニングサーバで通信できるように環境を構築しますが、
このネットワーク環境からインターネットに出られる場合はこのネットワークのみで大丈夫です。
インターネット接続ネットワークを別にしたい場合は、これとは別のネットワーク環境を構築します。

ネットワーク環境の準備ができたら早速Ubuntuのインストールを行います。

<br>

インストールでの選択は基本的にデフォルトで大丈夫ですが以下のprofile setupでは要件にあった情報を入力します。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3793767/75b98b30-1e23-1685-517a-6ac731f8fba1.png)


【コントロールサーバ】
Your name：zansin
Your Server Name：ControlServer
Pick a username：zansin
Choose a password：（任意の文字列）

【トレーニングサーバ】
Your name：zansin
Your Server Name：TrainingServer
Pick a username：zansin
Choose a password：（任意の文字列）

コントロールサーバとトレーニングサーバで作成するユーザ：zansinのパスワードは同じパスワードを登録する。
<br>


以下のSSH Setupの画面ではInstall OpenSSH Serverにチェックを入れる。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3793767/829dcf71-d8b5-ec82-f252-6209b7ed4f1c.png)



以降画面に従ってUbuntu Serverをインストールします。


#### ZANSINサーバのネットワーク設定
ZANSINコントロールサーバと、トレーニングサーバはネットワークで相互に通信できることが要件としてあがっています。
なので、筆者の環境としては以下のような構成としています。


|  | コントロールサーバ | トレーニングサーバ |
|:-----------|------------:|:------------:|
| IPアドレス     | 10.10.1.102        | 10.10.1.103         |

必用に応じてUbuntsのネットワーク設定を変更します。

#### ZANSINのセットアップ
ZANSINのセットアップはコントロールサーバ側で、GitHubからセットアップ用スクリプトをダウンロードしてきて実行します。

>\# セットアップスクリプトのダウンロード
>
>~$wget https://raw.githubusercontent.com/ZANSIN-sec/ZANSIN/main/zansin.sh
>

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3793767/f36c21d4-46c1-67b4-2a45-9ec14a1c61c0.png)


ダウンローが完了したら実行します。

>\# パーミッション変更して実行
>~$chmod +x zansin.sh
>~$./zansin.sh

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3793767/bac9d01a-4b78-1941-b50d-ae7d07d0d7f6.png)
##
スクリプトを実行するとインストールが始まります。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3793767/70fce83e-0c3b-ff5a-d4b7-b97d9364a6e2.png)
インストールに必要な情報として以下を入力するよう求められます。

* コントロールサーバとなるマシンのIPアドレス
* トレーニングサーバとなるマシンのIPアドレス
* 共通のユーザ：zansinのパスワード（インストール時に設定したパスワード）

後は自動でコントロールサーバとトレーニングサーバの構築が行われます。
完了したらトレーニングサーバで”mini　QUEST”が動いているか、ブラウザで確認します。
<br>
ブラウザからトレーニングサーバのアドレスを開くと以下の画面になります。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3793767/656ab4b4-36fa-7f87-5ad3-676e893429b9.png)


”Create　Account”で任意のユーザを作成した後、そのユーザでログインすると”mini Quest”を開くことができます。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3793767/3d90dcc9-542b-6205-8334-7088d273aaf8.png)

これで、zansinでトレーニングする準備ができました。

実際に以下コマンドでトレーニングを開始できます。
（test01ユーザによるトレーニング開始）
>\# 通常モードでトレーニング開始
>~$ source red-controller/red_controller_venv/bin/activate
>~$ cd red-controller/
>~$ python3 red_controller.py -n test01 -t 10.10.1.103 -c 10.10.1.102 -a 1

コマンド実行後、少しするとコントロールサーバから攻撃が始まります。
時間は4時間がリミットとなります。

システムを以下の行為から守ってください。

* サイバー攻撃
* チート行為

これらの被害をどれだけ少なく抑えるかで得点が変化します。

トレーニングマシンに**ユーザ：vender、パスワード：Passw0d!23**でログインし、防御していきましょう。
**アカウント：zansinではないでの注意してください。**

トレーニング終了時に自身のスコアが表示されます。

```bash
+----------------------------------+----------------------------------+
| Technical Point (Max 100 point)  | Operation Ratio (Max 100 %)      |
|----------------------------------+----------------------------------+
| Your Score : 70 point            | Your Operation Ratio : 60 %      |
+----------------------------------+----------------------------------+
```

# ZANSIN環境

サーバの環境は以下のとおりとなっています。
さまざまな API がDocker を使用してLinuxサーバー内に実装されています。

![IMG_0442.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3793767/28e8f397-7b9b-d49d-a0ee-f236161b53f9.png)


# Game API

ゲームに実装されている API は次のとおりです。

- User Registration API
- Login API
- Withdrawal API
- Player Data API
- Upload an Image API
- Battle Course List API
- Determination of the Battle Course API
- Battle API
- Stamina Recovery API
- Gatcha API
- In-game purshase API
- Ranking API

# ブラウザゲーム - "MINI QUEST"

オンラインゲーム（MINI QUEST)にアクセスする場合は、HTTP (ポート 80/tcp) を使用してゲームサーバーのIPアドレス（トレーニングサーバのIP）にアクセスします。

`http://{IP ADDRESS}`


![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3793767/656ab4b4-36fa-7f87-5ad3-676e893429b9.png)


## Admin Panel

ゲームサーバーの管理者として、以下URLでプレイヤーを管理することができます。

`http://{IP ADDR}/user_list/`

不正行為を行っているプレイヤーがいた場合は、「BAN!!」ボタンを使用することで、そのプレイヤーを排除することができます。

![IMG_0445.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3793767/1df8f003-84c0-3cb2-1f33-1112b475120a.png)


## ユーザーランキング

このページでは、各プレーヤーランキングを確認できます。
このページは公開されているため、誰でもアクセスできます。

`http://{IP ADDRESS}/ranking/`


![IMG_0446.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3793767/829d2bbe-0f92-02c4-9d65-4ef219b7d1bd.png)



# MINI QUEST Serverについて

- ZANSINトレーニングサーバの認証情報
 
  |アカウント名|Password|補足|
  |----|----|----|
  |vendor|Passw0rd!23|このアカウントを利用してください。’sudo'の利用も可能です。|
  |mario|Passw0rd!23||
  |link|Passw0rd!23||
  |sonic|Passw0rd!23||

- サービス
  |Service|Note|
  |----|----|
  |SSH| アカウント: `vendor`　パスワード：`Passw0rd!23`|
  |MySQL| アカウント: `root` 　パスワード `password`|
  |HTTP| MINI QUEST: http://{IP ADDRESS}<br>管理者ページ: http://{IP ADDRESS}/user_liset/<br>ユーザーランキング: http://{IP ADDRESS}/ranking/<br>phpMyAdmin: http://{IP ADDRESS}:5555|

- Game API
  - 以下フォルダに各APIが保存されています。
    - `/home/vendor/game-api`
  - ゲームAPIのコンテナーをアップ/ダウンしたい場合は、以下を参照にしてください。
    - containers開始
      - `docker-compose up -d`
    - containers停止
      - `docker-composer down`


# トレーニングにおける禁止行為

- **アクセス制御**
  - 送信元IPアドレスに基づいて ZANSINコントロールサーバーからの接続をブロックしないでください。
    - 正当なユーザーの接続と攻撃の接続はどちらも、ZANSINコントロールサーバーのIPアドレスから発信されます。これをブロックすると、ZANSINクロールモジュールとスコアリングモジュールがアクセスできなくなり、スコア評価ができなくなります。
    - 同様に、ZANSINクロール モジュールとZANSINスコアリングモジュールの両方からの通信をブロックしないように注意してください。ブロックすると、評価が正常に行えない可能性があります。
- **API**
  - APIの応答はJSONの構造を維持しています。
    - API応答の値を変更または削除することはできますが、キーの変更は行わないでください。キーの変更を行うと、ZANSINクロールモジュールが応答を取得できなくなってしまいます。