あなたのサーバは本当に安全ですか？今もっともイケてる脆弱性検知ツールVulsを使ってみた

# はじめに

サーバ管理をしている身としては、 **セキュリティ** は常に付きまとう悪魔みたいなもので、このセキュリティに関しては何をどこまで頑張ればいいのか不透明な部分が多い。

脆弱性に関しては、CVEなど、毎日情報は入ってくるが、それがどのサーバの何に関連したものなのかなんていちいち調べてられないし、どの脆弱性がすぐに対応しなければいけないもので、どの脆弱性があとあと対応すればいいものなのかなんてわからない。

実際のところ、大きな話題になった脆弱性くらいしか緊急で対応してないという人は多いのではないかと思う。

そんな中、満を持して登場したのが **vuls** !!

各サーバの脆弱性情報を取得して、個々のサーバそれぞれでどんな脆弱性があり、どのくらいやばい脆弱性なのかを検知できるようになった！

今回はこのvulsを紹介します。

# Vulsとは

![VULS-logo.png](https://raw.githubusercontent.com/future-architect/vuls/master/img/vuls_logo.png)

公式でロゴが発表されたので、差し替えました

公式ドキュメント: [Vuls公式ドキュメント](https://vuls.io/ja/)
GitHub: [vuls](https://github.com/future-architect/vuls)

Vulsはgolang製の脆弱性検知ツールです。
VulsはVULnerability Scannerの略です。
「バルス！」って聞くとラピュタを思い出すのは私だけではないはず。

## vulsのいいところ

- Golangで作られているので、バイナリ化すればどのサーバにも配布できる
- 脆弱性検知結果をslackやメールで送信できる。なおTUI（Text User Interface）で見ることも可能
- エージェントレス。設定ファイル1つというシンプルな構成
- スターが6988付いてる（2019/11/28時点）
- 開発者が日本の人
- GitHubスターが開発のモチベーションらしいです。
- [vuls公式slack](http://goo.gl/forms/xm5KFo35tu)で気軽に質問できる（日本語でもOK）

## ざくっとどんな感じ？

こんな感じ

![スクリーンショット 2016-04-30 3.31.13.png](https://qiita-image-store.s3.amazonaws.com/0/55672/0199ff3f-628c-d310-1cba-1fedc3fdce08.png)



1. [go-cve-dictionary](github.com/kotakanbe/go-cve-dictionary)を使って、CVE情報を取得する。
2. [goval-dictionary](github.com/kotakanbe/goval-dictionary)を使って、OVAL情報を取得する。
3. [gost](https://github.com/knqyf263/gost)を使って、Redhat, Debianのパッケージ情報を取得する。
4. [go-exploitdb](https://github.com/mozqnet/go-exploitdb)を使って、Exploit情報を取得する。
2. 取得した上記の各情報をSQLiteに保存する
3. vulsで対象サーバをスキャンして情報を取得する
4. 取得したサーバ情報とCVE情報を照合する。
5. 発見した脆弱性情報をJSONに保存する
6. 脆弱性情報をSlackまたはメールで通知する
7. SQLiteに保存した脆弱性情報をTUIで可視化する

さらに詳細な図がみたい人は[Vulsドキュメント](https://vuls.io)へ。

# 実際に使ってみる

**公式のドキュメントがとても親切なので、それ通りに進めていけば特に問題ない。**

## 実行環境情報

- vulsホスト情報

|||
|:--|:--|
|OS|OSX El Capitan|
|Version|10.11.4|

- 脆弱性スキャン対象サーバ

|||
|:--|:--|
|OS|amazon linux|
|Version|2015.03.1.x86_64-gp2|



## 環境準備

- ログディレクトリ作成

```console:console
$ sudo mkdir /var/log/vuls
$ sudo chown YOUR_USER /var/log/vuls
$ sudo chmod 700 /var/log/vuls
```

- vuls用の作業ディレクトリ作成

```console:console
$ mkdir vuls
$ cd vuls
```

- Golangのインストール

**説明省略**

[公式ダウンロードページ](https://golang.org/dl/)

## 初期設定

### go-cve-directionary

- go-cve-directionaryのセットアップ
    - [READMEを参照](https://github.com/kotakanbe/go-cve-dictionary)

- CVE情報の取得と保存

```console:console
$ for i in `seq 2002 $(date +"%Y")`; do go-cve-dictionary fetchnvd -years $i; done
$ ls -alh cve.sqlite3
-rw-r--r-- 1 ec2-user ec2-user 7.0M Mar 24 13:20 cve.sqlite3
```

### goval-directionary

- goval-directionaryのセットアップ
    - [READMEを参照](https://github.com/kotakanbe/goval-dictionary)

- OVAL情報の取得と保存(以下、スキャンするディストリビューションの情報のみ取ってくる)

```console:console
$ goval-dictionary fetch-redhat 5 6 7
$ goval-dictionary fetch-debian 7 8 9 10
$ goval-dictionary fetch-ubuntu 12 14 16 18
```

### gost

- gostのセットアップ
    - [READMEを参照](https://github.com/knqyf263/gost)

- gost情報の取得と保存(以下、スキャンするディストリビューションの情報のみ取ってくる)

```console:console
$ gost fetch redhat --after 2016-01-01
```

### go-exploitdb

- go-exploitdbのセットアップ
    - [READMEを参照](https://github.com/mozqnet/go-exploitdb)

- exploit情報の取得と保存(以下、スキャンするディストリビューションの情報のみ取ってくる)

```console:console
$ go-exploitdb fetch
```

## Vuls実行

- vuls本体のセットアップ
    - [ドキュメントを参照](https://vuls.io/docs/ja/install-manually-centos.html#deploy-vuls)

- vulsインストール

```console:console
$ 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
```

**必要な設定はすべてmakeで行えるので、make installするのがいい**

- configファイル設定

```toml:config.toml
[servers]
[servers.54-199-160-38]
host         = "54.199.160.38"
port        = "22"
user        = "ec2-user"
keyPath     = "/Users/matsunosadayuki/.ssh/vuls-dev.pem"
```

- report

```console:console
$ vuls report -format-one-line-text

One Line Summary
================
172-31-4-82   Total: 94 (High:19 Medium:54 Low:7 ?:14)        103 updatable packages
```

**合計143個検知された**
**Scoreは脆弱性のレベル**

- 脆弱性情報確認

*実行した場所のresults以下にscan結果のjsonファイルが保存されている*

- tui

```console:console
$ vuls tui
```

![スクリーンショット 2016-04-29 14.12.26.png](https://qiita-image-store.s3.amazonaws.com/0/55672/15de5446-a214-d100-0c59-a10180d06e70.png "スクリーンショット 2016-04-29 14.12.26.png")

**おお！表現しようのない爽快感！全てのCVEが見れる！**
**Ctrl押しながらhjklで移動もできる！！**
**※ただしkeybindが他のものとかぶっていない時に限る**

## 対象サーバのyum updateを実行

- 手動update

実際にupdateしてみて、どれだけ脆弱性が消えるのか確認してみた。

```console:console
$ ssh ec2-user@52.199.160.38
$ sudo yum update
```

## Vulsで再スキャン

- scan

```console:console
INFO[0000] Start scanning (config: /Users/matsunosadayuki/vuls/config.toml)
[Apr 29 14:22:49]  INFO [localhost] Validating Config...
[Apr 29 14:22:49]  INFO [localhost] Detecting the type of OS...
[Apr 29 14:22:50]  INFO [localhost] (1/1) Successfully detected. 54-199-160-38: amazon 2016.03
[Apr 29 14:22:50]  INFO [localhost] Scanning vulnerabilities...
[Apr 29 14:22:50]  INFO [localhost] Check required packages for scanning...
[Apr 29 14:22:50]  INFO [localhost] Scanning vulnerable OS packages...
[Apr 29 14:22:55]  INFO [54-199-160-38:22] Fetching CVE details...
[Apr 29 14:22:55]  INFO [54-199-160-38:22] Done
[Apr 29 14:22:55]  INFO [localhost] Scanning vulnerable software specified in the CPE...
[Apr 29 14:22:55]  INFO [localhost] Reporting...

54-199-160-38 (amazon 2016.03)
==============================
No unsecure packages.
```

**おお！！No unsecure packages.ってなってる！**
**これは便利**

- docker

ちなみに、vulsにはdockerも用意されているので、セットアップが面倒な人は、dockerで試してみるのがいいと思います！

[Vuls Dockerhub](https://hub.docker.com/r/vuls/vuls/)

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

## さいごに

Vulsはシンプルでかつ、とても有用なツールです。
これを使うことで、どのサーバがどの脆弱性を持っていて、なおかつそれがどれほどのレベルのものなのかが把握できます。
一度動かしてみればそのシンプルさ、簡単さがわかると思います。

是非この機会に、脆弱性スキャンしてみませんか？


# 追記

Vulsが稼働中のDockerの脆弱性検知にも対応しました！
詳細は、以下の記事をご覧ください！
[進化するVuls!稼働中のDockerコンテナの脆弱性を検知する](http://qiita.com/sadayuki-matsuno/items/3cee45da89f13580dfb7)

# Changelog

- 2016/07/01
  - scan時にgo-cve-dictionaryのデータをを引数に指定
- 2016/07/19
  - GitHubスター数更新
- 2016/10/09
  - GitHubスター数更新
- 2017/02/01
  - 実行方法更新
- 2017/06/21
  - GitHubスター数更新
- 2018/11/20
  - 実行方法更新
  - GitHubスター数更新
- 2019/11/28
  - GitHubスター数更新