🎍

脆弱性検知ツールVulsの、きちんと動く構築手順

2022/01/01に公開

脆弱性検知ツールであるVuls OSS版の最新の構築手順をまとめたものです。

他のサイトでも類似の情報は見つかりますが、

  • IPA(情報処理推進機構)の資料が古く最新版の挙動を反映していない
  • ググって見つかる情報も古く、そのままだと動かない

が現状だったので、個人的に調べて手順書の形で、まとめてみました。
内容的には個人的メモですが、構築手順として使えると思います(※使えなくてもそっと見守ってください)。

内容は、概要、インストール手順、基本的な使い方、使用してみての感想、です。
正直、ツールでの検知・管理は限界がある気がしますが、一応は調べたので記しておきます。

なぜ脆弱性検知ツール?

社内にサーバーが複数(というかたくさん)あると、どのサーバーの何のソフトウェアにどんな脆弱性があるのか、手動で管理するのは大変なので、ツールで自動化できたら運用負荷が軽減できそうです。

最初、NVD[1]やJVN iPedia[2]などの公開情報からデータを取得・検索するツールを作らないといけないのか…と思ってましたが(大変そう)、VulsというツールがOSSで公開されていました(商用版もある)。

Vulsとは

フューチャー株式会社が開発している脆弱性検知ツールです。OSS版はサポートがなく使用も自己責任ですが、商用版もあり、そちらはWebポータル画面があったり、チケット管理ができたり、Windowsも対象OSに含まれています。詳細は、公式サイトをどうぞ。

詳細はドキュメントを参照して頂きたいですが、特徴として、

  • 脆弱性情報の収集と検知を自動化
  • エージェントレス
  • 複数OSをサポート(OSS版ではWindowsは対象外)

があります。
エージェントレスなのは、嬉しいですね。

今回は、OSS版を試します。
Dockerでも可能ですが、今回は普通にインストールします。

環境

環境とバージョンは以下の通りです。

  • CentOS Stream release 8
  • go version go1.17.2 linux/amd64
  • go-cve-dictionary v0.8.1 473b08f
  • goval-dictionary v0.6.0 ae43270
  • gost v0.4.0 77f140a
  • go-exploitdb v0.4.1 ae0f310
  • vuls-v0.19.0-build-20211231_180944_bb4a1ca

インストール

ユーザー追加

vulsuserユーザーを追加し、パスワードを設定。

# ユーザー追加
$ useradd vulsuser

# パスワード設定
$ passwd vulsuser

visudoでsudoができるようにする

## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
vulsuser ALL=(ALL)       ALL #コレを追加

前提ツールを入れる

SQLite3、Git、GCC、GNU Make、wget、yum-utils、Golangが必要なので入れます。

sudo dnf install sqlite git gcc make yum-utils golang

Go言語の設定

goenv.shを作成し、以下のように追記。

$ mkdir $HOME/go/
$ sudo vi /etc/profile.d/goenv.sh
/etc/profile.d/goenv.sh
export GOROOT=/usr/lib/golang/
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin 

反映します。

 source /etc/profile.d/goenv.sh 

go-cve-dictionaryインストール

vuls用ログフォルダを作成し、ユーザーと権限を変更。

$ sudo mkdir /var/log/vuls
$ sudo chown vulsuser /var/log/vuls
$ sudo chmod 700 /var/log/vuls

Githubから落とし、

$ mkdir -p $GOPATH/src/github.com/kotakanbe
$ cd /home/vulsuser/go/src/github.com/kotakanbe/
$ git clone https://github.com/kotakanbe/go-cve-dictionary.git 

インストール。

$ cd go-cve-dictionary
$ make install

$GOPATH/binにgo-cve-dictionaryが作成されていることを確認します。

バージョンの確認は以下のコマンドで。

$ go-cve-dictionary version

脆弱性情報を取得

JVNから取得

$ cd $HOME
$ go-cve-dictionary fetch jvn

NVDから取得

$ go-cve-dictionary fetch nvd

sqliteデータベースの日付と容量が変わってますね。

[vulsuser@localhost ~]$ ls -lh
(省略)
-rw-r--r--. 1 vulsuser vulsuser 1.4G 1231 17:08 cve.sqlite3

goval-dictionaryインストール

OVAL情報を取得するためのツールです。今回はCentOS Stream 8なので、RedHatのOVAL情報を取得します。

