徳丸本の環境構築を楽にするツールをAnsibleとシェルで作ってみた

[体系的に学ぶ安全なWebアプリケーションの作り方 第2版(通称徳丸本)](https://amzn.to/32qI0Gk)はWebアプリケーションのセキュアコーディングについて体系的にまとめられたバイブル的な書籍です。実際に脆弱性を体験できる豊富な演習も有り、実際に体験しながら学べる点も素晴らしい書籍です。ただ、演習の環境構築が煩雑な作業であり、手間が掛かります。加えて、FireFoxにアドインをインストールして利用する為、出来れば演習専用環境を構築したいと思いました。本記事では、RedHatが開発している環境構築自動化を実現するOSSの[Ansible](https://www.redhat.com/ja/engage/delivery-with-ansible-20170906?sc_cid=701f2000000RlymAAC&gclid=Cj0KCQjw3qzzBRDnARIsAECmryoB_frYCkt8PCG_Q3kp3LgK-tl8sHEJAMumQPkpwA37g3hQ_tPd-KcaAuxxEALw_wcB&gclsrc=aw.ds)とシェルを用いて、適当なVM上に環境構築が出来るツールを開発したので紹介したいと思います。

## 自動化出来るプロセスがどれだけ有るか確認
徳丸本の演習環境の構築方法は書籍の第2章で解説されています。この構築方法のうち全てが自動化可能という訳ではありません。自動化の可否を以下の表にまとめました。

|行程|自動化の可否|
|:---|:---:|
|必要なソース・VMファイルのダウンロード|可[^download]|
|Firefoxのインストール|可[^firefox]|
|VirtualBoxのインストール|可|
|ホストネットワークマネージャーの設定(VirtualBox)|可|
|VMのインポート(VirtualBox)及び設定|可|
|hostsファイルへのFQDNの登録|可|
|OWASP ZAPのインストール|可|
|OWASP ZAPの初期設定|不可|
|FoxyProxy-Standardのインストール|不可|

今回はUbuntuがインストールされているVMに環境構築を行うことを想定してツールを構築した為、Firefoxのインストールはツールでは行いません。故に7割5分の行程は自動化可能だということが上の表から分かります。

## 環境構築支援ツールの実装
ツールの実装は、実行部はシェルで実装し、内部でAnsibleが実行される様にしています。ソースは[筆者のGitLab](
https://gitlab.com/y-vectorfield/building-tokumaru-book-env)に置いています。自由にダウンロードしてお使い頂けます(MITライセンス)。[構築マニュアル](https://gitlab.com/y-vectorfield/building-tokumaru-book-env/-/blob/master/README.adoc)も置いています。

```bash:build.sh(実行部)

#!/bin/bash

apt install -y ansible wget
ansible-playbook -i inventory playbook.yml

```

```yaml:playbook.yml(2021/5/19改訂)

- hosts: localhost
  environment:
    zap_ver: 2.10.0
  become: yes
  tasks:
   - name: Download sources
     shell: cat auth.txt | xargs -n 2 sh -c 'wget -P /home/wasbook/ --http-user=$0 --http-password=$1 https://wasbook.org/download/wasbook.zip' && \
            unzip -od /home/wasbook/wasbook /home/wasbook/wasbook.zip warn=False && \
            chown -R wasbook /home/wasbook/wasbook warn=False && \
            chgrp -R wasbook /home/wasbook/wasbook warn=False

   - name: Download VM image file
     shell: cat auth.txt | xargs -n 2 sh -c 'wget -P /home/wasbook/ --http-user=$0 --http-password=$1 https://wasbook.org/download/wasbook.ova' && \
            chown wasbook /home/wasbook/wasbook.ova warn=False && \
            chgrp wasbook /home/wasbook/wasbook.ova warn=False

   - name: Install Open JDK 11
     apt:
        name: openjdk-11-jdk

   - name: Install OWASP ZAP
     shell: wget https://download.opensuse.org/repositories/home:/cabelo/xUbuntu_18.04/amd64/owasp-zap_{{ ansible_env.zap_ver }}_amd64.deb -P /home/wasbook/ warn=False && \
            dpkg -i /home/wasbook/owasp-zap_{{ ansible_env.zap_ver }}_amd64.deb

   - name: Register hosts
     shell: echo "192.168.56.101 example.jp api.example.net trap.example.com" >> /etc/hosts

   - name: Add oracle vbox 2016 keys
     shell: wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add -  warn=False && \
            add-apt-repository "deb [arch=amd64] https://download.virtualbox.org/virtualbox/debian bionic contrib"
   
   - name: Install Virtual Box
     apt:
       name: virtualbox-6.0
       update_cache: yes

   - name: Change HOME 
     shell: export HOME=/home/wasbook

   - name: Import VM
     shell: vboxmanage import --options keepallmacs /home/wasbook/wasbook.ova && \
            vboxmanage hostonlyif create && \
            vboxmanage modifyvm wasbook --nic1 nat && \
            vboxmanage modifyvm wasbook --nic2 hostonly && \
            vboxmanage modifyvm wasbook --hostonlyadapter2 "vboxnet0"
     become_user: wasbook

   - name: Restore HOME  
     shell: export HOME=/root
```

```:inventory
[localhost]
127.0.0.1 ansible_connection=local
```

inventoryファイルを修正することでリモートでVM上に環境構築することも可能です。

## VM上で構築する時の留意事項
VM上で構築する時にOS毎にお薦めのハイパーバイザーを記載しておきます。

### Mac
* [VMware Fusion(商用ソフト)](https://www.vmware.com/jp/products/fusion.html)
* (2020/8/24追記) 次期バージョンのFusion 12からFusion Playerという個人利用は無料で利用出来るバージョンが追加されます。([参考](https://news.mynavi.jp/article/20200824-1239550/))

### Windows
* [VMware Workstation Player(個人利用は無料)](https://www.vmware.com/jp/products/workstation-player/workstation-player-evaluation.html)

:warning: [Mac向けハイパーバイザー(仮想化ソフト)を比較してみた](https://qiita.com/y-vectorfield/items/72e327d60d2806a62060)で取り上げましたが、Mac用ハイパーバイザーのParallels Desktopの通常版ではNested Virtualizationに対応していない為、本ツールは正しく動作しません。

:warning: Oracle VirtualBoxは動作が重いため演習実行環境構築用途には不向きだと思います。(あくまで筆者の意見)

## まとめ
徳丸本の演習環境の構築を支援するツールをAnsibleとシェルで実装してみました。実際にUbuntuのインストールされたVM上で実行した所、環境構築がスムーズに実行出来ました。本ツールはMITライセンスです。改良案の提案、Issueの発行、プルリクエストは大歓迎です。

## Reference
Software Design 2018年12月号
https://docs.oracle.com/en/virtualization/virtualbox/6.0/user/

[^download]: ソースやVMファイルのダウンロードには書籍内の認証情報が必要となります。今回実装したツールも認証情報が必要となります。
[^firefox]: VMにLinuxを利用する場合はインストール不要