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

  • 6
    いいね
  • 0
    コメント

これはVAddy Adventカレンダー9日目の記事です。
VAddyは、継続的なWeb脆弱性検査が簡単に実現できるSaaSです。

最近、福岡の行きつけのビアバー、ガストロパブエールズに行ったところ、BrewDogのホッピークリスマスIPAがあったので飲んでみました。こ・・これは美味い! 期間限定なので是非お試しを。東京都内の人はBrewDogバー六本木で飲めると思います。

VAddyの脆弱性検査をコマンドラインから操作

VAddyはCLIツールとしてgo-vaddyを配布しています。Go言語で実装しており、バイナリも配布しているため、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にしておきます。

#!/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

結果をSlack通知

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

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

スクリーンショット 2016-12-09 16.54.27.png

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

脆弱性があった場合のみSlack通知

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

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

#!/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を使った処理にしました。

この投稿は VAddy Advent Calendar 20169日目の記事です。