vuls on Azure 簡易チュートリアル

# はじめに
vuls ご本家のサイトを拝見すると AWS でのデプロイ方法がチュートリアルとして書かれており、Azure でも使えるツールなのにチュートリアルで特定してしまうと、誤解されてしまい Azure での利用がされないことにつながるのは少し勿体ないなと感じていました。
既に Azure 上で動作させるように確認している先駆者の方もいらっしゃるようだったので、検証作業の内容を備忘録がてら残しておきます。

ご本家にReadmeの日本語版のプルリクエスト出すほどの内容でもないので記事としておいておきますのでご意見あればコメントお願いいたします。

まずは vuls が入ったサーバーのローカルでのスキャンを確認しています。

# Tutorial (Azure の場合)

1. Tutorial: Local Scan Mode
      - Launch CentOS on Azure
      - Deploy Vuls
      - Scan localhost, Reportingv
1. Tutorial: Remote Scan Mode
      - Launch Ubuntu Linux on Azure
      - このUbuntuを先程セットアップしたVulsからスキャンする

----

# Tutorial: Local Scan Mode

本チュートリアルでは、Microsoft Azure に Vuls をセットアップし、自分に存在する脆弱性をスキャンする方法を説明する。
手順は以下の通り

1. CentOSを新規作成
1. 必要なソフトウェアをインストール
1. go-cve-dictionaryをデプロイ
1. goval-dictionaryをデプロイ
1. Vulsをデプロイ
1. 設定
1. 設定ファイルと、スキャン対象サーバの設定のチェック
1. Scan
1. Reporting
1. TUI(Terminal-Based User Interface)で結果を参照する
1. Web UI([VulsRepo](https://github.com/usiusi360/vulsrepo))で結果を参照する

## Step1. Launch CentOS7

- Azure の場合は[Azure VM のセキュリティのベスト プラクティス](https://docs.microsoft.com/ja-jp/azure/security/azure-security-best-practices-vms)
にあるようにAzure Market Place 上で提供されている仮想マシンイメージは既定で自動更新が実行されるため、古い脆弱性を含む仮想マシンイメージを明示的に選択して実行するのは難しいです。(ご自身で、古い仮想マシンイメージをアップロードし、これをテンプレート使用する場合はこの限りではございません。)

>Azure Marketplace の一部として提供されるイメージは常に、既定で自動更新が実行されます
引用元：[Azure VM のセキュリティのベスト プラクティス](https://docs.microsoft.com/ja-jp/azure/security/azure-security-best-practices-vms)

###仮想マシン作成の手順（ポータルの場合）
Azure Portal の画面から右上の__＋新規__をクリックし、CentOS と入力します。Azure Market Placeにあるイメージがたくさん表示されるのですが、__CentOS-based 7.3__ とあるもの（OpenLogicさんのイメージ）を選択し__作成__をクリックします。
作成方法は基本的に好みになるのですが、ユニークな__名前__と__認証の種類（手持ちのSSH証明書を設定するのか、パスワード認証にするのか）とその設定__、__リソースグループ__(運用管理の単位になります)を設定することが必須になります。
_sheetaというユーザーで実行しています。_

作成後に、ネットワークセキュリティグループ(デフォルトでは__仮想マシン名-NSG__)の__送信セキュリティ規則__に(http用の)tcp/80の設定を追加しておきます。
_検証では、DSv3 インスタンスで実行しました。_

## Step2. Install requirements

Vulsセットアップに必要な以下のソフトウェアをインストールする。

- SQLite3, MySQL, PostgreSQL or Redis
- git
- gcc
- GNU Make
- go v1.8.3 or later (The latest version is recommended)
    - https://golang.org/doc/install
    執筆時（2018/01/15の最新版は 1.9.2 です。Slackで動作実績を確認したので今回は最新版を使用することにします。）

```bash
$ sudo yum -y install sqlite git gcc make wget
$ wget https://storage.googleapis.com/golang/go1.9.2.linux-amd64.tar.gz
$ sudo tar -C /usr/local -xzf go1.9.2.linux-amd64.tar.gz
$ mkdir $HOME/go
```
/etc/profile.d/goenv.sh を作成し、下記を追加する。

```bash
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
```

細かい設定、面倒だったのでこちらの書き方でやりました。

```bash
#環境変数の定義
sudo sh -c 'echo "export GOROOT=/usr/local/go" >> /etc/profile.d/goenv.sh'
sudo sh -c 'echo "export GOPATH=\$HOME/go" >> /etc/profile.d/goenv.sh'
sudo sh -c 'echo "export PATH=\$PATH:\$GOROOT/bin:\$GOPATH/bin" >> /etc/profile.d/goenv.sh'
source /etc/profile.d/goenv.sh
```

カレントシェルに上記環境変数をセットする。
```bash
$ source /etc/profile.d/goenv.sh
```

## Step3. Deploy go-cve-dictionary

[go-cve-dictionary](https://github.com/kotakanbe/go-cve-dictionary)

```bash
$ sudo mkdir /var/log/vuls
$ sudo chown sheeta /var/log/vuls
$ sudo chmod 700 /var/log/vuls
$
$ mkdir -p $GOPATH/src/github.com/kotakanbe
$ cd $GOPATH/src/github.com/kotakanbe
$ git clone https://github.com/kotakanbe/go-cve-dictionary.git
$ cd go-cve-dictionary
$ make install
```
バイナリは、`$GOPATH/bin`以下に生成される
もしもインストールプロセスが途中で止まる場合は、Out of memory errorが発生している可能性があるので、インスタンスタイプを大きくして再実行してみてください。

NVDから脆弱性データベースを取得する。  
環境によって異なるが、AWS上では10分程度かかる。

```bash
$ cd $HOME
$ for i in `seq 2002 $(date +"%Y")`; do go-cve-dictionary fetchnvd -years $i; done
... snip ...
$ ls -alh cve.sqlite3
#更新日付が新しくなっていることを確認します。
```

脆弱性レポートを日本語化したい場合は、JVNから脆弱性データベースを取得する。  

```bash
$ cd $HOME
$ for i in `seq 1998 $(date +"%Y")`; do go-cve-dictionary fetchjvn -years $i; done
```

## Step4. Deploy goval-dictionary

[goval-dictionary](https://github.com/kotakanbe/goval-dictionary)

```bash
$ mkdir -p $GOPATH/src/github.com/kotakanbe
$ cd $GOPATH/src/github.com/kotakanbe
$ git clone https://github.com/kotakanbe/goval-dictionary.git
$ cd goval-dictionary
$ make install
```
The binary was built under `$GOPATH/bin`
もしもインストールプロセスが途中で止まる場合は、Out of memory errorが発生している可能性があるので、インスタンスタイプを大きくして再実行してみてください。

今回はCentOSがスキャン対象なので、RedHatが公開しているOVAL情報を取り込む. [README](https://github.com/kotakanbe/goval-dictionary#usage-fetch-oval-data-from-redhat)

```bash
$ goval-dictionary fetch-redhat 7
```

今回はスキャン対象がCentOS 7なので、RedHat 7のOVALを取得している。
他の種類のOSをスキャンする場合は以下を参照し、スキャン対象用のOVALを取得しておくこと
- [Alpine](https://github.com/kotakanbe/goval-dictionary#usage-fetch-alpine-secdb-as-oval-data-type)
- [RedHat, CentOS](https://github.com/kotakanbe/goval-dictionary#usage-fetch-oval-data-from-redhat)
- [Debian](https://github.com/kotakanbe/goval-dictionary#usage-fetch-oval-data-from-debian)
- [Ubuntu](https://github.com/kotakanbe/goval-dictionary#usage-fetch-oval-data-from-ubuntu)
- [Oracle Linux](https://github.com/kotakanbe/goval-dictionary#usage-fetch-oval-data-from-oracle)
- [SUSE](https://github.com/kotakanbe/goval-dictionary#usage-fetch-oval-data-from-suse)

## Step5. Deploy Vuls

新規にターミナルを起動し、先ほど作成した仮想マシンにSSH接続する。
```
$ 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
```

The binary was built under `$GOPATH/bin`
もしもインストールプロセスが途中で止まる場合は、Out of memory errorが発生している可能性があるので、インスタンスタイプを大きくして再実行してみてください。

もし、あなたが以前にvulsをインストールしていて update をする場合は以下を実施してください。
```
$ rm -rf  $GOPATH/pkg/linux_amd64/github.com/future-architect/vuls/
$ rm -rf  $GOPATH/src/github.com/future-architect/vuls/
$ cd $GOPATH/src/github.com/future-architect
$ git clone https://github.com/future-architect/vuls.git
$ cd vuls
$ make install
```

## Step6. Config

Vulsの設定ファイルを作成する（TOMLフォーマット）

```
$ cd $HOME
$ cat config.toml
[servers]

[servers.localhost]
host = "localhost"
port = "local"
```

こちらの書き方でやりました。

```Bash
#Configを作成
echo '[servers]' >> config.toml
echo '[servers.localhost]' >> config.toml
echo 'host         = "localhost"' >> config.toml
echo 'port        = "local"' >> config.toml
```

## Step7. Check config.toml and settings on the server before scanning

```
$ vuls configtest
```
詳細は [Usage: configtest](#usage-configtest) を参照

## Step8. Start Scanning


```
[sheeta@rapyuta ~]$ vuls scan
[Jan 16 11:43:56]  INFO [localhost] Start scanning
[Jan 16 11:43:56]  INFO [localhost] config: /home/sheeta/config.toml
[Jan 16 11:43:56]  INFO [localhost] Validating config...
[Jan 16 11:43:56]  INFO [localhost] Detecting Server/Container OS... 
[Jan 16 11:43:56]  INFO [localhost] Detecting OS of servers... 
[Jan 16 11:43:56]  INFO [localhost] (1/1) Detected: localhost: centos 7.3.1611
[Jan 16 11:43:56]  INFO [localhost] Detecting OS of containers... 
[Jan 16 11:43:56]  INFO [localhost] Detecting Platforms... 
[Jan 16 11:43:56]  INFO [localhost] (1/1) localhost is running on other
[Jan 16 11:43:56]  INFO [localhost] Scanning vulnerabilities... 
[Jan 16 11:43:56]  INFO [localhost] Scanning vulnerable OS packages...


One Line Summary
================
localhost	centos7.3.1611	0 updatable packages




To view the detail, vuls tui is useful.
To send a report, run vuls report -h.
```

## Step9. Reporting

View one-line summary

```
[sheeta@rapyuta ~]$ vuls report -lang=ja -format-one-line-text -cvedb-path=$PWD/cve.sqlite3 -ovaldb-path=$PWD/oval.sqlite3
[Jan 16 11:45:25]  INFO [localhost] Validating config...
[Jan 16 11:45:25]  INFO [localhost] cve-dictionary: /home/sheeta/cve.sqlite3
[Jan 16 11:45:25]  INFO [localhost] Loaded: /home/sheeta/results/2018-01-16T11:43:56Z
[Jan 16 11:45:25]  INFO [localhost] Fill CVE detailed information with OVAL
[Jan 16 11:45:25]  WARN [localhost] OVAL entries of redhat 7.3.1611 are not found. It's recommended to use OVAL to improve scanning accuracy. For details, see https://github.com/kotakanbe/goval-dictionary#usage , Then report with --ovaldb-path or --ovaldb-url flag
[Jan 16 11:45:25]  INFO [localhost] Fill CVE detailed information with CVE-DB


One Line Summary
================
localhost	Total: 0 (High:0 Medium:0 Low:0 ?:0)	0 updatable packages
```

View short summary.

こんな感じでできました。
アップデートが存在するVMがスキャンできなかったため、正確な結果になっているかどうかわかりませんが、どなたかのお役に立てば幸いです。


参考リンク：
[vuls](https://github.com/future-architect/vuls/tree/master/setup/docker)
[AzureにVulsをインストールしてみる。コピペでどーん。](http://level69.net/archives/24683)
_くどじゅんさん、参考になりました！_