💎

脆弱性検知ツールVulsを構築する

2023/04/30に公開

はじめに

ここではOSSの脆弱性検知ツール「Vuls」の構築手順を記録します。
VMwareの仮想マシンにインストールされたUbuntuにVulsを構築します。
今回はVulsの概要についてと、Vulsの構築、そしてVulsの拡張機能Vuls Repoの構築までを記載します。
次回は拡張機能vuls_autoscan_for_zabbixを使ってZabbixと連携する方法について記載していきます。
仮想マシンの作成やUbuntuのインストール手順、Vulsの詳細な機能や使用方法については記載しません。
UbuntuのバージョンはUbuntu-22.04-live-server-amd64です。

Vulsの概要

Vulsはフューチャーアーキテクトの神戸 康多氏と林 優二郎氏によって開発された神ツールで、インフラエンジニアの最もめんどくさい「月一の脆弱性チェック」を自動化できるプログラムです。
Vuls概要
主にリモートスキャンによって、管理下のサーバの脆弱性を確認することができます。
リモートスキャンモード
最終的にZabbixとの連携を行って、次のような仕組みを構築します。この部分については次回に分けて記載します。
Zabbixとの連携

Vulsの構築

まずアップデートしておきます。

$ sudo apt update

Vulsのためのユーザを作成します。

$ sudo adduser vulsuser

作成したユーザをsudoersに追加します。まず編集前のsudoersファイルを退避させます。

$ sudo cp /etc/sudoers /etc/sudoers.org

sudoersファイルを編集します。最後に編集内容をdiffで示しています。

$ sudo visudo
$ sudo diff /etc/sudoers /etc/sudoers.org
51d50
< vulsuser ALL=(ALL) ALL

ここからはVuls用ユーザで作業を進めていきます。

$ su – vulsuser

ライブラリのインストール

この後必要になる、SQLite3 git gcc GNUmakeライブラリとcurlをインストールします。

$ sudo apt-get install sqlite git gcc make curl

Vulsログディレクトリの作成

Vuls用のログディレクトリとログファイルを用意します。

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

GO言語のインストール

GO言語の最新バージョンをインストールします。(作業時点では1.19でした)
まずダウンロードして、解凍します。

$ curl -LO https://go.dev/dl/go1.19.1.linux-amd64.tar.gz
$ sudo tar -C /usr/local -xzf go1.19.1.linux-amd64.tar.gz

golang用のディレクトリを作成します。

$ mkdir $HOME/go

環境変数に追加します。まず元の.bashrcファイルを退避させます。

$ cp .bashrc .bashrc.org

.bashrcを編集します。編集内容をdiffで示しています。

$ vi .bashrc
$ diff .bashrc .bashrc.org
118,120d117
< export GOROOT=/usr/local/go
< export GOPATH=$HOME/go
< export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

適用と確認を行います。これでインストールは完了です。

$ source .bashrc
$ go version
go version go1.19.1 linux/amd64

脆弱性データベースの構築

はじめに、脆弱性情報をインポートするためのディレクトリを作成します。

$ mkdir -p $GOPATH/src/github.com/vulsio

go-cve-dictionary

次に、NVD・JVNデータベースの情報を取得するためのライブラリgo-cve-dictionaryをデプロイします。
先ほど作成したディレクトリに移動します。

$ cd $GOPATH/src/github.com/vulsio

vulsioのGitHubからクローンします。

~/go/src/github.com/vulsio$ git clone https://github.com/vulsio/go-cve-dictionary.git

作成されたディレクトリに移動します。

~/go/src/github.com/vulsio$ cd go-cve-dictionary

インストールを実行したあと、ホームディレクトリに戻ります。

~/go/src/github.com/vulsio/go-cve-dictionary$ make install
~/go/src/github.com/vulsio/go-cve-dictionary$ cd $HOME

NVDデータベース

go-cve-dictionaryを使用して、NVDの脆弱性データベースをインポートします。

$ go-cve-dictionary fetch nvd

1.2GBのデータが投入されたことが確認できます。

$ ls -alh cve.sqlite3
-rw-r—r—1 vulsuser vulsuser 1.2G 9 26 12:59 cve.sqlite3

JVNデーターベース

go-cve-dictionaryを使用して、JVNの脆弱性データーベースをインポートします。

$ go-cve-dictionary fetch jvn

データが増加していることが確認できます。

$ ls -alh cve.sqlite3
-rw-r—r—1 vulsuser vulsuser 1.5G 9 26 12:59 cve.sqlite3

goval-dictionary

OVALデータベースの情報を取得するためのライブラリgoval-dictionaryをデプロイします。
OVALはLinuxディストリビューションに関する脆弱性情報のデータベースです。
インストールまでは先述の手順と同様に進めます。

$ cd $GOPATH/src/github.com/vulsio
~/go/src/github.com/vulsio$ git clone https://github.com/vulsio/goval-dictionary.git
~/go/src/github.com/vulsio$ cd goval-dictionary
~/go/src/github.com/vulsio/goval-dictionary$ make install

ホームディレクトリ直下にシンボリックリンクを作成します。

