最近、ちらほらと名前を見かける「Vuls」での脆弱性チェックを当サイトを含むいくつかのサーバに試してみた。

そもそも、Vulsとは?
NVD(National Vulnerability Database)やJVNの脆弱性データをもとに、Linux/FreeBSDに含まれる脆弱性を検知し、詳細情報をレポーティングするOSSのセキュリティツールである。
フューチャーアーキテクトからリリースされており、公式マニュアルも日本語の記述が充実している。

インストール手段はいくつか用意されており、公式のチュートリアルを参考に最も手軽に見えたDockerでの導入を試みた。

導入環境は、minimumのCentOS7 に最新版のDockerをインストールしたものを用いた。

1. 導入

Docker Storeで公開されているので、

docker pull vuls/go-cve-dictionary
docker pull vuls/goval-dictionary
docker pull vuls/vuls
docker pull vuls/vulsrepo

これだけで、必要な道具がそろう。各イメージのアップデート時にはいったん削除して再度pullするという方法が紹介されているようだ。
それぞれ、go-cve-dictionary、goval-dictionaryが脆弱性データの管理、vulsがそのデータを元にスキャンを行う本体、vulsrepoがスキャン結果の表示用ウェブサーバといったものだ。

2. 脆弱性データの取得、更新

NVD、JVNからのデータの取得は

 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

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 fetchjvn -years $i; \
done


これで2002からの脆弱性データが一通り取得できる。volumeを指定して脆弱性データはローカルに保存する。
–rmオプションがあるのでvolumeとして指定したデータだけが残り、コンテナは残らない。

同様にOVALのデータも取得する。

docker run --rm -it \
-v $PWD:/vuls \
-v $PWD/goval-dictionary-log:/var/log/vuls \
vuls/goval-dictionary fetch-redhat 5 6 7

今回のスキャン対象はCentOSなのでredhatのものを用いて問題ないらしい。チュートリアルのコマンドをそのまま使ってしまったが、5とか6は省いてもよかったろうか。

3. 設定ファイルの準備

2で取得した脆弱性データを元にスキャンするためにスキャン対象を設定ファイルで指定する必要がある。
Dockerでの利用の場合、基本的にssh private keyによる認証でスキャン対象へ接続する手段がサポートされているようだ(localスキャンも存在するが、この場合の”local”はDockerコンテナ自体になってしまうため)。
基本的なフォーマットは以下

[servers]
[servers.sample]
host = "IP Address等"
port = "SSH接続用ポート番号"
user = "接続に使用するユーザ名"
keyPath = "コンテナ内でのSSH接続用キーのフルパス ex./home./ssh/id_rsa"

また、事前に何らかの手段でknown_hostsへの接続対象の登録が必要になる。
それが出来たら、vulsの設定確認用コマンド(configtest)でチェックするといいだろう。
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

4. スキャンの実行

脆弱性データ、設定ファイルの準備が出来たら…

ログインして続きを読む