徳丸本の実習環境を全部 Docker 化してみた

## 概要

「体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 脆弱性が生まれる原理と対策の実践」(徳丸本)の実習環境を OWASP ZAP まで含めて全て Docker で動かします。

ホストに Java などをインストールする必要が無くなります。(必要なのは Firefox と Docker のみ)

OWASP ZAP の設定変更も Docker の構成ファイルに含めているので、手動で OWASP ZAP の設定を変更する必要が無くなります。

::: note
本稿の手順を完了すると、以下の3ステップで実習環境が起動します。

1. `docker compose up -d` を実行する。(数秒)
2. ブラウザ(Firefox 以外でもよい)で `http://localhost:8080/zap` を表示する。(10秒程度)
3. Firefoxで `http://example.jp/` を表示する。(すぐ)
:::

動作確認は WSL + Ubuntu 環境で実施しています。
Ubuntu 無しの WSL オンリー環境や M1/M2 Mac 環境でも同様に実行できるはずです。

編集・追加するファイルは以下の3つです。

```
$ tree -a
(省略)
├── docker-compose.yml # 編集する
(省略)
└── zap
    ├── Dockerfile # 追加する
    └── homedir
        └── .ZAP
            └── config.xml # 追加する
```

:::note
[OWASP ZAP のコンテナイメージ](https://hub.docker.com/r/owasp/zap2docker-stable/tags) は 2.12.0 から amd64 と arm64 の両方で用意されています。
:::

:::note
本稿では徳丸本2-4にある「hosts ファイルの編集」を行ないません。
「hosts ファイルの編集」を行なわないので、徳丸本2-4の最後のページで実施する `ping example.jp` などの疎通確認は失敗します。

本稿の手順を最後まで実施すると、最終的に Firefox で `http://example.jp/` の表示ができるようになります。
:::

:::note
VirtualBox 環境との併用は考慮していませんので、この手順を実施する時は VirtualBox 側をシャットダウンしておくと良いでしょう。

同様に既存の wasbook-docker 環境とも併用はできません。既存の wasbook-docker 環境側では `docker compose down` しておきましょう。
:::

## ０： WSL と Docker Desktop をインストールする

### WSL を新規にインストールする場合

最新のWindows 10 22H2 であれば WSL のインストールは以下のコマンド1つで「ストア版」の WSL がインストールされ、Ubuntu ディストリビューションの導入まで完了するはずです。

```
PS C:\Users\tadashi> wsl --install
```

`wsl -l -v` で Ubuntu ディストリビューションが VERSION 2 で、既定になっている(`*` が表示されている)ことを確認しましょう。

```
PS C:\Users\tadashi> wsl -l -v
  NAME                    STATE           VERSION
* Ubuntu                  Running         2
```

### WSL が既にインストールされている場合

必須ではありませんが WSL をアップデートしておくと良いかもしれません。
`wsl --update` を実行すると「ストア版」の WSL が入ります。
どうしても「インボックス版」の WSL を使う理由がある場合以外は実行しておくのをお勧めします。

```
PS C:\Users\tadashi> wsl --update
```

こちらの場合も `wsl -l -v` でディストリビューションの状態を確認しておきましょう。

### Docker Desktop for Windows をインストールする

下記のリンクからインストーラーをダウンロードしてインストールします。

https://www.docker.com/products/docker-desktop/

## １： wasbook-docker.zip を WSL の Ubuntu 環境に展開する

http://wasbook.org/download/wasbook-docker.zip をダウンロードして wasbook-docker.zip を展開します。

```
PS C:\Users\tadashi> ubuntu
tadashi@DESKTOP-CRHC3IF:~$ mkdir work # workが無ければ作る
tadashi@DESKTOP-CRHC3IF:~$ cd work    # 以降はこのディレクトリで作業する
tadashi@DESKTOP-CRHC3IF:~/work$ cp /mnt/c/Users/tadashi/Downloads/wasbook-docker.zip ./
```

```
$ unzip wasbook-docker.zip
```

```
$ cd wasbook-docker
$ pwd # 作業するディレクトリの確認
/home/tadashi/work/wasbook-docker
```

## ２： docker-compose.yml に patch を適用する

wasbook-docker.patch を作成して docker-compose.yml に適用します。
これはファイルの編集作業に相当する操作です。

```
$ pwd # 作業するディレクトリを確認する
/home/tadashi/work/wasbook-docker

$ # vi でも nano でも VSCode でも良いので wasbook-docker.patch ファイルを作成する(以下の cat コマンドの結果を参照してください)

$ cat wasbook-docker.patch # 作成したファイルの中身を cat コマンドで確認すると以下のようになります
--- ./wasbook-docker.orig/docker-compose.yml	2022-12-29 16:00:12.000000000 +0900
+++ ./wasbook-docker/docker-compose.yml	2023-02-10 17:56:47.456526682 +0900
@@ -65,5 +65,16 @@ services:
     networks:
       internal:
 
+  zap:
+    build: zap
+    ports:
+      - 8080:8080
+      - 58888:8090
+    volumes:
+      - ./zap/homedir/.ZAP:/home/zap/.ZAP
+      - ./zap/homedir/.ZAP/config.xml:/home/zap/.ZAP/config.xml
+    networks:
+      internal:
+
 networks:
   internal:

```

```
$ pwd # 作業するディレクトリを確認する
/home/tadashi/work/wasbook-docker

$ patch docker-compose.yml <wasbook-docker.patch # 作成したパッチファイルを適用する
```

## ３： OWASP ZAP の Dockerfile を配置する

ZAP コンテナのための Dockerfile を作成して配置します。

```
$ pwd
/home/tadashi/work/wasbook-docker

$ mkdir -p zap/homedir/.ZAP # 必要なディレクトリをこの時点で全て作ってしまう

$ cd zap
$ pwd
/home/tadashi/work/wasbook-docker/zap
```

```
$ pwd # 作業するディレクトリを確認する(作成した zap ディレクトリの中)
/home/tadashi/work/wasbook-docker/zap

$ # vi でも nano でも VSCode でも良いので Dockerfile ファイルを作成する(以下の cat コマンドの結果を参照してください)

$ cat Dockerfile # 作成したファイルの中身を cat コマンドで確認すると以下のようになります
FROM owasp/zap2docker-stable:2.12.0

USER root

RUN apt-get update && apt-get install -y \
        fonts-ipafont-gothic \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

USER zap

CMD ["zap-webswing.sh"]

```

## ４： OWASP ZAP の設定が記載された `config.xml` を配置する

ここで作成する `config.xml` に OWASP ZAP コンテナの基本的な設定(徳丸本2-5と http://wasbook.org/wasbook-docker.html の内容)を Docker 環境用に少し修正してまとめてファイルにしてあります。
手作業で徳丸本2-5と http://wasbook.org/wasbook-docker.html の内容を実施する必要はありません。

```
$ cd wasbook-docker/zap/homedir/.ZAP
$ pwd # 作業するディレクトリを確認する(zap の下の homedir の下の .ZAP ディレクトリ)
/home/tadashi/work/wasbook-docker/zap/homedir/.ZAP

$ # vi でも nano でも VSCode でも良いので config.xml ファイルを作成する(以下の cat コマンドの結果を参照)

$ cat config.xml # 作成したファイルの中身を cat コマンドで確認すると以下のようになります
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<config>
    <version>20012000</version>
    <breakpoints>
        <buttonMode>2</buttonMode>
    </breakpoints>
    <network>
        <connection version="2">
            <httpProxy>
                <enabled>true</enabled>
                <host>apache</host>
                <port>3128</port>
            </httpProxy>
        </connection>
    </network>
    <hud version="4">
        <enabledForDesktop>false</enabledForDesktop>
    </hud>
    <database>
        <newsession>1</newsession>
        <newsessionprompt>false</newsessionprompt>
    </database>
    <view>
        <locale>ja_JP</locale>
        <fontName>IPAPGothic</fontName>
    </view>
</config>

```

## ５： docker compose up -d する

`docker compose up -d` で起動します。

初回なのでビルドが走ります。

```
$ cd wasbook-docker
$ pwd # 作業するディレクトリを確認する
/home/tadashi/work/wasbook-docker

$ docker compose up -d
```

少し古い環境の場合は `docker compose` ではなく `docker-compose` が必要になるケースがあります。
最新の Docker Desktop をインストールしていれば `docker compose` で大丈夫です。

## ６： Firefox に FoxyProxy をインストールして設定する

ブラウザ(Firefox 以外でもよい)で `http://localhost:13128/` を表示して FoxyProxy の設定ファイルをダウンロードします。(徳丸本2-6)

FoxyProxy を Firefox に導入して、ダウンロードした FoxyProxy の設定ファイルを読みこませます。(徳丸本2-6)

:::note
本稿では徳丸本2-4にある「hosts ファイルの編集」をしないので、この時点で `example.jp` などの名前解決はされません。
つまり、この時点でブラウザで `http://example.jp/` を表示しようとしても名前解決ができずにエラーになります。
最後まで本稿の手順を実施して下さい。
:::

## ７： OWASP ZAP を起動する

ブラウザ(Firefox 以外でもよい)で `http://localhost:8080/zap` を表示して(`/zap` を忘れない) OWASP ZAPを起動します。

この操作は実習環境を起動する `docker compose up -d` ごとに毎回必要となります。

OWASP ZAP を起動することで ZAP の 58888 ポートが有効になります。
これにより FoxyProxy での接続ができるようになります。

## ８： Firefox で `http://example.jp/` を表示する

Firefoxで `http://example.jp/` を表示させることができれば完了です。

本稿の手順の範囲では Firefox でなければ `http://example.jp/` を名前解決できません。他のブラウザで `http://example.jp/` を表示しようとするとエラーになります。

:::note
`example.jp` などの名前解決は、Firefox からプロキシとして指定されている `zap` コンテナを経て `apache` コンテナに到達し、実際の名前解決は `docker-compose.yml` の `aliases` に従っておこなわれます。
:::

## ９： Firefox のトータルクッキー保護の設定を実施する

Firefox で `http://trap.example.com/firefox_tcp.html` を表示します。(`http://example.jp/` の冒頭にリンクがあります)

ページの案内に従ってトータルクッキー保護を無効化します。

## 普段の実習環境の起動と終了

初回の実施で１から９まで完了すると、次回からは以下の3ステップで実習環境が起動します。

1. `docker compose up -d` を実行する。(数秒)
2. ブラウザ(Firefox 以外でもよい)で `http://localhost:8080/zap` を表示する。(10秒程度)
3. Firefoxで `http://example.jp/` を表示する。(すぐ)

実習環境を終了する時は、可能な限り下記を実行します。

1. Firefox の `http://example.jp/` などを閉じる。
2. `http://localhost:8080/zap` を閉じる。
3. `docker compose down` を実行する。(10秒程度)

実習環境の動作がおかしくなったと感じたら `docker compose down` と `docker compose up -d` をこの順に実行して Docker 環境を再起動してみます。