~/go/src/github.com/vulsio/goval-dictionary$ ln -s $GOPATH/src/github.com/vulsio/goval-dictionary/oval.sqlite3 $HOME/oval.sqlite3

OVALデータベース

スキャン対象サーバのLinuxディストリビューション、OSバージョンに基づいて、任意の脆弱性情報をインポートします。ここでは「Ubuntu 20」と「RedHat 7」のデータを指定しています。

~/go/sec/github.com/vulsio/goval-dictionary$ goval-dictionary fetch ubuntu 20
~/go/sec/github.com/vulsio/goval-dictionary$ goval-dictionary fetch redhat 7
~/go/sec/github.com/vulsio/goval-dictionary$ cd $HOME

gost

gostデータベースの情報を取得するためのライブラリgostをデプロイします。
gostはLinuxディストリビューションのセキュリティトラッカーに関する情報データベースです。
これも同様の手順で進めます。

$ cd $GOPATH/src/github.com/vulsio
~/go/src/github.com/vulsio$ git clone https://github.com/vulsio/gost.git
~/go/src/github.com/vulsio$ cd gost
~/go/src/github.com/vulsio/gost$ make install

シンボリックリンクを作成します。

~/go/src/github.com/vulsio/gost$ ln -s $GOPATH/src/github.com/vulsio/gost/gost.sqlite3 $HOME/gost.sqlite3

gostデータベース

スキャン対象のLinuxディストリビューションに基づいて脆弱性情報をインポートします。

~/go/src/github.com/vulsio/gost$ gost fetch ubuntu
~/go/src/github.com/vulsio/gost$ gost fetch redhat
~/go/src/github.com/vulsio/gost$ cd $HOME

go-exploitdb

exploitデータベースの情報を取得するためのライブラリgo-exploitdbをデプロイします。
まずログディレクトリを作成します。

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

ディレクトリを移動します。ここからは同様の手順です。

$ cd $GOPATH/src/github.com/vulsio
~/go/src/github.com/vulsio$ git clone https://github.com/vulsio/go-exploitdb.git
~/go/src/github.com/vulsio$ cd go-exploitdb
~/go/src/github.com/vulsio/go-exploitdb$ make install
~/go/src/github.com/vulsio/go-exploitdb$ ln -s $GOPATH/src/github.com/vulsio/go-exploitdb/go-exploitdb.sqlite3 $HOME/go-exploitdb.sqlite3

exploitデータベース

データベースoffensive security exploit db Awesome Poc github repos inTheWild Pocを全てインポートします。

~/go/src/github.com/vulsio/go-exploitdb$ go-exploitdb fetch exploitdb
~/go/src/github.com/vulsio/go-exploitdb$ go-exploitdb fetch awesomepoc
~/go/src/github.com/vulsio/go-exploitdb$ go-exploitdb fetch githubrepos
~/go/src/github.com/vulsio/go-exploitdb$ go-exploitdb fetch inthewild
~/go/src/github.com/vulsio/go-exploitdb$ cd $HOME

go-msfdb

msfデータベースの情報を取得するためのライブラリgo-msfdbをデプロイします。
同様にログディレクトリを作成してから進めます。

$ sudo mkdir /var/log/go-msfdb
$ sudo chown vulsuser /var/log/go-msfdb
$ sudo chmod 700 /var/log/go-msfdb
$ cd $GOPATH/src/github.com/vulsio
~/go/src/github.com/vulsio$ git clone https://github.com/vulsio/go-msfdb.git
~/go/src/github.com/vulsio$ cd go-msfdb
~/go/src/github.com/vulsio/go-msfdb$ make install
~/go/src/github.com/vulsio/go-msfdb$ ln -s $GOPATH/src/github.com/vulsio/go-msfdb/go-msfdb.sqlite3 $HOME/go-msfdb.sqlite3

msfデータベース

msfデータベースをインポートします。

~/go/src/github.com/vulsio/go-msfdb$ go-msfdb fetch msfdb
~/go/src/github.com/vulsio/go-msfdb$ cd $HOME

go-kev

kevulnデータベースの情報を取得するためのライブラリgo-kevをデプロイします。
kevulnは悪用された既知の脆弱性情報に関するデータベースです。

$ sudo mkdir /var/log/go-kev
$ sudo chown vulsuser /var/log/go-kev
$ sudo chmod 700 /var/log/go-kev
$ cd $GOPATH/src/github.com/vulsio
~/go/src/github.com/vulsio$ git clone https://github.com/vulsio/go-kev.git
~/go/src/github.com/vulsio$ cd go-kev
~/go/src/github.com/vulsio/go-kev$ make install
~/go/src/github.com/vulsio/go-kev$ ln -s $GOPATH/src/github.com/vulsio/go-kev/go-kev.sqlite3 $HOME/go-kev.sqlite3

kevulnデータベース

悪用された既知の脆弱性情報をインポートします。

~/go/src/github.com/vulsio/go-kev$ go-kev fetch kevuln
~/go/src/github.com/vulsio/go-kev$ cd $HOME

go-cti

cyber threat intelligenceデータベースの情報を取得するためのライブラリgo-ctiをインストールします。