Githubから落として、

$ cd $GOPATH/src/github.com/kotakanbe  
$ git clone https://github.com/kotakanbe/goval-dictionary.git  

インストールします。

$ cd goval-dictionary
$ make install 

$GOPATH/bin/goval-dictionaryができていることを確認

バージョン確認は、以下のようにします。

$ goval-dictionary version

OVALを取得。

$ cd $HOME
$ goval-dictionary fetch redhat 8

OVALのsqliteデータベースが作成されています。

[vulsuser@localhost ~]$ ls -lh
(省略)
-rw-r--r--. 1 vulsuser vulsuser 3.7M 1231 17:21 oval.sqlite3

gostインストール

脆弱性情報を取得するためのツールです。

ログ用フォルダを作成。

$ sudo mkdir /var/log/gost
$ sudo chown vulsuser /var/log/gost
$ sudo chmod 700 /var/log/gost 

Githubから落とします。

$ mkdir -p $GOPATH/src/github.com/vulsio
$ cd $GOPATH/src/github.com/vulsio
$ git clone https://github.com/vulsio/gost.git

インストール。

$ cd gost
$ make install

$GOPATH/bin/gostがあることを確認します。

バージョン確認は以下のように。

$ gost version

gostでRedHatの脆弱性情報を取得

以下のコマンドを実行。

$ gost fetch redhat

gost.sqlite3ができています。

[vulsuser@localhost ~]$ ls -lh
(省略)
-rw-r--r--. 1 vulsuser vulsuser  77M 1231 17:44 gost.sqlite3

go-exploitdbインストール

攻撃用コードのデータベースであるExploit DBから情報を取得するツールです。

ログフォルダ作成。

$ sudo mkdir /var/log/go-exploitdb
$ sudo chown vulsuser /var/log/go-exploitdb
$ sudo chmod 700 /var/log/go-exploitdb

Githubから落とします。

$ cd $GOPATH/src/github.com/vulsio
$ git clone https://github.com/vulsio/go-exploitdb.git

インストール。

$ cd go-exploitdb 
$ make install  

$GOPATH/bin/go-exploitdbができていることを確認します。

データを取得。

$ cd $HOME
$ go-exploitdb fetch exploitdb

go-exploitdb.sqlite3ができています。

[vulsuser@localhost ~]$ ls -lh
(省略)
-rw-r--r--. 1 vulsuser vulsuser  20M 1231 18:03 go-exploitdb.sqlite3

Vulsインストール

Githubから落とす。

$ mkdir -p $GOPATH/src/github.com/future-architect
$ cd $GOPATH/src/github.com/future-architect 
$ git clone https://github.com/future-architect/vuls.git 

インストールします。

$ cd vuls
$ make install

$GOPATH/bin/vulsがあることを確認。

$ vuls -v

インストール完了です。

ローカルスキャンしてみる

文字通り、Vulsがインストールされているサーバーをスキャンします。

config.tomlを編集します。

$ cd $HOME
$ vi config.toml
config.toml
[servers.localhost]
host  =  "localhost"
port  =  "local"

vuls configtestで設定を確認できます。

vulsuser@localhost ~]$ vuls configtest
[Dec 31 18:19:44]  INFO [localhost] vuls-v0.19.0-build-20211231_180944_bb4a1ca
[Dec 31 18:19:44]  INFO [localhost] Validating config...
[Dec 31 18:19:44]  INFO [localhost] Detecting Server/Container OS... 
[Dec 31 18:19:44]  INFO [localhost] Detecting OS of servers... 
[Dec 31 18:19:44]  INFO [localhost] (1/1) Detected: localhost: centos 8
[Dec 31 18:19:44]  INFO [localhost] Detecting OS of containers... 
[Dec 31 18:19:44]  INFO [localhost] Checking Scan Modes...
[Dec 31 18:19:44]  INFO [localhost] Checking dependencies...
[Dec 31 18:19:44]  INFO [localhost] Dependencies ... Pass
[Dec 31 18:19:44]  INFO [localhost] Checking sudo settings...
[Dec 31 18:19:44]  INFO [localhost] Sudo... Pass
[Dec 31 18:19:44]  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
[Dec 31 18:19:44]  INFO [localhost] Scannable servers are below...
localhost 
[vulsuser@localhost ~]$ 

vuls scanでスキャンできます。

