GMOアドマーケティング インフラエンジニアの T.Sです。
今回は、脆弱性検知ツール Vulsを試してみたいと思います。
Vulsとは
Vulsとは、日々発生する脆弱性をスキャンし、結果を一覧にして分かりやすく表示、通知してくれるOSSです。
また、Vulsには以下のような特徴があります。
- 複数台あるサーバーを一斉にスキャンし、cronなどでスケジューリングすることで定期的にスキャンして通知する事が可能
- 通知は前回との差分での出力や、CVSS scoreが一定以上の脆弱性のみ通知するなど、柔軟な通知が可能
- スキャン結果はメール通知の他に、slackやブラウザ上でレポートとして表示が可能
また、将来的にはSSH接続可能なネットワーク機器へのスキャンも可能になるとのこと。
Vulsのslackチームもあり、こちらで質問を投げると結構な速さで返ってきます。
Github : https://github.com/future-architect/vuls
日本語README:https://github.com/future-architect/vuls/blob/master/README.ja.md
Vulsインストール
Vulsサーバー側の準備
Vulsを使う方法として、2つの手段があります
- Dockerコンテナにセットアップ
- 手動で必要なソフトウェアをインストール
今回は簡単に導入できるDocker版で説明します
Githubリポジトリをclone
1 2 3 |
$ git clone https://github.com/future-architect/vuls.git $ cd vuls/setup/docker/ |
Docker版Vulsとgo-cve-dictionaryのimageを取得
1 2 3 |
$ docker pull vuls/go-cve-dictionary $ docker pull vuls/vuls |
go-cve-dictionary(時間が掛かります)
1 2 3 4 5 6 |
for i in `seq 2002 $(date +"%Y")`; do \ docker run --rm -it \ -v $PWD:/vuls \ -v $PWD/go-cve-dictionary-log:/var/log/vuls \ vuls/go-cve-dictionary fetchnvd -years $i; \ done |
スキャン結果を日本語で出力したい場合、追加で下記コマンドを実行します
1 2 3 4 5 6 |
for i in `seq 1998 $(date +"%Y")`; do \ docker run --rm -it \ -v $PWD:/vuls \ -v $PWD/go-cve-dictionary-log:/var/log/vuls \ vuls/go-cve-dictionary fetchjvn -years $i; \ done |
Vulsサーバー側の準備はこれで完了です。
スキャン対象ホスト側の準備
今回はスキャン対象のホストがCentOSの為、対象のホストにyum-plugin-changelogが必要です。
その他のディストリビューションについては、Githubを参照。
1 |
$ yum install -y yum-plugin-changelog |
また、鍵を作成してSSHでnopasswdログイン可能な状態にしてください。
スキャンを試す
スキャンを実行する前に、設定ファイルを作成します。
この設定ファイル内に、スキャン対象のサーバーや、メール送信先やslackの設定を記述します。
今回はテストなのでrootでスキャンしてますが、本番環境で継続的にスキャンする場合は、別途ユーザーを作成し、vulsで使うコマンドのみ許可させて実行するのが望ましいです。
1 |
$vi config.toml |
1 2 3 4 5 6 7 |
[servers] [servers.****] ## servers.****に分かりやすい名前をつける(ドットは使用不可) host = "192.168.56.102" ## 対象サーバーのIPアドレス or host名 port = "22" user = "root" ## スキャン対象サーバーのユーザー名を記述 keyPath = "/root/.ssh/id_rsa" # path to ssh private key in docker |
設定ファイルを書き終えたら、スキャン可能になっているかテストします。
下記のような出力になれば、スキャン準備完了です。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[root@localhost cve]# docker run --rm -it -v ~/.ssh:/root/.ssh:ro -v $PWD:/vuls -v $PWD/vuls-log:/var/log/vuls vuls/vuls configtest -config=./config.toml [Apr 20 15:15:24] INFO [localhost] Validating config... [Apr 20 15:15:24] INFO [localhost] Detecting Server/Container OS... [Apr 20 15:15:24] INFO [localhost] Detecting OS of servers... [Apr 20 15:15:25] INFO [localhost] (1/1) Detected: test: centos 6.9 [Apr 20 15:15:25] INFO [localhost] Detecting OS of containers... [Apr 20 15:15:25] INFO [localhost] Checking dependendies... [Apr 20 15:15:25] INFO [test] Dependencies... Pass [Apr 20 15:15:25] INFO [localhost] Checking sudo settings... [Apr 20 15:15:25] INFO [test] Checking... sudo yum --changelog --assumeno update yum [Apr 20 15:15:29] INFO [test] Sudo... Pass [Apr 20 15:15:29] INFO [localhost] Scannable servers are below... test |
尚、yum-plugin-changelogが入っていない場合、下記のようなエラーが出ます。
1 2 3 4 5 6 7 8 9 10 11 |
[root@localhost cve]# docker run --rm -it -v ~/.ssh:/root/.ssh:ro -v $PWD:/vuls -v $PWD/vuls-log:/var/log/vuls vuls/vuls configtest -config=./config.toml [Apr 20 15:08:12] INFO [localhost] Validating config... [Apr 20 15:08:12] INFO [localhost] Detecting Server/Container OS... [Apr 20 15:08:12] INFO [localhost] Detecting OS of servers... [Apr 20 15:08:12] INFO [localhost] (1/2) Detected: test: centos 6.9 [Apr 20 15:08:12] INFO [localhost] Detecting OS of containers... [Apr 20 15:08:12] INFO [localhost] Checking dependendies... <strong>[Apr 20 15:08:13] ERROR [test] yum-plugin-changelog is not installed [Apr 20 15:08:13] ERROR [localhost] Error: test, err: [yum-plugin-changelog is not installed]</strong> [Apr 20 15:08:13] INFO [localhost] Checking sudo settings... [Apr 20 15:08:13] INFO [localhost] Scannable servers are below... |
試しにスキャンしたところ、下記のような結果になりました。
vuls scan
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
[root@localhost cve]# docker run --rm -it -v ~/.ssh:/root/.ssh:ro -v $PWD:/vuls -v $PWD/vuls-log:/var/log/vuls -v /etc/localtime:/etc/localtime:ro -e "TZ=Asia/Tokyo" vuls/vuls scan -config=./config.toml [Apr 21 00:19:00] INFO [localhost] Start scanning [Apr 21 00:19:00] INFO [localhost] config: ./config.toml [Apr 21 00:19:00] INFO [localhost] Validating config... [Apr 21 00:19:00] INFO [localhost] Detecting Server/Container OS... [Apr 21 00:19:00] INFO [localhost] Detecting OS of servers... [Apr 21 00:19:00] INFO [localhost] (1/1) Detected: test2: centos 6.9 [Apr 21 00:19:00] INFO [localhost] Detecting OS of containers... [Apr 21 00:19:00] INFO [localhost] Detecting Platforms... [Apr 21 00:19:04] INFO [localhost] (1/1) test2 is running on other [Apr 21 00:19:04] INFO [localhost] Scanning vulnerabilities... [Apr 21 00:19:04] INFO [localhost] Scanning vulnerable OS packages... [Apr 21 00:19:07] INFO [test2] (1/12) Scanned binutils-2.20.51.0.2-5.46.el6 -> 2.20.51.0.2-5.47.el6_9.1 : [] [Apr 21 00:19:07] INFO [test2] (2/12) Scanned curl-7.19.7-52.el6 -> 7.19.7-53.el6_9 : [] [Apr 21 00:19:07] INFO [test2] (3/12) Scanned glibc-2.12-1.209.el6 -> 2.12-1.209.el6_9.1 : [] [Apr 21 00:19:07] INFO [test2] (4/12) Scanned glibc-common-2.12-1.209.el6 -> 2.12-1.209.el6_9.1 : [] [Apr 21 00:19:07] INFO [test2] (5/12) Scanned kernel-2.6.32-696.el6 -> 2.6.32-696.1.1.el6 : [] [Apr 21 00:19:07] INFO [test2] (6/12) Scanned kernel-firmware-2.6.32-696.el6 -> 2.6.32-696.1.1.el6 : [] [Apr 21 00:19:07] INFO [test2] (7/12) Scanned libcurl-7.19.7-52.el6 -> 7.19.7-53.el6_9 : [] [Apr 21 00:19:07] INFO [test2] (8/12) Scanned nss-3.27.1-13.el6 -> 3.28.4-1.el6_9 : [] [Apr 21 00:19:07] INFO [test2] (9/12) Scanned nss-sysinit-3.27.1-13.el6 -> 3.28.4-1.el6_9 : [] [Apr 21 00:19:07] INFO [test2] (10/12) Scanned nss-tools-3.27.1-13.el6 -> 3.28.4-1.el6_9 : [] [Apr 21 00:19:07] INFO [test2] (11/12) Scanned nss-util-3.27.1-3.el6 -> 3.28.4-1.el6_9 : [] [Apr 21 00:19:07] INFO [test2] (12/12) Scanned tzdata-2016j-1.el6 -> 2017b-1.el6 : [] One Line Summary ================ test2 centos6.9 0 CVEs 12 updatable packages |
vuls report
日本語で結果を表示したい場合は、 -lang=ja のオプションをつける
1 2 3 4 5 6 7 8 9 10 11 12 |
[root@localhost cve]# docker run --rm -it -v ~/.ssh:/root/.ssh:ro -v $PWD:/vuls -v $PWD/vuls-log:/var/log/vuls -v /etc/localtime:/etc/localtime:ro vuls/vuls report -cvedb-path=/vuls/cve.sqlite3 -format-short-text -config=./config.toml -lang=ja [Apr 21 00:43:28] INFO [localhost] Validating config... [Apr 21 00:43:28] INFO [localhost] cve-dictionary: /vuls/cve.sqlite3 [Apr 21 00:43:28] INFO [localhost] Loaded: /vuls/results/2017-04-21T00:19:04+09:00 test (centos6.9) ================= Total: 0 (High:0 Medium:0 Low:0 ?:0) 12 updatable packages No CVE-IDs are found in updatable packages. 12 updatable packages |
まとめ
今回の結果では脆弱性はありませんでしたが、実際の環境によってはたくさんのスキャン結果が出たりします。
その状態でslack通知をONにしていると、チャンネルのログが埋め尽くされたりするので、注意が必要です。
Githubでは、更に詳しい説明や手順などが日本語で記載されているので、興味を持った方は一度Githubを見てみて下さい!