vuls導入メモ ~Vulsサーバ構築から脆弱性診断の定期実行をするまで(メール通知・Chatwork通知)~

# はじめに
- 脆弱性診断を行うためにvuls環境を構築します。


# 本手順で行うこと
## vulsサーバ側で行うこと
- vuls実行ユーザの作成
- vulsのインストール
- VulsRepoのインストール
    - VulsRepoをsystemd管理にして自動起動設定する
- 脆弱性情報を更新する
- 脆弱性診断を定期実行し、結果をメール通知する

## 対象環境
- CentOS7

## インストールされるバージョン
```
$ vuls -v
vuls v0.6.1 ca21602

$ go version
go version go1.10.1 linux/amd64

$ go-cve-dictionary -v
go-cve-dictionary v0.3.1 b083bed
```

## ディレクトリ構造
以下は本手順で個人的に重要だと思うポイント

```
- /opt/vuls/
    - config.toml ★vuls設定ファイル
    - cve.sqlite3 ★脆弱性診断が含まれるDB
    - go/
        - bin/vuls ★vulsコマンドの存在場所
        - go/src/github.com/future-architect/vuls/ ★vulsのインストール場所
    - results/ ★vuls診断結果を保存するディレクトリ
        - 各種診断結果。。。
    - vulsrepo/ ★vuls診断結果をWebで確認するツール一式
        - その他ライセンスもろもろ。。。
        - server/
            - vulsrepo-config.toml ★VulsRepoの設定ファイル
            - vulsrepo-server ★VulsRepoの起動スクリプト
            - その他設定もろもろ。。。
```

# Vuls構築手順
- 補足
    - `#`から始まる行のコマンドはrootユーザで実行、`$`はvulsユーザで実行しています。

## vulsインストール
### 1.必要なパッケージのインストール
```
# yum -y install sqlite git gcc
# wget https://dl.google.com/go/go1.10.1.linux-amd64.tar.gz
# tar -C /usr/local -xzf go1.10.1.linux-amd64.tar.gz
```

### 2.vuls用のユーザ作成、ログ設定
```
# useradd vuls -b /opt ★任意のユーザで構いません
# mkdir /var/log/vuls
# chown -R vuls.vuls /var/log/vuls ★useraddした任意のユーザ名の権限にする
# chmod 700 /var/log/vuls
```

### 3.Go言語用の環境変数設定
```
# vi /etc/profile.d/goenv.sh ★goenv.shを作成して以下の3行を記載する。
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

# source /etc/profile.d/goenv.sh
```

### 4.go-cve-dictionaryのインストール
#### [go-cve-dictionaryとは](https://qiita.com/ike_dai/items/6e5fe881646e00beafbd)
- 脆弱性情報の公開データをDBに取り込み管理するためのツール

```
# su - 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 
```

### 5.NVDから脆弱性データベースを取得
```
$ cd /opt/vuls
$ for i in `seq 1998 $(date +"%Y")`; do go-cve-dictionary fetchjvn -years $i; done
```

### 6.vulsのインストール
```
$ 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
```

## vuls実行
### vuls接続準備
#### 以下はvulsサーバ側で作業
```
# su - vuls
$ ssh-keygen -t rsa
$ cat ~/.ssh/id_rsa.pub ★このファイルの中身をメモ
```

#### 以下は脆弱性診断するサーバ側で作業
```
# useradd vuls
# su - vuls
$ mkdir ~/.ssh/
$ vi ~/.ssh/authorized_keys ★先ほどメモしたファイルの中身を記載する
$ chmod 700 /home/vuls/.ssh/
$ chmod 600 ~/.ssh/authorized_keys
```

#### SSH接続確認(vulsサーバ→脆弱性診断するサーバ)
```
# ssh -i /opt/vuls/.ssh/id_rsa vuls@<脆弱性診断するサーバのIPアドレス>
```

### vuls設定ファイル作成(vulsサーバで実行)
```
# su - vuls
$ vi config.toml
[servers.target-server]
host        = "<脆弱性診断するサーバのIPアドレス>"
port        = "22"
user        = "vuls" ★脆弱性診断をするユーザ
keyPath     = "/opt/vuls/.ssh/id_rsa"　
```

### 脆弱性診断実行
```
$ vuls scan target-server
$ vuls report -lang=ja
```

