VULS

# 概要
vulsの利用方法を調査

# Vulsのドキュメント
https://vuls.io/docs/en/abstract.html

# Dockerを使ってScanを実行
とりあえずドキュメントにしたがって実行してみます。

## ログディレクトリの作成
```
$ cd /path/to/working/dir
$ mkdir go-cve-dictionary-log goval-dictionary-log gost-log
```
## NVDのダウンロード
これがめちゃめちゃ時間かかります。データは永続化しておかないといけないですね。
ちなみに**NVD**とは[**National Vulnerability Database**](https://nvd.nist.gov/vuln)の略。

```
$ for i in `seq 2002 $(date +"%Y")`; do \
    docker run --rm -it \
    -v $PWD:/vuls \
    -v $PWD/go-cve-dictionary-log:/var/log/vuls \
    vuls/go-cve-dictionary fetchnvd -years $i; \
  done
INFO[10-25|02:47:38] Fetching... https://nvd.nist.gov/feeds/json/cve/1.0/nvdcve-1.0-2013.meta
INFO[10-25|02:47:38] Fetching... https://nvd.nist.gov/feeds/json/cve/1.0/nvdcve-1.0-modified.meta
INFO[10-25|02:47:38] Fetching... https://nvd.nist.gov/feeds/json/cve/1.0/nvdcve-1.0-recent.meta
INFO[10-25|02:47:39] Fetched... https://nvd.nist.gov/feeds/json/cve/1.0/nvdcve-1.0-2013.meta
INFO[10-25|02:47:39] Fetched... https://nvd.nist.gov/feeds/json/cve/1.0/nvdcve-1.0-modified.meta
INFO[10-25|02:47:39] Fetched... https://nvd.nist.gov/feeds/json/cve/1.0/nvdcve-1.0-recent.meta
INFO[10-25|02:47:39]      Newly: https://nvd.nist.gov/feeds/json/cve/1.0/nvdcve-1.0-2013.json.gz
INFO[10-25|02:47:39] Up to date: https://nvd.nist.gov/feeds/json/cve/1.0/nvdcve-1.0-modified.json.gz
INFO[10-25|02:47:39] Up to date: https://nvd.nist.gov/feeds/json/cve/1.0/nvdcve-1.0-recent.json.gz
INFO[10-25|02:47:39] Fetching... https://nvd.nist.gov/feeds/json/cve/1.0/nvdcve-1.0-2013.json.gz
INFO[10-25|02:47:42] Fetched... https://nvd.nist.gov/feeds/json/cve/1.0/nvdcve-1.0-2013.json.gz
INFO[10-25|02:47:50] Fetched 6156 CVEs
INFO[10-25|02:47:50] Inserting NVD into DB (sqlite3).
INFO[10-25|02:47:50] Inserting fetched CVEs...
1743 / 6156 [-------------------->_____________________________________________________] 28.31% 5 p/s
```

# OVALのダウンロード
**OVAL**とは[**Open Vulnerability and Assessment Language**](https://oval.mitre.org/)の略

```
$ docker run --rm -it \
    -v $PWD:/vuls \
    -v $PWD/goval-dictionary-log:/var/log/vuls \
    vuls/goval-dictionary fetch-amazon
```

# SCAN実行！

```
$ docker run --rm -it \
    -v ~/.ssh:/root/.ssh:ro \
    -v $PWD:/vuls \
    -v $PWD/vuls-log:/var/log/vuls \
    vuls/vuls scan \
    -config=./config.toml # path to config.toml in docker
```


```
One Line Summary
================
[Reboot Required] my2	amazon2	450 installed, 17 updatable
```

# docker containerをSCAN

```
[servers]

[servers.172-31-4-82]
host         = "172.31.4.82"
user        = "ec2-user"
keyPath     = "/home/username/.ssh/id_rsa"
containerType = "docker"
containersIncluded = ["${running}"]

[servers.172-31-4-82.containers.dockerA]
cpeNames = [
    "cpe:/a:rubyonrails:ruby_on_rails:4.2.1",
    "cpe:2.3:a:postgresql:postgresql:9.6.2:*:*:*:*:*:*:*",
]
```

これで実行すると、コンテナ内も検査してくれます。
cpeNamesはreport実行時に処理されるみたいです。NVDとcpeNameを結びつけてくれる機能のようなもの？別に書かなくてもいいかもしれません。
https://qiita.com/hogehogehugahuga/items/1c1dedea99e63b616a2a

# データ保存先をmysqlへ変更
## docker-compose.ymlの作成
そろそろパラメータの指定が面倒になってきたので、docker-composeを利用します。

```yml
version: '3'
services:
  vuls:
    image: vuls/vuls
    volumes:
      - ~/.ssh:/root/.ssh:ro
      - ./:/vuls
      - ./vuls-log:/var/log/vuls
    depends_on:
      - db
  cve:
    image: vuls/go-cve-dictionary
    volumes:
      - ./:/vuls
      - ./vuls-log:/var/log/vuls
    depends_on:
      - db
  oval:
    image: vuls/goval-dictionary
    volumes:
      - ./:/vuls
      - ./vuls-log:/var/log/vuls
    depends_on:
      - db
  db: # mysql Database
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: cve
    volumes:
      - ./data:/var/lib/mysql

```

## NVDダウンロード
```
$ for i in `seq 2002 $(date +"%Y")`; do     docker-compose run --rm     cve fetchnvd -dbtype=mysql -dbpath="root:password@tcp(db:3306)/cve?parseTime=true" -years $i;   done
```

## OVALダウンロード
```
$ docker-compose run --rm vuls/goval-dictionary fetch-amazon -dbtype=mysql -dbpath="root:password@tcp(db:3306)/cve?parseTime=true"
```

## config.toml
```toml
[cveDict]
type = "mysql"
url = "root:password@tcp(db:3306)/cve?parseTime=true"

[ovalDict]
type = "mysql"
url = "root:password@tcp(db:3306)/oval?parseTime=true"
```

# 感想
検査するサーバにアクセスできるSSH Keyが必要なので、ECSでの実行はめんどくさそうです。Gitにそんな秘密鍵登録したくないですし。。。
EC2常でdocker-composeを使って実行するのが良さそうです。
その場合、DBもsqliteで十分かもしれないです。

# 問題
## 踏み台経由＆ssh keyにパスワードをつけているとスキャンできない。
以下の状態だとスキャンできないです。原因はわかりませんが。。

* 踏み台を経由してスキャン対象にアクセスする。
* ssh keyにパスワードをつけている。

## known_hostsが必要
known_hostsに登録されていないとスキャンできないみたいです。オートスケールでEC2が増えるたびに、スキャンを実行するインスタンスからsshで繋いでknown_hostsに追加してあげることになりそうです。(.ssh/configファイルに`StrictHostKeyChecking no`を設定してもダメでした。）

```
$HOME/.ssh/known_hosts にリモートホストのHost Keyを追加するために、スキャン前にリモートホストにSSH接続する必要がある。
```

## 検査対象にyum-utilsが必要

packageをrepoqueryで探しているらしく、yum-utilsがインストールされていないとスキャンできません。
そしてamazon linuxにはyum-utilsが入っていません。

```
$ sudo yum install yum-utils
```

サーバセットアップ時にyum-utilsをインストールしなければならないようです。