VAddyをcronで定期的に実行



#VAddy
https://vaddy.net/ja/
継続的なセキュリティテストを実現するクラウド型Web脆弱性検査ツールです。

対象サーバを登録することで、自動的にセキュリティテストをしてくれるものです。
しかし、コマンドか、ブラウザから実行ボタンを押す必要があります。そこでcronを使います。

### VaddyCLI仕様書
　https://github.com/vaddy/go-vaddy/blob/master/README_ja.md
### VaddyAPI仕様書
　https://github.com/vaddy/WebAPI-document/blob/master/VAddy-WebApi-ja.md
### VaddyAPI crawl取得仕様書
  https://github.com/vaddy/WebAPI-document/blob/master/VAddy-WebApi-Crawl-ja.md

#cron
linux上のデーモンの一つで、定期的に実行させたいコマンドを記述することで、実行してくれます。

コマンドでcron設定を編集することができます。


```
crontab -e
```

例えば毎日0時に実行させたい hoge.shがあった場合は

```
00 0 * * * ./hoge.sh
```
と記述します。
左から、[分] [時] [日] [月] [曜日] [コマンド]です。


今回はログも出したかったため、このように記述しました。

```
00 0 * * * ./start-vaddy.sh 1> /home/exec.log 2> /home/error.log
```

これで実行ログが exec.logファイルに、エラーログがerror.logに出力されます。

コマンドを追加していきたい場合は

```
00 0 * * * ./start-vaddy.sh 1> /home/exec.log 2> /home/error.log ; cd .. ; touch hoge
```
など `;` で区切ると追加していけます。

#sh

cronで実行されるshです。bashです。

```
#!/usr/local/bin/bash

###################################################
# script for start vaddy test
#
###################################################

#Vaddy API
VADDY_AUTH_KEY=aaaaaaaaaaaa
#Vaddy user id
VADDY_USER=aaaaaaaaaaaaaa
#test dn
VADDY_FQDN=aaaaaaaaaaaaa

#crawl label
array=(
    "installStep-12"
    "frontPage"
    "adminUserGroup"
    "adminEditorTemplate"
    "mailContact-confirm"
)
# git pull new basercms
./update-secure.sh

# vaddy-cli install
git clone https://github.com/vaddy/go-vaddy.git
cd ./go-vaddy/bin/

# vaddy test func
# args $1=crawl_id
startTest () {
  #start
  ./vaddy-freebsd-64bit $VADDY_AUTH_KEY $VADDY_USER $VADDY_FQDN $1
}

#vaddy test start
for ((i = 0; i < ${#array[@]}; i++)) {
    ./update-secure.sh
　　　　　　　echo "`expr $i + 1`/${#array[@]} tests"
    startTest ${array[i]}
}

```

以下説明です。

```
#Vaddy API
VADDY_AUTH_KEY=aaaaaaaaaaaa
#Vaddy user id
VADDY_USER=aaaaaaaaaaaaaa
#test dn
VADDY_FQDN=aaaaaaaaaaaaa
```
最初に、VAddyで使うAPIキーやユーザ名などを設定します。

```
#crawl label
array=(
    "installStep-12"
    "frontPage"
    "adminUserGroup"
    "adminEditorTemplate"
    "mailContact-confirm"
)
```
arrayを作り、VAddyで作成したクロールの、自分で付けたラベルを入れてます。もちろんクロールidでも可能です。

```
"installStep-12",
```
のように`,`を記述してしまうと実行できないので注意


```
./update-secure.sh
```
の中身はpull対象ディレクトリに移動しpullして、テスト対象のインストール等を行い、ディレクトリを戻ってくるというものです。

```
# vaddy test func
# args $1=crawl_id
startTest () {
  #start
  ./vaddy-freebsd-64bit $VADDY_AUTH_KEY $VADDY_USER $VADDY_FQDN $1
}

#vaddy test start
for ((i = 0; i < ${#array[@]}; i++)) {
    ./update-secure.sh
    echo "`expr $i + 1`/${#array[@]} tests"
    startTest ${array[i]}
}
```
shの本体です。
startTest関数の作成してfor文の中で呼び出しています。
startTestは引数１つをもらう前提で、もらった引数はクロールのラベルとなっています。
ラベルを実行コマンドの一番うしろにつけることでラベルを指定してテスト実行できます。

for文は、記述したラベル名が入ったarrayの中身分繰り返します。
つまり、ラベルをstartTest関数に渡すことをラベルの数だけ繰り返しています。
繰り返すたび、`./update-secure.sh`をして、pullなどをして状態を正常にしています。

#APIも使える
今回はgo-vaddyというクライアントツールを使用していますが、APIもあり、そちらを利用しても実現できます。が、APIを使うと、ラベルを指定して実行するのが少しめんどくさくなります。

go-vaddyは上記の通り、そのまま引数にラベル名を入れることができますが、APIではクロールIDでしか受け付けていません。その代わり、APIではラベルからクロールIDを取得するAPIを使用することでラベルで管理できるようになります。

実現にはstartTest関数の中身を
引数のラベルからクロールIDを取得リクエスト -> 返り値のjsonからcrawl_idの後の値だけ出力 ->　その値をテスト実行コマンドの引数に挿入
に変更する必要があります。

実行部分までAPIに変更する仕様にすると、さらにめんどくさくなります。
API実行ではgo-vaddyで実行した際に出力されていたテスト進捗がなくなるため、テストが終了したかどうか確かめる必要があります。そのために、テスト結果リクエストか終了したか確認するリクエストを定期的に送る必要があります。なので
テスト実行 -> 戻り値のjsonからテストidだけ出力 -> 定期的に終了したか確認 -> 終了してたら次のテスト
といった感じになります。

go-vaddyのほうが楽ですね。
しかし、APIには終了を確認する際に不安が残りますが、実行する際にテストidを取得できるため、キャンセルや結果取得が可能です。（go-vaddyはクライアント側でCtrl+Cや強制終了等のキャンセルした場合、テストは終了されない）

今回ではキャンセルを自動化しても意味ないので、go-vaddyを採用しました。

色々と制約があるので、もっと使いやすくなること期待です。