## 脆弱性診断をWebツール（VulsRepo）で確認したい
- 詳細は以下の公式ドキュメントを確認してください。
    - [VulsRepo](https://vuls.io/docs/ja/vulsrepo.html)


### VulsRepoインストール
```
# su - vuls
$ cd $HOME $ git clone https://github.com/usiusi360/vulsrepo.git
$ cd $HOME/vulsrepo/server
$ cp vulsrepo-config.toml.sample vulsrepo-config.toml
$ vi vulsrepo-config.toml
[Server]
rootPath = "/opt/vuls/vulsrepo"
resultsPath  = "/opt/vuls/results"
serverPort  = "5111"
```

### VulsRepoを起動
```
$ cd $HOME/vulsrepo/server
$ ./vulsrepo-server
```

### 脆弱性診断結果をWebでみる
http://< VulsサーバのIPアドレス >:5111にアクセスします。
>
<img width="575" alt="WS000000.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/168635/90a49601-0726-d020-c78e-db0855342363.jpeg">
<br>

脆弱性診断した対象のレポートを選択→[Submit]
>
<img width="575" alt="WS000001.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/168635/cd6006c7-183a-d164-fcf5-1675daa04360.jpeg">
<br>

左上のプルダウンから[03. Pivot: Package/CVSS-Severity/CveID/Summary => ServerName]を選択→[Save]
>
<img width="574" alt="WS000002.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/168635/0211bc5b-6d3f-4a12-4a5f-8af07d6fe345.jpeg">

## VulsRepoをsystemdで管理したい
### 起動ファイルを作成する
```
# vi /etc/systemd/system/vulsrepo.service

[Unit]
Description=vulsrepo daemon
Documentation=https://github.com/usiusi360/vulsrepo

[Service]
ExecStart = /opt/vuls/vulsrepo/server/vulsrepo-server
ExecRestart = /bin/kill -WINCH ${MAINPID} ; /opt/vuls/vulsrepo/server/vulsrepo-server
ExecStop = /bin/kill -WINCH ${MAINPID}
Restart = no
Type = simple
User = vuls
Group = vuls

[Install]
WantedBy = multi-user.target
```

### 確認する
```
# systemctl list-unit-files --type=service|grep vulsrepo
vulsrepo.service                           disabled 
```

### 自動起動設定、動作確認
```
# systemctl enable vulsrepo
Created symlink from /etc/systemd/system/multi-user.target.wants/vulsrepo.servic
#
# systemctl status vulsrepo
● vulsrepo.service - vulsrepo daemon
   Loaded: loaded (/etc/systemd/system/vulsrepo.service; enabled; vendor preset:
   Active: inactive (dead) since 水 2019-01-09 16:29:37 JST; 3s ago
     Docs: https://github.com/usiusi360/vulsrepo
  Process: 32536 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=0/SUC
  Process: 32525 ExecStart=/opt/vuls/vulsrepo/server/vulsrepo-server (code=kille
 Main PID: 32525 (code=killed, signal=TERM)
#
# systemctl start vulsrepo
#
# systemctl status vulsrepo
● vulsrepo.service - vulsrepo daemon
   Loaded: loaded (/etc/systemd/system/vulsrepo.service; enabled; vendor preset:
   Active: active (running) since 水 2019-01-09 16:29:46 JST; 1s ago
     Docs: https://github.com/usiusi360/vulsrepo
  Process: 32536 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=0/SUC
 Main PID: 32545 (vulsrepo-server)
    Tasks: 4
   Memory: 864.0K
   CGroup: /system.slice/vulsrepo.service
           mq32545 /opt/vuls/vulsrepo/server/vulsrepo-server
# systemctl stop vulsrepo
#
# systemctl status vulsrepo
● vulsrepo.service - vulsrepo daemon
   Loaded: loaded (/etc/systemd/system/vulsrepo.service; enabled; vendor preset:
   Active: inactive (dead) since 水 2019-01-09 16:29:37 JST; 3s ago
     Docs: https://github.com/usiusi360/vulsrepo
  Process: 32536 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=0/SUC
  Process: 32525 ExecStart=/opt/vuls/vulsrepo/server/vulsrepo-server (code=kille
 Main PID: 32525 (code=killed, signal=TERM)
```

## Vulsの定期実行
### 脆弱性情報の定期更新
以下は**毎週月曜日の朝5時**に実行しています。

```
# vi /etc/crontab
00 5 * * 1 vuls ${HOME}/go/bin/go-cve-dictionary fetchnvd -last2y -dbpath=/opt/vuls/cve.sqlite3
30 5 * * 1 vuls ${HOME}/go/bin/go-cve-dictionary fetchjvn -latest -dbpath=/opt/vuls/cve.sqlite3
```

## 脆弱性診断の結果をメール通知する
### メーラーをインストール・起動・自動起動
```
# yum install -y postfix
# systemctl start postfix
# systemctl enable postfix
```

### Vulsのメール設定をする
```
# vi /opt/vuls/config.toml

[email]
smtpAddr      = "localhost"
smtpPort      = "25"
from          = "aaaaa@bbbbbbb.com"
to            = ["xxxxx@yyyyyyy.com"]
subjectPrefix = "[vuls]"
```

### 脆弱性診断結果をメールで通知する(オプション：-to-email)
```
$ vuls scan && vuls report -lang=ja -format-full-text -to-email
```

### 脆弱性診断の定期実行
以下は**毎月1日の朝6時**に診断を実行します。

```
# vi /etc/crontab
00 6 1 * * vuls /opt/vuls/go/bin/vuls scan && /opt/vuls/go/bin/vuls report -lang=ja -format-full-text -to-email > /dev/null 2>&1
```

## 脆弱性診断結果をチャットワークで通知する
### 設定ファイル作成
```
$ vi /opt/vuls/config.toml

[chatwork]
room = "aaaaaaa" ★チャットワークルームID
apiToken = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"　★チャットワークのユーザのAPIトークン
```

### 脆弱性診断結果をチャットワークに通知する(オプション：-to-chatwork)
```
$ vuls scan && vuls report -format-full-text -to-chatwork -lang=ja
```