VAddyのWeb脆弱性診断を定期的に実行して結果をSlack通知

これは[VAddy Adventカレンダー](http://qiita.com/advent-calendar/2016/vaddy)9日目の記事です。
[VAddyは、継続的なWeb脆弱性診断が簡単に実現できるSaaSです。](https://vaddy.net/ja)

## 最新情報（2019/6/6)
この記事を書いた当時は、VAddyのCLIツール(go-vaddy)にSlack通知機能がありませんでした。そこで本記事のようにSlackに通知するための仕組みを別途シェルスクリプトで書いています。
最新のgo-vaddyコマンドでは、Slack連携機能があり、Slack用の設定をすれば脆弱性を発見した場合のみSlackに通知がくるようになっています。
Slack以外には対応していませので、Chatworkやその他の連絡手段に通知するためには、本記事の方法が利用できると思います。

## VAddyの脆弱性診断をコマンドラインから操作

VAddyはCLIツールとして[go-vaddy](https://github.com/vaddy/go-vaddy)を配布しています。Go言語で実装しており、[バイナリも配布](https://github.com/vaddy/go-vaddy/tree/master/bin)しているため、Linux, Mac, Windowsのユーザであればすぐに実行できます。

このCLIツールの結果をSlackに投稿すれば、例えばTravisCIやCirclCIなどで実行したVAddyの脆弱性検査結果を簡単にSlackに通知できます。
今回は、Macのターミナルを使ってVAddyの検査を実行し、その結果をSlackに通知するようにします。これをcronなどで実行すれば毎日Webの脆弱性検査を実行して結果をSlackで確認できるようになります。

後半は、脆弱性を発見した時のみ、Slackに通知するようにスクリプトを作ります。これにより、毎日実行される検査で問題があった場合のみSlackに投稿されるため、問題に気付きやすくなります。

## VAddyでの検査
今回の記事を自分で試す前提として、VAddyにサインアップしてWebAPI用のキーの発行や、検査対象の登録などを済ませておく必要があります。使い方は非常に簡単なため、サインアップして指示に従っていけばできると思います。
https://vaddy.net/ja

## go-vaddyコマンド
まずはgo-vaddyコマンドをGitHubからダウンロードしてください。
`git clone https://github.com/vaddy/go-vaddy.git`
でも良いですし、GitHubのサイトからZIPファイルをダウンロードするのも良いと思います。
https://github.com/vaddy/go-vaddy/archive/master.zip

go-vaddy/bin/ディレクトリがあるので、自分が使っているOSのバイナリを使います。今回はMacですので、`vaddy-macosx64`を使います。

| OS            | file               | 
| ------------- |:------------------:| 
| Linux(64bit)  | vaddy-linux-64bit  |
| MacOS(64bit)  | vaddy-macosx64     |
| Windows(64bit)| vaddy-win-64bit.exe|
| Linux(32bit)  | vaddy-linux-32bit  |
| Windows(32bit)| vaddy-win-32bit.exe|

VAddyの脆弱性検査実行に必要となるトークンやユーザIDなどを環境変数でセットして実行するシェルスクリプトを作ります。環境変数の値は自分の情報をセットします。
今回は名前を `startvaddy.sh`にしておきます。

```bash
#!/bin/sh

export VADDY_TOKEN="abcd12345"
export VADDY_USER="vaddyuserID"
export VADDY_HOST="vaddytestserver.example.com"

./go-vaddy/bin/vaddy-macosx64
```

このシェルを実行すると脆弱性検査が開始され、結果がレポートされます。脆弱性が0件だった場合は正常終了し、脆弱性があった場合は異常終了します。ステータスは1が返ります。
![vaddyerror.png](https://qiita-image-store.s3.amazonaws.com/0/61278/3a5d7597-e271-1a4b-659d-17e1a46ec13b.png)


## 結果をSlack通知
この結果をコマンドラインでSlackに通知してみましょう。
今回はこの記事にある通りにSlackのWebhook URLを発行して、記事にあるシェルスクリプト（webhook.sh）をそのまま使います。
http://qiita.com/tt2004d/items/50d79d1569c0ace118d6

`startvaddy.sh`と`webhook.sh`は同じディレクトリにおきます。
webhook.shの中の`WEBHOOKURL`の値を自分のWebhook URLに変更します。
そして先ほど作った`startvaddy.sh`とslack通知用シェルスクリプト`webhooks.sh`を組み合わせて実行してみます。
`./startvaddy.sh  |  ./webhooks.sh`

![スクリーンショット 2016-12-09 16.54.27.png](https://qiita-image-store.s3.amazonaws.com/0/61278/31be19b0-d98f-5a22-259b-726f39264ee4.png)

govaddyコマンドの結果がそのままSlackに流れてきます。
このキャプチャ画像では脆弱性が1件発見されており、詳細は `Result URL`のURLをクリックして確認できます。


## 脆弱性があった場合のみSlack通知
ここまでで簡単にSlack通知ができるようになりましたが、脆弱性が0件の場合も常にSlack通知をすると日々その通知がきてしまい、問題がある場合の通知を見落としがちになります。ですので、脆弱性を発見した場合のみ通知するようにしてみます。

最初に作った `startvaddy.sh`を修正します。`webhook.sh`はそのままです。

```bash
#!/bin/sh

set -eu

trap catch ERR

function catch {
    echo "$MESSAGE" | ./webhook.sh
}

export VADDY_TOKEN="abcd12345"
export VADDY_USER="vaddyuserID"
export VADDY_HOST="vaddytestserver.example.com"

MESSAGE=$(./go-vaddy/bin/vaddy-macosx64)
```

このシェルの中で、`webhook.sh`を呼び出しているため、実行は`startvaddy.sh`のみを実行します。
`./startvaddy.sh`

これにて、脆弱性があった場合や検査が途中でエラーになった場合などに限りエラー結果がSlackに流れるようになります。あとはこのシェルの実行をcronコマンドなどで定期実行すれば良いと思います。その場合はLinuxサーバで実行すると思いますので、バイナリファイルは、`vaddy-linux-64bit`をご利用ください。

## さいごに

このように、シェルベースでVAddyの脆弱性診断を実行して結果を受け取ることができますので、あとはSlackに通知するなり、HipchatやTypetalkに通知するなり、好きにできます。
本当はgo-vaddyコマンドから異常終了が返るため、`startvaddy.sh || webhook.sh`とすれば異常終了の時のみwebhook.shが実行されるのですが、それだとgo-vaddyの標準出力の結果がwebhook.shに渡ってきません。そのため、中間ファイルを生成するなどの処理が必要になってきますので、今回のような`trap`を使った処理にしました。