脆弱性検知ツールVulsの、きちんと動く構築手順
脆弱性検知ツールである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
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 12月 31 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 12月 31 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 12月 31 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 12月 31 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
[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
[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行目を以下のように応急処置してやると、とりあえず値が取得できるようになります。
// 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を導入するなり、他の方法も考慮する必要がありそうです。
以上です。
リンク
- Vuls: VULnerability Scanner (Github: https://github.com/future-architect/vuls)
- go-cve-dictionary (https://github.com/vulsio/go-cve-dictionary)
- goval-dictionary (https://github.com/vulsio/goval-dictionary)
- gost (go-security-tracker) (https://github.com/vulsio/gost)
- go-exploitdb (https://github.com/vulsio/go-exploitdb)
- VulsRepo (https://github.com/usiusi360/vulsrepo.git)
Discussion