[vulsuser@localhost ~]$ vuls scan
[Jan  1 09:50:30]  INFO [localhost] vuls-v0.19.0-build-20211231_180944_bb4a1ca
[Jan  1 09:50:30]  INFO [localhost] Start scanning
・
(略)
・

Scan Summary
================
localhost	centos8	1389 installed, 0 updatable

Warning: [Standard OS support is EOL(End-of-Life). Purchase extended support if available or Upgrading your OS is strongly recommended.]

環境はCentOS Strem 8ですが、CentOS 8として認識されているようですね。

vuls tuiで、TUI形式(Text User Interface)で脆弱性情報を確認できます。移動はtabでできます。

VulsRepoを使ってみる

さらに便利そうなWebインタフェースがある!……と思いきや、原作者の方のリポジトリはメンテされておらず、現在は別の方がメンテナーです。

https://vuls.io/docs/en/vulsrepo.html

Caution usiusi360/vulsrepo is NOT maintained anymore.
You should use maintained repository: ishiDACo/vulsrepo

$ cd $HOME
# Githubから取得
$ git clone https://github.com/ishiDACo/vulsrepo.git
$ cd $HOME/vulsrepo/server

vulsrepo-config.toml.sampleからvulsrepo-config.tomlを作成して、編集します。

$ cp vulsrepo-config.toml.sample vulsrepo-config.toml
vulsrepo-config.toml
[Server]
rootPath = "/home/vulsuser/vulsrepo"
resultsPath = "/home/vulsuser/results"
serverPort = "5111" 

指定したポート番号でFWの穴を開けます。

$ sudo firewall-cmd --add-port=5111/tcp --zone=public --permanent
$ sudo firewall-cmd --reload

JavaScriptを少し修正

バージョンの齟齬のせいかは分かりませんが、このままだとCVSS Scoreが全てnullかunknownで取得されてしまい、使えません。
$HOME/vulsrepo/dist/js/vulsrepo.jsの1451行目を以下のように応急処置してやると、とりあえず値が取得できるようになります。

vulsrepo.js
// result["CVSS Score"] = cveContent.cvss3Score.toFixed(1);
result["CVSS Score"] = parseFloat(cveContent.cvss3Score.toFixed(1));

VulsRepoにアクセスしてみる

スキャンして、JSONの結果を出力します。

$ vuls scan
$ vuls report -format-json

/home/vulsuser/results/に結果が出力されます。

サーバーを起動してやります。

$ cd $HOME/vulsrepo2/vulsrepo/server/
$ ./vulsrepo-server

ブラウザで、以下のアドレスにアクセス。
http://[ipaddress]:5111

うまく出力してくれていますね(おそらく)。

リモートスキャン

リモートのUbuntu 20.04LTSに対してスキャンしてみます。

前提として、リモートのサーバーにsudo権限のあるユーザーとしてscanuserを作成します。
Vulsはパスワード認証は対応していないため、公開鍵認証方式を使用します。

IPAの資料の「4.7.2. Remote Scan Mode」の手順をそのまま実行するだけですが、ubuntuのOVALデータを取得するので、スキャンの前に以下を実行してあげます。

$ goval-dictionary fetch ubuntu 20

150個ありますね。。。

他にも、cronでスキャンを自動化させたり、メールで通知したりもしてみたいですが、長くなるのでとりあえずここまでにします。

所感

  • パッケージ以外の方法でインストールしたものはスキャンの対象外なので、用途が限定される気がする(Linuxだとそういう場面が多いかも)。 間違いでした。CPEとして設定で登録することで対応できるようです(Scan vulnerabilities of non-OS packages)。
  • 脆弱性が見つかったところで、単純にアップデートすればよいわけでもない(他に影響がある場合があるから)。運用負荷軽減の効果があるかは、何とも言いにくい。
  • 本ツールだけで脆弱性検知・管理が飛躍的に効率化できる…かは、運用次第かも。

多層防御なり、WebアプリならWAFを導入するなり、他の方法も考慮する必要がありそうです。

以上です。

リンク

IPAによる資料

脚注
  1. National Vulnerability Database. NIST(National Institute of Standards and Technology: アメリカ国立標準技術研究所)が運営する、脆弱性情報のデータベース。 ↩︎

  2. IPAが運営している(たぶんJPCERT/CCも)脆弱性対策情報のデータベース。 ↩︎

Discussion