脆弱性検知ツールVulsを構築する
はじめに
ここでは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はフューチャーアーキテクトの神戸 康多氏と林 優二郎氏によって開発された神ツールで、インフラエンジニアの最もめんどくさい「月一の脆弱性チェック」を自動化できるプログラムです。
主にリモートスキャンによって、管理下のサーバの脆弱性を確認することができます。
最終的に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 + c
でvulsrepo-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と連携する手順を記載します。
Discussion