Vulsでowasp dependency-checkを使う

# 本ページについて

VulsがOWASP Dependency Checkのスキャンに対応しているので、その例を示すためのページです。

**2016/11時点で、"Experimental"となっています。**

> Usage: Integrate with OWASP Dependency Check to Automatic update when the libraries are updated (Experimental)

# 概要

VulsとOWASP Dependency Checkを同じサーバで稼働させます。

- OWASP関連は、Vulsで利用する前提で /opt/vuls/owasp に配置します。
  - 実際は、スキャン結果のXMLさえVulsで読めれば、実行者や配置場所はどうでもいいです。

対象サーバでやることは以下の通りです。

- Vulsをインストールする
- OWASP Dependency Checkを入れる
- OWASP Dependency Checkでスキャンする
- Vulsのconfigに、OWASP Dependency CheckのXML指定を書く
- Vulsでスキャンする

# 実作業

## Vulsをインストールする

[VulsのREADME](https://github.com/future-architect/vuls/blob/master/README.ja.md "VulsのGitHubページ")を参照してください。

詳細は割愛しますが、以下のようにするのが良いと思われます。

- インストール先は /opt/vuls とする
  - 最低限 Otherの権限は落とす(chmod 640等)

## OWASP Dependency Checkを入れる

[OWASP Dependency Checkのサイト](https://www.owasp.org/index.php/OWASP_Dependency_Check "OWASP Dependency ChekckのWEBページ")を参照してください。

概要のみ記載します。

- JREをインストールする
  - 各ディストリビューションのパッケージを利用するのが、アップデート関連を含めて、楽です。
- 上記サイトから、CommandLine版をダウンロードする
  - 2016/11時点では、[Quick Download][Command Line]のリンクから落とすのが、楽です。
- /opt/vuls 以下にダウンロードしたファイルを展開することで、Dependency Checkは以下のPATHで使えるようになります。
  - `/opt/vuls/owasp/dependency-check/dependency-check.sh`
  - 初回のスキャンは、ものすごく時間掛かります。BEERでも飲みながら待ちましょう。

## OWASP Dependency Checkでスキャンする

XMLで出力する必要がある為、`--format XML` , `--out` のオプションを利用します。

```
$ ./dependency-check.sh --format XML --out <XML_OUTPUT_FILE_PATH> --project <PROJ_NAME> -scan <CODE_DIR_PATH>
```

例えば、hogehugaプロジェクトで、/opt/codes/hogehoge 以下にソース群がある場合は、以下のような感じです。

```
[vuls@~]$ ./owasp/dependency-check/dependency-check.sh --format XML --project hogehuga -scan /opt/codes/hogehoge --out /opt/vuls/dependency-check-report.xml
```

これにより `/opt/vuls/dependency-check-report.xml` が生成されます。

## Vulsのconfigに、OWASP Dependency CheckのXML指定を書く

ローカルスキャンの一環として書いてしまいます。

```
[servers]

[servers.192.168.0.10]
host = "192.168.0.10"
user = "vuls"
keyPath = "/opt/vuls/ssh_keys/local.id_rsa"
dependencyCheckXMLPath = "/opt/vuls/dependency-check-report.xml"
```

## Vulsでスキャンする

いつも通りのスキャンを実施します。

```
[vuls@~]$ vuls scan -config=./config.toml -cve-dictionary-dbpath=/opt/vuls/cve.sqlite3 -report-json
```

これで、CPE指定した時と同じように検知結果が出ます。

# 検知テストをしてみる

古いApache Strutsをチェックし、実際にどのように表示されるかの確認をしてみた。

## 概要

Apache Strutsを実際に利用するわけではないので、ダウンロードして展開し、そのままスキャンをしてみます。

- ApacheStrutsを /opt/vuls/tmp/以下に展開
- OWASP Dependency Checkを実行し、XMLを生成
- vulsのconfig.tomlを修正し、当該XMLを含めて jsonの生成
- VulsRepoで閲覧

## 1.Apache Strustsを準備する

今の時点で古い、Apache Strutsをダウンロードして、展開します。

```
$ mkdir /opt/vuls/tmp; cd /opt/vuls/tmp
$ wget https://dist.apache.org/repos/dist/release/struts/2.3.20.1/struts-2.3.20.1-all.zip
$ unzip struts-2.3.20.1-all.zip
$ ls /opt/vuls/tmp
struts-2.3.20.1  struts-2.3.20.1-all.zip
$
```

## 2.OWASP Dependency Checkをする

まずは、スキャンできるかを確認する為、HTMLで出力してみましょう。

```
$ /opt/vuls/owasp/dependency-check/bin/dependency-check.sh --project struts -scan ./ --out /opt/vuls/tmp/struts-report.html
$ w3m /opt/vuls/tmp/struts-report.html
```

2016/11/07時点で、Vulnerable Dependencies:50、Vulnerbilities Found:556、となっている。

次はVulsで利用できるように XML で出力します。

```
$ /opt/vuls/owasp/dependency-check/bin/dependency-check.sh --format XML --project struts -scan ./ --out /opt/vuls/tmp/struts-report.xml
$ ls /opt/vuls/tmp
struts-2.3.20.1  struts-2.3.20.1-all.zip  struts-report.html  struts-report.xml
$
```

## 3.Vulsでスキャンする

利用するconfig.tomlを修正します。

```
$ vi /opt/vuls/config.toml
# 例えば以下のような感じです
[default]
port = "22"
user = "vuls"

[servers]
[servers.vuls-servre]
host = "192.168.0.11"
keyPath = "/opt/vuls/.ssh/id_rsa"
dependencyCheckXMLPath = "/opt/vuls/tmp/struts-report.xml"
```

prepareして念のため確認する。

```
$ vuls prepare -config /opt/vuls/config.toml
INFO[0000] Loaded from OWASP Dependency Check XML: vuls-servre
INFO[0000] Start Preparing (config: config-owasp.toml)
[MM D hh:mm:ss]  INFO [localhost] Detecting OS...
[MM D hh:mm:ss]  INFO [localhost] Detecting OS of servers...
[MM D hh:mm:ss]  INFO [localhost] (1/1) Detected: vuls-servre: centos 6.8
[MM D hh:mm:ss]  INFO [localhost] Detecting OS of containers...
[MM D hh:mm:ss]  INFO [localhost] Checking sudo configuration...
[MM D hh:mm:ss]  INFO [vuls-servre] sudo ... OK
[MM D hh:mm:ss]  INFO [localhost] No need to install dependencies
$
```

あとは通常通りスキャンする。

```
$ vuls scan -config=./config.toml -cve-dictionary-dbpath=/opt/vuls/cve.sqlite3 -report-json
```

## 4.VulsRepoで閲覧する

いつも通りVulsRepoを見ると、Packagesでcpeなものが追加されているはずです。これは OWASP Dependency Checkの結果を取り込んだものです。

dependencyCheckXMLPathの有無で異なる結果を、画像で示します。

- 20161105_1240の物は、OWASPの結果を入れていないもの
- 20161107_1040の物は、OWASPのXMLを読ませたもの
  + ScanTimeは適当です。
- 赤線を引いてある cpe:/a:...が、DependencyCheckで追加されたもの

![owasp-dependencyCheck_scan.png](https://qiita-image-store.s3.amazonaws.com/0/124868/854e8c56-2311-cc8b-5f12-6baf67b0d841.png)

以上です。