VulsをCloud Shellで使ってみた

# Vuls とは
Vulsは脆弱性検知ツールです。
結構前から知っていたのですが使ったことはなかったので この機会に使ってみました。
自分のローカルマシンでやっても良かったのですが 僕は普段GCPを使っているのでCloud Shellで試してみました。

# Cloud Shell とは
GCPについてるサービスでLinuxのインスタンスを無料で使えます。
無料で使えるので接続がないとシャットダウンさてたり外に公開できるポートなど限られていますが作業用のマシンとしては何も困らないので大丈夫です。
またVulsをビルドするために必要なGoなども標準でセットアップされています。

Cloud Shellは右上のアイコンをクリックすることで接続できます。

<img width="688" alt="スクリーンショット 2016-12-21 2.21.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/15818/72954627-1273-12da-de31-62ebc534deda.png">


# Vuls のインストール

Cloud Shellにアクセスしたらまずは以下のコマンドでGOPATHを設定しておきましょう。

```bash
$ echo "export GOPATH=$HOME" >> ~/.bashrc
$ source ~/.bashrc
```

まずgo-cve-dictionaryをインストールしてNVDから脆弱性データベースを取得します。

現在のgo-cve-dictionaryはgo getだけではインストールできなかったのでglideをインストールします。

```bash
$ 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本体のインストールをします。

```bash
$ 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`ディレクトリを作ってその下で行います。

```bash
$ mdkir ~/vuls && cd ~/vuls
$ for i in {2002..2016}; do go-cve-dictionary fetchnvd -years $i; done
```

数分掛かるのでコーヒーでも飲みながら待ちましょう☕
取得ができると以下の３つのファイルができていると思います。

```bash
$ ls
cve.sqlite3  cve.sqlite3-shm  cve.sqlite3-wal
```

# スキャン

設定ファイルを書く前にローカルにsshできるようにしておきます。

```bash
$ ssh-keygen -t rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
```

sshができるか確認しておきましょう。
僕の環境はユーザー名が`k2_wanko`ですので 試す時は自分のユーザー名に読み替えてください。

```bash
$ ssh k2_wanko@localhost
$ exit
```

次に設定ファイルを書きます。
`vuls/`ディレクトリに`config.toml`を作成します。

```toml:config.toml
[servers]
[servers.localhost]
host    = "localhost"
port    = "22"
user    = "k2_wanko"
keyPath = "/home/k2_wanko/.ssh/id_rsa"
```

作成したら以下のコマンドでテストします。

```bash
$ vuls configtest
```

設定ファイルに問題がなければ以下のコマンドでスキャンの準備をします。

```bash
$ vuls prepare
```

そして以下のコマンドでスキャンができます。

```bash
$ 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もスキャンしてみるとかも面白そうだなと思いました。