CircleCIでVAddyのPrivateNetを利用したペネトレーションテストをやってみた

# 概要

CircleCIで[VAddy](https://vaddy.net/ja/?gclid=Cj0KCQiAsbrxBRDpARIsAAnnz_PujYgw0KdVivcAtqR2etvH9RPuFnmMfCfGmdgM-AOiEQ3SF8DiMt0aAoJ8EALw_wcB)のPrivatenetを使用してみようと思ったのですが、意外とハマったのとあまり説明している記事がなかったので備忘録的に記事を書いてみようと思います。

## 本記事で説明すること

- VAddyをCircleCI上で使用する時に必要な設定関連


## 本記事で説明しないこと

- VAddyの契約方法やPrivateNetの事前設定について
- VAddyでのシナリオ作成方法
- VAddyの機能説明
- CircleCIのFingerprint設定とか細かい話

# 手順

- 1. シナリオの作成
- 2. .circleci/config.yml の生成
    - 2.1. containerの種類を定義
    - 2.2. VAddy依存パッケージのインストールを定義
    - 2.3. 環境変数の設定を定義
    - 2.4. アプリケーションの依存パッケージ準備を定義
    - 2.5. SSHの事前準備設定を定義
    - 2.6. アプリケーションのビルド、および起動を定義
    - 2.7. VAddyとの接続、およびスキャンの実行を定義

# 1. シナリオの作成

事前にシナリオを作成しておいてください。

# 2. .circleci/config.yml の生成

jobをconfigに記載しましょう。
以降は`.circleci/config.yml`に記述する定義内容と説明です。

## 2.1. containerの種類

今回はVMではなくdocker containerを使用します。

```yaml:.circleci/config.yml
jobs:
  penetration-check:
    docker:
      - image: circleci/node:lts
    working_directory: ~/workspace
    steps:
      - checkout
```

## 2.2. VAddy依存パッケージのインストール

VAddyのPrivatenetツールはJAVAで動作するプログラムらしいので、openjdkが必要になります。

また、使用しているcontainerはdebian(ubuntu)なのでaptコマンドでパッケージの更新、およびインストールを行います。

```yaml:.circleci/config.yml
      - run:
          name: VAddy依存パッケージのインストール
          command: sudo apt-get update && sudo apt-get install openjdk-8-jre
```

## 2.3. 環境変数の設定

Node.jsのyarnを使っていたりglobalにnpmのライブラリを入れている（pm2とか）場合など、環境変数の設定は以下のように設定します。
もちろんですがsourceコマンドで再読み込みするなどの作業は不要。

ローカルマシンのように `.bash_profile` や `.bashrc` には直接書き込まず`＄BASH_ENV`に対してechoで設定してあげる必要があるといった感じ。

```yaml:.circleci/config.yml
      - run:
          name: 環境変数の設定
          command: |
            echo "export PATH=/usr/local/lib/node_modules:/usr/local/bin:$PATH" >> $BASH_ENV
```


## 2.4. アプリケーションの依存パッケージ準備

ここまでの工程ですでに依存パッケージをインストール、キャッシュしている場合は本作業は不要です。

```.circleci/config.yml
      - run:
          name: パッケージインストール
          command: yarn install
```

## 2.5. SSHの事前準備設定

VAddyのPrivateNetによるスキャンはポートフォワーディングによって実現しており、sshをスクリプト内で実施しているようです。
ただ、通常SSHの初回接続ではknown_hostsへの書き込み時に確認が表示されますが、CircleCIは対話型のツールではありませんので "Yes“ができません。 

また、こういった自動化でよく使われるYesコマンドは機能しません。（できないと知らずにハマりました）

そのため、sshで本来行われるHostKeyCheckを無効化する必要があります。

```yaml:.circleci/config.yml
      - run:
          name: SSH settings
          command: mkdir ~/.ssh/ && echo -e "Host pfd.vaddy.net\n\tStrictHostKeyChecking no\n" > ~/.ssh/config
```

## 2.6. アプリケーションのビルド、および起動

もしコンパイルやトランスパイルが必要なアプリの場合、ここでビルドするようにしてください。

```yaml:.circleci/config.yml
      - run:
          name: アプリのビルド
          command: |
            yarn build
```

また、今回webアプリケーションをテストするわけですが、WEBアプリは性質上、実行結果は永遠に返ってきません。

そのためbackgroundで実行する必要がありますが、よく使われる`＆`コマンドや`nohup`コマンドはCircleCIでは使用できないようなので　アプリケーション起動コマンドに`background`設定を付与します。

```yaml:.circleci/config.yml
      - run:
          name: アプリの起動
          command: yarn start
          background: true
```

また、backgroundオプションでは実行結果が返らないので、ウェイト処理を入れないとアプリケーションが立ち上がる前に次のタスクが走ってしまいます。

そのため、以下のようにsleepコマンドを実行する必要があります。

```yaml:.circleci/config.yml
      - run:
          name: スリープ
          command: sleep 5
```

## 2.7. VAddyとの接続、およびスキャンの実行

最後にスキャンを実行。

```yaml:.circleci/config.yml
      - run:
          name: VAddyとの接続、及びスキャン
          command: curl localhost:3000/health && cd go-vaddy-master/privatenet && ./vaddy_privatenet.sh connect && ./vaddy_privatenet.sh scan
```

実行結果で異常が見つかった場合はステータスコードが1で返ってきますのでジョブはエラーとして処理されます。

#最後に

設定内容、説明に誤りがある場合は是非コメントでお知らせいただけると嬉しいです。

# 仲間を募集しています！

ZEROBILLBANKでは一緒に働く仲間を募集中です。

[ZEROBILLBANK JAPAN Inc.](https://zerobillbank.com/%e3%81%8a%e5%95%8f%e3%81%84%e5%90%88%e3%82%8f%e3%81%9b/)