はじめに
「Zabbixに登録されたホスト情報を脆弱性スキャナVulsへ自動連携する」で少し触れましたが、Vulsでスキャンした結果のJSONファイルを加工(Gist:vuls scan&zabbixにsend)することでZabbixに検知結果を連携することができます。
そしてZabbixへ連携し柔軟なトリガーと通知機能を使うことで、前回スキャン時との比較で検知数が増加した(新しい脆弱性を発見した)ときのみアラート通知する仕組みを作ることができます。
今回は自動運用するために以下のフローを一つのスクリプトで実行するようにします。
脆弱性情報(NVD・JVN)アップデート
↓
Vulsでスキャン
↓
Zabbixへ結果連携
↓
Vuls JSONファイルのローテーション
「Vuls JSONファイルのローテーション」はVulsRepoで結果を閲覧する際に、毎日スキャンしているとファイル選択ツリーが下に長くなるため、月ごとに一つのフォルダにまとめます。また、こうすることで月別に分析したい場合、選択が楽になります。
手順
シェルスクリプト配置
https://github.com/usiusi360/vuls_autoscan_for_zabbix
にある「vuls_autoscan_for_zabbix.sh」をVulsの「ホームフォルダ」に置いて実行権限を付与します。
$ cd /opt/vuls
$ wget https://github.com/usiusi360/vuls_autoscan_for_zabbix/blob/master/vuls_autoscan_for_zabbix.sh
$ chmod 700 vuls_autoscan_for_zabbix.sh
スクリプト内のZabbixサーバのアドレスを環境に合わせて変更します。
$ vi vuls_autoscan_for_zabbix.sh
---------
#!/bin/bash
ZABBIX_SERVER="localhost" ←★ Change
---------
zabbix-senderがインストールされていない場合は、インストールが必要です。
$ sudo yum install zabbix-sender
Zabbix設定
https://github.com/usiusi360/vuls_autoscan_for_zabbix
にある「Template_Vuls.xml」をダウンロードし、ZabbixにインポートしあとVulsのスキャン対象ホストへリンクします。
尚、Zabbix2.4以降用になっています。2.2以前の場合は、トリガー式を修正してからインポートする必要があります。(「and」→「&」)
<expression>{Template Vuls:nvd_count.change()}>0 and {Template Vuls:nvd_count.nodata(300)}=0</expression>
cronで自動実行
cronでシェルスクリプトを自動実行します。
尚、cronから実行すると「/etc/profile.d/」以下の環境変数は読み込まれないため、goの環境変数を読み込むため「bash -l」を付けてます。
0 13 * * * vuls-user bash -l /opt/vuls/vuls_autoscan_for_zabbix.sh > /tmp/vuls.log 2>&1
結果
正しく設定されていれば、Vulsのスキャン結果を元に「検知したCVEの数」と「検知したスコアの最大値」が収集されます。
そして前回チェック時から検知数が「増加した場合」にアラートとして検知できます。
さいごに
上記の仕組みを使うことで「新しい脆弱性を検知した時」だけ対応すれば良くなります。
そしてVulsRepoでスキャン時刻とCVE-IDを軸に分析することで、どのような脆弱性を新しく検知したか簡単に見つけることが出来ます。