Vuls for Azureできるかな(第2回)

こんにちわ、Mr.Xです。

とりあえずvuls自体の環境は整った。(第一回の記事参照
次のステップは、vulsの結果を Azure Storage (BLOB) に格納する、ということだ。

vulsにはそもそも -report-s3 というオプションがあり、これに加えてAWSの各種設定値をセットして実行すれば、シームレスに連携ができるようになっている。
しかし、BLOBストレージにそれが転用できるというわけではない。ではどうするか。

基本的な手段の想像
OSSなんだから、コード書いてsend-prするのが筋かもしれないが、私ごときでは時間もかかりすぎるので、Work Aroundな方法でまずは行きたい。
vuls には -report-json というオプションがある。これで出力されたJSONをAzure CLIにパイプで渡し、Azure CLIからコンテナにputする、という方法を考えた。

Functionsはこのputをtriggerにして起動するようにするのだけど、今回はまず転送だけで終わる。次回予告からではどっちもやる勢いだったけど、すまん、今はこれが精いっぱい。

準備
[確認] -report-jsonではどのような出力か。
こんなんでした。一部抜粋。実際はかなり長い。json_20160612

[導入] AzureCLI
epelリポジトリを利用できるようにして、node.js, npmをインストールして、npm経由でのインストールが最も楽。
参考: [Qiita] centos + node.js + npm + nvm インストール
参考: [公式] Azure CLI のインストール

[確認] そもそもパイプで渡せる?
結論から言うと無理。
-report-json オプションは標準出力にも吐き出すし、別にファイルも作る。しかし、標準出力の部分には別に要らない部分もある。もうひとつ、Azure CLIのコマンドではファイルを指定するのだが、いわゆる標準入力を意味する”-“を解釈してくれない。結局出力されたファイルを指定して送ることになりそうだ。

どうせcronとかで自動的に処理するので、vulsのあとにCLIを実行する、ちょっとしたスクリプトを書けば済むことだ。

やってみた。
まずvulsの実行から、jsonファイルを転送するところまでのスクリプトを書いた。

#!/usr/bin/bash

#Vars
VULS="/home/azureuser/go/bin/vuls"
VULS_OPTIONS="scan -lang=ja -ignore-unscored-cves -report-json"
VULS_JSON="/home/azureuser/results/current/vuls-target.json"

AZURE_STORAGE_CONTAINER="コンテナ名が書いてある"
AZURE_STORAGE_ACCOUNT="ストレージアカウントが書いてある"
AZURE_STORAGE_ACCESS_KEY="KEYが書いてある"

AZURE_CLI="/usr/bin/azure"
AZURE_CLI_OPTIONS="storage blob upload --container $AZURE_STORAGE_CONTAINER -f $VULS_JSON -b 0000.json"

#Logic
$VULS $VULS_OPTIONS

export AZURE_STORAGE_ACCOUNT=$AZURE_STORAGE_ACCOUNT
export AZURE_STORAGE_ACCESS_KEY=$AZURE_STORAGE_ACCESS_KEY
$AZURE_CLI $AZURE_CLI_OPTIONS

大変雑なスクリプトだが無事に機能した。オプションの意味等はドキュメントを見てほしい。
なお、”VULS_JSON”のファイル名は、config.tomlで設定したターゲットサーバー名がそのまま利用されるので、もしこのスクリプトを試す人は、まずvulsを使ってから確認してほしい。複数の場合どうなるかはまだ試していないので要注意。ひょっとするとglobを利用する必要があるかもしれない。

今回はちょっとした試験なので、作られるblob名は0000.jsonにしてあるけども、自動化を踏まえると、タイムスタンプなどを利用した方がいいかな。
また、cronで自動化する際には、出力の抑制目的のログ取得など、工夫すべき点は多くある。

次回はいよいよ、このblobへのputをトリガとして、Azure Functions(Preview)を動かすことに挑戦する。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*