$ sudo mkdir /var/log/go-cti
$ sudo chown vulsuser /var/log/go-cti
$ sudo chmod 700 /var/log/go-cti
$ cd $GOPATH/src/github.com/vulsio
~/go/src/github.com/vulsio$ git clone https://github.com/vulsio/go-cti.git
~/go/src/github.com/vulsio$ cd go-cti
~/go/src/github.com/vulsio/go-cti$ make install
~/go/src/github.com/vulsio/go-cti$ ln -s $GOPATH/src/github.com/vulsio/go-cti/go-cti.sqlite3 $HOME/go-cti.sqlite3

cyber threat intelligenceデータベース

cyber threat intelligenceデータベースをインポートします。

~/go/src/github.com/vulsio/go-cti$ go-cti fetch threat
~/go/src/github.com/vulsio/go-cti$ cd $HOME

Vulsのインストール

Vuls本体をインポートします。まずVuls用のディレクトリを作成します。

$ mkdir -p $GOPATH/src/github.com/future-architect

future-architectのgit-hubからクローンしてインストールします。

$ cd $GOPATH/src/github.com/future-architect
~/go/src/github.com/future-architect$ git clone https://github.com/future-architect/vuls.git
~/go/src/github.com/future-architect$ cd vuls
~/go/src/github.com/future-architect/vuls$ make install

ホームディレクトリに戻って、Vulsバージョンを確認します。

~/go/src/github.com/future-architect/vuls$ cd $HOME
$ vuls -v
vuls-v0.20.4-build-20221002_171325_6963442

以上でVulsのインストールが正常に完了しました。

ローカルスキャン

Vulsのインストールが完了したので、まずはローカル内のスキャンを試してみます。
スキャンするホストはホームディレクトリにconfig.tomlを作成して設定します。

$ vi config.toml
[servers]
[servers.localhost]
host = “localhost”
port = “local”

スキャンを実行する

スキャンの前に、config.tomlの構文チェックを行います。

$ vuls configtest

localhostに対してスキャンを行います。

$ vuls scan localhost

レポートを出力します。

$ vuls report -format-list -lang ja

リモートスキャン

Vulsサーバ上でキーペアを作成します。

$ ssh-keygen -t ed25519 -f key
$ mv key key.pub ~/.ssh/.

先ほど作成したキーペアの公開鍵を、スキャン対象のリモートホストに送信します。

$ ssh-copy-id -i ~/.ssh/key.pub user@{スキャン対象サーバ}

初回はスキャン対象ホストに手動でSSH接続します。以降はscanコマンドを実行するだけで自動で接続されます。

$ ssh user@{スキャン対象サーバ} -i ~/.ssh/key.pem
$ vi config.toml
[servers]
[servers.name1]
host = "{スキャン対象サーバ}"
port = "22"
user = "xxxxx"
keyPath = "/home/vulsuser/.ssh/xxxxx"

スキャンを実行する

$ vuls configtest
$ vuls scan name1
$ vuls report -format-list -lang ja

Vuls Repo

レポート結果をブラウザからGUIで見るためにVuls Repoをインストールします。

$ git clone https://github.com/ishiDACo/vulsrepo.git
$ cd $HOME/vulsrepo/server
~vulsrepo/server$ cp vulsrepo-config.toml.sample vulsrepo-config.toml
~vulsrepo/server$ vi vulsrepo-config.toml
[server]
rootPath = “/home/vulsuser/vulsrepo”
resultsPath = “/home/vulsuser/results”
serverPort = “5111”

Vuls Repoを起動させます。

~vulsrepo/server$ ./vulsrepo-server

ブラウザでhttp://{YOUR VULS SERVER}:5111にアクセスすると、GUIレポートを確認できます。
Ctrl + cvulsrepo-serverの実行を終了してから、ホームディレクトリに戻ります。

~vulsrepo/server$ cd $HOME

vulsrepo-serverのデーモン化

$ sudo cp $HOME/vulsrepo/server/scripts/vulsrepo.service /lib/systemd/system/vulsrepo.service
$ sudo vi /lib/systemd/system/vulsrepo.service
$ diff /lib/systemd/system/vulsrepo.service $HOME/vulsrepo/ser
ver/scripts/vulsrepo.service
6c6
< ExecStart = /home/vulsuser/vulsrepo/server/vulsrepo-server
---
> ExecStart = /home/vuls-user/vulsrepo/server/vulsrepo-server
11,12c11,12
< User = vulsuser
< Group = vulsuser
---
> User = vuls-user
> Group = vuls-group
$ sudo systemctl enable vulsrepo
$ sudo systemctl list-unit-files --type=service | grep vulsrepo
$ sudo systemctl start vulsrepo

サーバに接続してコマンドを実行しなくても、いつでもブラウザでhttp://{YOUR VULS SERVER}:5111にアクセスすることができます。

$ cd $HOME

次回 Zabbixとの連携

ここまでで、Vulsの基本的な構築が完了しました。
次回はZabbixと連携する手順を記載します。
https://zenn.dev/malwarekiddy/articles/0a2f8cc9f9a94d

Discussion