そろそろ Vuls を唱えるか
Ubuntu 関連の脆弱性情報は以下のサイトで収集できる。
これらのサイトの脆弱性情報はとても有用なのだが,パッケージ単位の情報なのでパッケージ間の依存関係が分かってないと何がどう影響するか分かりにくい。 更に上のサイトを見ただけでは深刻度が分からない(CVE 番号から調べることは可能)。 更に更に言うと Ubuntu の各パッケージは古いバージョンに対してバックポートティングをかけて脆弱性を手当している場合もあり,パッケージのバージョン番号を見ただけでは分かりにくかったりする。
つまり CVE や OVAL や各ディストリビューションが提供する情報を統合管理する必要があるのだが,手動でこれをやるのは骨が折れる。 今回は個人のデスクトップ PC だけだから管理も比較的楽だけど,複数のサーバ(クラウド環境も併せて)を管理するとか気が遠くなる。 つか,もはや手動で管理とかあり得ないだろう。
というわけで,そろそろ Vuls を唱えてみるか。
Vuls とは
Vuls は脆弱性の検知を行うツールで,ほぼ Go 言語で組まれているのが特徴である。 複数のサーバに対して脆弱性の有無を一括スキャンすることが可能という実にサーバ管理者に優しいつくりになっている。
Vuls 本体はシングル・バイナリだが CVE や OVAL などの脆弱性情報を収集するツール群と組み合わせて使うことを前提としている。 また最近では Vuls を含むツール群を SaaS 化した FutureVuls なる商用サービスも登場している。
今回は Vuls の基本機能でローカル PC の脆弱性管理を行ってみたいと思う。
【前準備】 ディレクトリの作成
まず前準備として Vuls を含むツール群が出力するデータベースを置くディレクトリ ~/vuls
を作成しておく。
$ mkdir ~/vuls
次に各ツールが吐き出すログの出力先ディレクトリを作っておく。
$ sudo mkdir /var/log/vuls
$ sudo chown username:username /var/log/vuls
$ sudo chmod 700 /var/log/vuls
$ sudo mkdir /var/log/gost
$ sudo chown username:username /var/log/gost
$ sudo chmod 700 /var/log/gost
$ sudo mkdir /var/log/go-exploitdb
$ sudo chown username:username /var/log/go-exploitdb
$ sudo chmod 700 /var/log/go-exploitdb
CVE 情報の収集
CVE 情報の収集には go-cve-dictionary を使う。
go-cve-dictionary のセットアップ
ソースコードからのインストール方法については色々説明があるが,最近のバージョンはバイナリも提供しているようである。
これをありがたく使わせてもらおう。 いやぁ Go 言語のツールは取り回しが楽でいいね。
go-cve-dictionary による CVE 情報の収集
たとえば2002年以降の CVE 情報を収集し SQLite のデータベースファイル ~/vuls/cve.sqlite3
へ格納するには以下の一行スクリプトを実行する。
$ for i in `seq 2002 $(date +"%Y")`; do go-cve-dictionary fetchnvd -dbpath ~/vuls/cve.sqlite3 -years $i; done
ものごっつ時間がかかるので,ここらでお茶の時間にしよう。
OVAL 情報の収集
OVAL 情報の収集には goval-dictionary を使う。
goval-dictionary のセットアップ
goval-dictionary もバイナリがリリースされているのだが,バイナリ・リリースされているバージョンでは Ubuntu 19 に対応していないようなので,最新ソースを取ってきてビルドする必要がある。
$ cd $GOPATH/src/github.com/kotakanbe
$ git clone https://github.com/kotakanbe/goval-dictionary.git
$ cd gost/
$ make install
実行モジュールは $GOPATH/bin
ディレクトリにインストールされる。
goval-dictionary による OVAL 情報の収集
ディストリビューションおよびそのバージョンごとに OVAL 情報を収集する。 たとえば Ubuntu なら
$ goval-dictionary fetch-ubuntu -dbpath ~/vuls/oval.sqlite3 12 14 16 18 19
などとする。
他にも fetch-alpine
, fetch-amazon
, fetch-debian
, fetch-oracle
, fetch-redhat
, fetch-suse
といったディストリビューションに対応している。
ディストリビューション別セキュリティ情報の収集
ディストリビューション毎のセキュリティ情報の収集には gost (go-security-tracker) を使う。
gost のセットアップ
gost はソースコードのみのリリースなのでビルドを行う。
$ cd $GOPATH/src/github.com/knqyf263
$ git clone https://github.com/knqyf263/gost.git
$ cd gost/
$ make install
実行モジュールは GOPATH/bin
ディレクトリにインストールされる。
gost によるセキュリティ情報の収集
gost では redhat
, debian
, microsoft
のセキュリティ情報の収集を行う。
$ gost fetch debian --dbpath ~/vuls/gost.sqlite3
Ubuntu のセキュリティ情報収集については TODO 扱いになっているようだ。 今後に期待しよう。
Exploit 情報の収集
Exploit 情報の収集には go-exploitdb を使う。
go-exploitdb のセットアップ
go-exploitdb はソースコードのみのリリースなのでビルドを行う。
$ cd $GOPATH/src/github.com/mozqnet
$ git clone https://github.com/mozqnet/go-exploitdb.git
$ cd go-exploitdb/
$ make install
実行モジュールは GOPATH/bin
ディレクトリにインストールされる。
go-exploitdb によるセキュリティ情報の収集
go-exploitdb では awesomepoc
, exploitdb
, githubrepos
を対象に Exploit 情報の収集を行う。
$ go-exploitdb fetch exploitdb --dbpath ~/vuls/go-exploitdb.sqlite3
Vuls でローカル PC をスキャンする
さて,いよいよ Vuls を唱えるときが来た(笑)
Vuls のセットアップ
Vuls はバイナリがリリースされている。
ありがたや。
次にスキャン対象のマシンへのアクセスを定義する ~/vuls/config.toml
設定ファイルを作成する。
今回はローカル PC のみのスキャンなので以下のような記述にする。
[servers]
[servers.localhost]
host = "localhost"
port = "local"
スキャン対象は複数指定可能で,たとえば対象に ssh 接続する場合は以下のような内容になるようだ。
[servers.remotehost]
host = "remotehost"
port = "22"
user = "username"
keyPath = "/home/username/.ssh/id_rsa"
設定が正しいかどうかチェックしておこう。
$ cd ~/vuls
$ vuls configtest
[Jun 2 18:07:05] INFO [localhost] Validating config...
[Jun 2 18:07:05] INFO [localhost] Detecting Server/Container OS...
[Jun 2 18:07:05] INFO [localhost] Detecting OS of servers...
[Jun 2 18:07:05] INFO [localhost] (1/1) Detected: localhost: ubuntu 19.04
[Jun 2 18:07:05] INFO [localhost] Detecting OS of containers...
[Jun 2 18:07:05] INFO [localhost] Checking Scan Modes...
[Jun 2 18:07:05] INFO [localhost] Checking dependencies...
[Jun 2 18:07:05] INFO [localhost] Dependencies... Pass
[Jun 2 18:07:05] INFO [localhost] Checking sudo settings...
[Jun 2 18:07:05] INFO [localhost] sudo ... No need
[Jun 2 18:07:05] INFO [localhost] It can be scanned with fast scan mode even if warn or err messages are displayed due to lack of dependent packages or sudo settings in fast-root or deep scan mode
[Jun 2 18:07:05] INFO [localhost] Scannable servers are below...
localhost
んー,エラーにはなっていないみたいだし,こんな感じでいいのかな。
Vuls でローカル PC をスキャンする
configtest
も問題なさそうだし,実際にスキャンをかけてみよう。
$ cd ~/vuls
$ vuls scan
[Jun 2 20:24:26] INFO [localhost] Start scanning
[Jun 2 20:24:26] INFO [localhost] config: /home/username/vuls/config.toml
[Jun 2 20:24:26] INFO [localhost] Validating config...
[Jun 2 20:24:26] INFO [localhost] Detecting Server/Container OS...
[Jun 2 20:24:26] INFO [localhost] Detecting OS of servers...
[Jun 2 20:24:26] INFO [localhost] (1/1) Detected: localhost: ubuntu 19.04
[Jun 2 20:24:26] INFO [localhost] Detecting OS of containers...
[Jun 2 20:24:26] INFO [localhost] Checking Scan Modes...
[Jun 2 20:24:26] INFO [localhost] Detecting Platforms...
[Jun 2 20:24:27] INFO [localhost] (1/1) localhost is running on other
[Jun 2 20:24:27] INFO [localhost] Scanning vulnerabilities...
[Jun 2 20:24:27] INFO [localhost] Scanning vulnerable OS packages...
[Jun 2 20:24:27] INFO [localhost] Scanning in fast mode
One Line Summary
================
localhost ubuntu19.04 2173 installed
To view the detail, vuls tui is useful.
To send a report, run vuls report -h.
よしよし。 うまく行ったようである。
スキャン結果を簡易表示してみよう。
$ cd ~/vuls
$ vuls report -format-one-line-text
[Jun 2 20:30:18] INFO [localhost] Validating config...
[Jun 2 20:30:18] INFO [localhost] Loaded: /home/username/vuls/results/2019-06-02T20:30:15+09:00
[Jun 2 20:30:18] INFO [localhost] Validating db config...
INFO[0000] -cvedb-type: sqlite3, -cvedb-url: , -cvedb-path: /home/username/vuls/cve.sqlite3
INFO[0000] -ovaldb-type: sqlite3, -ovaldb-url: , -ovaldb-path: /home/username/vuls/oval.sqlite3
INFO[0000] -gostdb-type: sqlite3, -gostdb-url: , -gostdb-path: /home/username/vuls/gost.sqlite3
INFO[0000] -exploitdb-type: sqlite3, -exploitdb-url: , -exploitdb-path: /home/username/vuls/go-exploitdb.sqlite3
INFO[06-02|20:30:18] Opening DB. db=sqlite3
INFO[06-02|20:30:18] Migrating DB. db=sqlite3
INFO[06-02|20:30:18] Opening Database. db=sqlite3
INFO[06-02|20:30:18] Migrating DB. db=sqlite3
[Jun 2 20:30:18] INFO [localhost] OVAL is fresh: ubuntu 19.04
[Jun 2 20:30:26] INFO [localhost] localhost: 220 CVEs are detected with OVAL
[Jun 2 20:30:26] INFO [localhost] localhost: 0 CVEs are detected with CPE
[Jun 2 20:30:26] INFO [localhost] localhost: 0 CVEs are detected with GitHub Security Alerts
[Jun 2 20:30:26] INFO [localhost] localhost: 0 unfixed CVEs are detected with gost
[Jun 2 20:30:26] INFO [localhost] Fill CVE detailed information with CVE-DB
[Jun 2 20:30:27] INFO [localhost] Fill exploit information with Exploit-DB
[Jun 2 20:30:27] INFO [localhost] localhost: 13 exploits are detected
[Jun 2 20:30:27] INFO [localhost] localhost: en: 0, ja: 0 alerts are detected
One Line Summary
================
localhost Total: 220 (High:26 Medium:172 Low:22 ?:0) 0/220 Fixed 2173 installed 13 exploits en: 0, ja: 0 alerts
ありゃりゃ。 最新状態にしているにも関わらず220もひっかかるとか。
もう少し詳細に見るには TUI モードにするとよい1。
$ cd ~/vuls
$ vuls tui
うーむ。
どうも report
がまともに機能してないっぽい? これってやっぱ gost が Ubuntu に対応してないせいなのかな(状態のほぼ全てが unfixed
になっている)。
このままではちょっと使えないなぁ。 しょうがない。 少しずつ調べてみるか。
今回はここまで。
ブックマーク
- あなたのサーバは本当に安全ですか?今もっともイケてる脆弱性検知ツールVulsを使ってみた - Qiita
- FutureVuls(脆弱性管理サービス) Advent Calendar 2018 - Qiita
- Tutorial - Local Scan Mode · Vuls
- 脆弱性検知ツールVulsの、きちんと動く構築手順
-
TUI モードを終了するには
ctrl+c
を入力すれば良い。 ↩︎