はじめに
脆弱性検知ツールVulsを使うとシステムに内在する脆弱性を一発で俯瞰することができ、非常に便利です。
ただ実際には、運用的にステージング環境で検証を行ったあとサービスのメンテナンス時間にアップデート作業を行うため、直ぐに最新版を適用することが難しかったり、脆弱性の深刻度・攻撃元区分(ローカルかリモートか)によっては適用しないといった判断をすることもあるかと思います。
そういった場合、Vulsで毎日自動スキャンしたあと見つかった脆弱性全部をレポートするのではなく、前日との差分だけ通知してくれたほうが運用的に管理しやすい場合もあります。
導入については各所に纏まった手順があるため、今回はスキャン後の差分レポートの作成についてのみ記載したいと思います。
スキャン後にレポートの差分だけメールする
当初、スキャンが終了したホストの順でレポート結果が出力されていたためタイミングによって順番が入れ替わる場合があり困っていましたが、issues#77、#78で text形式でホスト別にレポート出力が出来るように対応していただきました。感謝!感謝! ♪(o ̄∇ ̄)/
#77 Add JSONWriter, Fix CVE sort order of report
#78 Add -report-text option, Fix small bug of report in japanese
また、--cve-dictionary-dbpath オプションが使えるようになり、go-cve-dictionaryを常駐させる必要がなくなりました。
#84 #85 Fix README, change -cvedbpath to -cve-dictionary-dbpath
これらのオプションを使って、以下のフローをスクリプト化しました。
脆弱性情報の更新
↓
スキャン実行 ※text形式でレポートを出力
↓
text形式のレポートの差分をホスト毎にチェック ⇒ 前日分と差分がなければ終了
↓
差分だけをメールで送信
$ cat /opt/vuls/vuls_scan.sh
#!/bin/bash
VULS_HOME="/opt/vuls"
VULS_LOG="${VULS_HOME}/results"
MAIL_FROM="hoge1@hogehoge.jp"
MAIL_TO="hoge2@hoge.co.jp"
SMTP_SERVER=smtp://192.168.0.1:25
########################
my_logger() {
local priority="user.info"
logger -i -p $priority -t `basename $0` "$1"
}
update() {
local target=$1
local option=$2
local period=$3
for i in `seq 1 3`
do
go-cve-dictionary ${option} -${period}
if [ $? -eq 0 ];then
my_logger "[INFO] Update success. [${target}]"
break
else
my_logger "[ERROR] Update fail. [${target}] (count=$i)"
fi
done
}
#======
cd ${VULS_HOME}
if [ $? -ne 0 ];then
my_logger "[ERROR] path not found [${VULS_HOME}]"
exit 1
fi
update NVD fetchnvd last2y
update JVN fetchjvn last2y
vuls scan -lang=ja -report-text -cve-dictionary-dbpath=${VULS_HOME}/cve.sqlite3
if [ $? -eq 0 ];then
my_logger "[INFO] Scan success."
else
my_logger "[ERROR] Scan fail."
exit 1
fi
diff -r -N -P \
--exclude="all.txt" \
-y --suppress-common-lines -W 170 \
`ls -rtd ${VULS_LOG}/* | grep -v current | tail -2` > _tmp_diff.log
if [ $? -eq 0 ];then
my_logger "[INFO] No difference in the scan results."
exit 0
fi
export LC_CTYPE=ja_JP.utf8
cat _tmp_diff.log | \
/bin/mail -s "Vuls Scan Report" -S "smtp=${SMTP_SERVER}" -r "${MAIL_FROM}" "${MAIL_TO}"
if [ $? -eq 0 ];then
my_logger "[INFO] Success to send mail."
else
my_logger "[ERROR] Failure to send mail."
exit 1
fi
exit 0
mailコマンドが入っていない場合は、インストールしておきます。
$ sudo yum install mailx
上記のスクリプトをcronに登録します。(rootユーザの環境変数を読み込むためbash -lを付けてます)
$ cat /etc/cron.d/vuls_cron
05 13 * * * root bash -l /opt/vuls/vuls_scan.sh > /dev/null 2>&1
さいごに
前日分との差分だけ通知することで、自サーバに関連する新着の脆弱情報にいち早く気づくことが出来るようになりました。