Vuls とは
Vulsは脆弱性検知ツールです。
結構前から知っていたのですが使ったことはなかったので この機会に使ってみました。
自分のローカルマシンでやっても良かったのですが 僕は普段GCPを使っているのでCloud Shellで試してみました。
Cloud Shell とは
GCPについてるサービスでLinuxのインスタンスを無料で使えます。
無料で使えるので接続がないとシャットダウンさてたり外に公開できるポートなど限られていますが作業用のマシンとしては何も困らないので大丈夫です。
またVulsをビルドするために必要なGoなども標準でセットアップされています。
Cloud Shellは右上のアイコンをクリックすることで接続できます。
Vuls のインストール
Cloud Shellにアクセスしたらまずは以下のコマンドでGOPATHを設定しておきましょう。
$ echo "export GOPATH=$HOME" >> ~/.bashrc
$ source ~/.bashrc
まずgo-cve-dictionaryをインストールしてNVDから脆弱性データベースを取得します。
現在のgo-cve-dictionaryはgo getだけではインストールできなかったのでglideをインストールします。
$ go get -v github.com/Masterminds/glide
$ mkdir -p src/github.com/kotakanbe && cd src/github.com/kotakanbe
$ git clone https://github.com/kotakanbe/go-cve-dictionary.git && cd go-cve-dictionary
$ glide install && go get -v .
次にvuls本体のインストールをします。
$ mkdir -p ~/src/github.com/future-architect && cd ~/src/github.com/future-architect
$ git clone https://github.com/future-architect/vuls.git && vuls
$ glide install && go get -v .
インストールができたらデータベースを取得します。
作業はvuls
ディレクトリを作ってその下で行います。
$ mdkir ~/vuls && cd ~/vuls
$ for i in {2002..2016}; do go-cve-dictionary fetchnvd -years $i; done
数分掛かるのでコーヒーでも飲みながら待ちましょう☕
取得ができると以下の3つのファイルができていると思います。
$ ls
cve.sqlite3 cve.sqlite3-shm cve.sqlite3-wal
スキャン
設定ファイルを書く前にローカルにsshできるようにしておきます。
$ ssh-keygen -t rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
sshができるか確認しておきましょう。
僕の環境はユーザー名がk2_wanko
ですので 試す時は自分のユーザー名に読み替えてください。
$ ssh k2_wanko@localhost
$ exit
次に設定ファイルを書きます。
vuls/
ディレクトリにconfig.toml
を作成します。
[servers]
[servers.localhost]
host = "localhost"
port = "22"
user = "k2_wanko"
keyPath = "/home/k2_wanko/.ssh/id_rsa"
作成したら以下のコマンドでテストします。
$ vuls configtest
設定ファイルに問題がなければ以下のコマンドでスキャンの準備をします。
$ vuls prepare
そして以下のコマンドでスキャンができます。
$ vuls scan -cve-dictionary-dbpath=$PWD/cve.sqlite3 -report-json
INFO[0000] Start scanning
INFO[0000] config: /home/k2_wanko/vuls/config.toml
INFO[0000] cve-dictionary: /home/k2_wanko/vuls/cve.sqlite3
[Dec 21 03:29:12] INFO [localhost] Validating Config...
[Dec 21 03:29:12] INFO [localhost] Detecting Server/Contianer OS...
[Dec 21 03:29:12] INFO [localhost] Detecting OS of servers...
[Dec 21 03:29:12] INFO [localhost] (1/1) Detected: localhost: debian 8.6
[Dec 21 03:29:12] INFO [localhost] Detecting OS of containers...
[Dec 21 03:29:12] INFO [localhost] Checking sudo configuration...
[Dec 21 03:29:17] INFO [localhost] sudo ... OK
[Dec 21 03:29:17] INFO [localhost] Detecting Platforms...
[Dec 21 03:29:18] INFO [localhost] (1/1) localhost is running on other
[Dec 21 03:29:18] INFO [localhost] Scanning vulnerabilities...
[Dec 21 03:29:18] INFO [localhost] Check required packages for scanning...
[Dec 21 03:29:18] INFO [localhost] Open boltDB: /home/k2_wanko/vuls/cache.db
[Dec 21 03:29:18] INFO [localhost] Scanning vulnerable OS packages...
[Dec 21 03:29:18] INFO [localhost] apt-get update...
[Dec 21 03:29:38] INFO [localhost] Fetching CVE details...
[Dec 21 03:29:38] INFO [localhost] Done
[Dec 21 03:29:38] INFO [localhost] Scanning vulnerable software specified in the CPE...
[Dec 21 03:29:38] INFO [localhost] Reporting...
localhost (debian8.6)
=====================
No unsecure packages.
というわけで Cloud Shell自体には脆弱性のあるパッケージは見つかりませんでした。
注意点
Cloud Shellは長いこと接続しないとデータが消されます。
消される前に警告メールが来るのでその時にアクセスすれば大丈夫です。
まとめ
ほぼ公式ドキュメントをなぞるだけになってしまったのですが
試してみて色々気づけたこともあるので卒業が確定したらコードを追ってみたいと思います。
とりあえずGCPで実用的に使うにはCompute Engineをスキャンでしょうか。
あとはKubernetesもスキャンしてみるとかも面白そうだなと思いました。