(意外と簡単)EC2とDockerを使って、脆弱性診断ツールVulsを触ってみました!

# Vulsのロゴ
![vuls_logo.png](https://qiita-image-store.s3.amazonaws.com/0/117156/851d0f3f-7b5c-8f58-c63a-7f98481aa20e.png)

# はじめに
　昨日知りました、Vuls( **<font color="red">VUL</font>nerability <font color="red">S</font>canner** )という素晴らしい脆弱性診断ツールがあります、ソースコードはGitHubの[【future-architect/vuls】](https://github.com/future-architect/vuls)に上がっています。日本にいる方々が開発したものですので、このサービスに非常に期待しています。
　Vulsができることについては、下記[vuls/README.ja.md](https://github.com/future-architect/vuls/blob/master/README.ja.md)に記載されることを引用させていただきます。
>Vulsは上に挙げた手動運用での課題を解決するツールであり、以下の特徴がある。
>●　システムに関係ある脆弱性のみ教えてくれる
>●　その脆弱性に該当するサーバを教えてくれる
>●　自動スキャンのため脆弱性検知の漏れを防ぐことができる
>●　CRONなどで定期実行、レポートすることで脆弱性の放置を防ぐことできる　　

　**Dockerを使えば、簡単にインストールができて、ちょっとした設定ですぐVulsを利用できます。**
　恥ずかしいながら、自分はDockerすらよく触ったことがなく、今回は、Dockerの学習も兼ねて、自分がやったことを共有します。

　話がそれますが、昨年度、脆弱性対応の業務にすこし携わったことがあります。その時は、脆弱性の通知がセキュリティ部門から来るたびに、各システムのサーバにSSHログインして、脆弱性ありのパッケージがインストールされているかを調査して対応していましたので、正直に言って、嫌な作業でした。ですので、Vulsのことを知ってから、ずっと頭から離れられず、触りたいと思っていたので、早速インストールして、触ってみました。

# Vulsを触ってみよう
## 動作環境

- Vulsのホスト

|OS|Amazon Linux|
|:--------:|:------------------:|
|AMI|amzn-ami-hvm-2016.03.3.x86_64-gp2|
|Docker|Version 1.11.2|

- スキャン対象のインスタンス

|OS|Amazon Linux|
|:--------:|:------------------:|
|AMI|amzn-ami-hvm-2016.03.1.x86_64-gp2|

##手順
- Vuls用のインスタンスを作成
  - セキュリティグループ周りは割愛

- Vuls用のインスタンスを作成されると、SSHログイン

**これからはEC2内の作業**

- とりあえず、yum update

```
$ sudo yum update -y
```
- docker、docker-compose、gitをインストール

```
$ sudo yum -y install docker
$ sudo pip install -U docker-compose
$ sudo yum -y install git
```
- バージョン確認

```
$ docker --version
Docker version 1.11.2, build b9f10c9/1.11.2

$ docker-compose -v
docker-compose version 1.7.1, build 6c29830

$ git --version
git version 2.7.4
```

- Dockerを起動

```
$ sudo service docker start
```
- Vulsのソースコードを取得

```
$ git clone https://github.com/future-architect/vuls.git
```

- イメージのビルド、コンテナを作成して、起動
  - 少し時間がかかる 

```
$ cd vuls/setup/docker

$ sudo /usr/local/bin/docker-compose -p docker -f docker-compose.yml up -d

$ sudo docker ps
```

<img width="989" alt="スクリーンショット 0028-07-25 22.37.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/117156/ecf41378-a47b-2e25-53b0-4f935dc12157.png">

- Vulsの設定
  - Target instanceにSSHログイン用のkeyをvuls/docker/conf/に格納
  - Target instanceにSSHログイン用のconfigファイル(config.toml)をvuls/docker/conf/に作成

```
[servers]

[servers.172-31-21-119]
host        = "172.31.21.119"
user        = "ec2-user"
keyPath     = "conf/*****.pem"
```

- NVDから、脆弱性情報を取得
  - 少し時間がかかる 

```
$ sudo docker exec -t vuls scripts/fetch_nvd_all.sh 

 0 / 1 [-----------------------------]   0.00%[Jul 25 16:06:26]  INFO Fetching... https://static.nvd.nist.gov/feeds/xml/cve/nvdcve-2.0-2002.xml.gz

...
...
...

[Jul 25 16:19:26]  INFO Refreshed 6297 Nvds.
 0 / 1 [-----------------------------]   0.00%[Jul 25 16:19:26]  INFO Fetching... https://static.nvd.nist.gov/feeds/xml/cve/nvdcve-2.0-2016.xml.gz
[Jul 25 16:19:30]  INFO Fetched 3109 CVEs
[Jul 25 16:19:30]  INFO Opening DB. datafile: /opt/vuls/cve.sqlite3
[Jul 25 16:19:30]  INFO Migrating DB
[Jul 25 16:19:30]  INFO Inserting CVEs...
 3109 / 3109 [===================================================================================================================================] 100.00% 14s
[Jul 25 16:19:45]  INFO Refreshed 3109 Nvds.

```

- スキャンを実行

```
$ sudo docker exec -t vuls vuls prepare -config=conf/config.toml
INFO[0000] Start Preparing (config: conf/config.toml)
[Jul 25 16:23:26]  INFO [localhost] Detecting OS...
[Jul 25 16:23:26]  INFO [localhost] Detecting OS of servers...
[Jul 25 16:23:26]  INFO [localhost] (1/1) Detected: 172-31-21-119: amazon 2016.03
[Jul 25 16:23:26]  INFO [localhost] Detecting OS of containers...
[Jul 25 16:23:26]  INFO [localhost] SSH-able servers are below...
172-31-21-119
[Jul 25 16:23:26]  INFO [localhost] Installing...
[Jul 25 16:23:26]  INFO [172-31-21-119] Nothing to do
[Jul 25 16:23:26]  INFO [localhost] Success
```

```
$ sudo docker exec -t vuls scripts/scan_for_vulsrepo.sh

INFO[0000] Start scanning
INFO[0000] config: /opt/vuls/conf/config.toml
INFO[0000] cve-dictionary: /opt/vuls/cve.sqlite3
[Jul 25 16:23:32]  INFO [localhost] Validating Config...
[Jul 25 16:23:32]  INFO [localhost] Detecting Server/Contianer OS...
[Jul 25 16:23:32]  INFO [localhost] Detecting OS of servers...
[Jul 25 16:23:32]  INFO [localhost] (1/1) Detected: 172-31-21-119: amazon 2016.03
[Jul 25 16:23:32]  INFO [localhost] Detecting OS of containers...
[Jul 25 16:23:32]  INFO [localhost] SSH-able servers are below...
172-31-21-119
[Jul 25 16:23:32]  INFO [localhost] Detecting Platforms...
[Jul 25 16:23:32]  INFO [localhost] (1/1) 172-31-21-119 is running on aws
[Jul 25 16:23:32]  INFO [localhost] Scanning vulnerabilities...
[Jul 25 16:23:32]  INFO [localhost] Check required packages for scanning...
[Jul 25 16:23:32]  INFO [localhost] Scanning vulnerable OS packages...
[Jul 25 16:23:34]  INFO [172-31-21-119] Fetching CVE details...
[Jul 25 16:23:34]  INFO [172-31-21-119] Done
[Jul 25 16:23:34]  INFO [localhost] Scanning vulnerable software specified in the CPE...
[Jul 25 16:23:34]  INFO [localhost] Insert to DB...
[Jul 25 16:23:46]  INFO [localhost] Reporting...
172-31-21-119 (amazon2016.03)
=============================
CVE-2016-1762	10.0 (High)  	libxml2 in Apple iOS before 9.3, OS X before 10.11.4, Safari before 9.1, tvOS before
             	             	9.2, and watchOS before 2.2 allows remote attackers to execute arbitrary code or
             	             	cause a denial of service (memory corruption) via a crafted XML document.
CVE-2016-4448	10.0 (High)  	Format string vulnerability in libxml2 before 2.9.4 allows attackers to have
             	             	unspecified impact via format string specifiers in unknown vectors.
CVE-2016-1978	7.5  (High)  	Use-after-free vulnerability in the ssl3_HandleECDHServerKeyExchange function in
             	             	Mozilla Network Security Services (NSS) before 3.21, as used in Mozilla Firefox
             	             	before 44.0, allows remote attackers to cause a denial of service or possibly have
             	             	unspecified other impact by making an SSL (1) DHE or (2) ECDHE handshake at a time
             	             	of high memory consumption.
CVE-2016-0758	7.2  (High)  	Integer overflow in lib/asn1_decoder.c in the Linux kernel before 4.6 allows local
             	             	users to gain privileges via crafted ASN.1 data.
CVE-2016-4557	7.2  (High)  	The replace_map_fd_with_map_ptr function in kernel/bpf/verifier.c in the Linux
             	             	kernel before 4.5.5 does not properly maintain an fd data structure, which allows
             	             	local users to gain privileges or cause a denial of service (use-after-free) via
             	             	crafted BPF instructions that reference an incorrect file descriptor.
CVE-2016-4565	7.2  (High)  	The InfiniBand (aka IB) stack in the Linux kernel before 4.5.3 incorrectly relies on
             	             	the write system call, which allows local users to cause a denial of service (kernel
             	             	memory write operation) or possibly have unspecified other impact via a uAPI
             	             	interface.

　　　　　　...
　　　　　　...
　　　　　　...

```

- スキャン結果を **http://ホストIPアドレス/vulsrepo/**に アクセスして、見てみると、スゲ~~~ UI結構イケてる!
<img width="1750" alt="1.pic_hd.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/117156/1148c9d7-90ce-d8f5-bd48-49c61ba06abf.jpeg">


- Target instanceをyum updateしてから、もう一回やってみる

```
$ sudo docker exec -t vuls vuls prepare -config=conf/config.toml

INFO[0000] Start Preparing (config: conf/config.toml)
[Jul 25 16:34:19]  INFO [localhost] Detecting OS...
[Jul 25 16:34:19]  INFO [localhost] Detecting OS of servers...
[Jul 25 16:34:20]  INFO [localhost] (1/1) Detected: 172-31-21-119: amazon 2016.03
[Jul 25 16:34:20]  INFO [localhost] Detecting OS of containers...
[Jul 25 16:34:20]  INFO [localhost] SSH-able servers are below...
172-31-21-119
[Jul 25 16:34:20]  INFO [localhost] Installing...
[Jul 25 16:34:20]  INFO [172-31-21-119] Nothing to do
[Jul 25 16:34:20]  INFO [localhost] Success
```

```
$ sudo docker exec -t vuls scripts/scan_for_vulsrepo.sh

INFO[0000] Start scanning
INFO[0000] config: /opt/vuls/conf/config.toml
INFO[0000] cve-dictionary: /opt/vuls/cve.sqlite3
[Jul 25 16:34:31]  INFO [localhost] Validating Config...
[Jul 25 16:34:31]  INFO [localhost] Detecting Server/Contianer OS...
[Jul 25 16:34:31]  INFO [localhost] Detecting OS of servers...
[Jul 25 16:34:32]  INFO [localhost] (1/1) Detected: 172-31-21-119: amazon 2016.03
[Jul 25 16:34:32]  INFO [localhost] Detecting OS of containers...
[Jul 25 16:34:32]  INFO [localhost] SSH-able servers are below...
172-31-21-119
[Jul 25 16:34:32]  INFO [localhost] Detecting Platforms...
[Jul 25 16:34:32]  INFO [localhost] (1/1) 172-31-21-119 is running on aws
[Jul 25 16:34:32]  INFO [localhost] Scanning vulnerabilities...
[Jul 25 16:34:32]  INFO [localhost] Check required packages for scanning...
[Jul 25 16:34:32]  INFO [localhost] Scanning vulnerable OS packages...
[Jul 25 16:34:33]  INFO [172-31-21-119] Fetching CVE details...
[Jul 25 16:34:33]  INFO [172-31-21-119] Done
[Jul 25 16:34:33]  INFO [localhost] Scanning vulnerable software specified in the CPE...
[Jul 25 16:34:33]  INFO [localhost] Insert to DB...
[Jul 25 16:34:33]  INFO [localhost] Reporting...

172-31-21-119 (amazon2016.03)
=============================
No unsecure packages.
```

結果は **No unsecure packages**になりました! やはり、Vulsが超~~便利ですね!これで、運用も楽になれます!

# 最後

　クラウドを前提とした設計が「ニューノーマル」になった今、セキュリティがますます重要になってきました。
　AmazonもInspectorという診断用のサービスがあります。Vulsと違って、完全にAmazonのマネジドサービスですので、サーバの運用が不要です。それぞれの特徴がありますので、利用者が自分のニーズにあったものを利用すればよいと思います。
　まだまだ全然DeepDiveできていませんが、VulsはもAmazon Inspectorも本当に素晴らしいサービスだと思っています。これから、是非活用したいです。

# 参考になったサイト

- [Vuls: VULnerability Scanner](https://github.com/future-architect/vuls/blob/master/README.ja.md)
- [サーバの脆弱性チェックできるVulsをdockerを使って試した](http://cross-black777.hatenablog.com/entry/2016/05/09/090000#実際に使ってみる)