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とは

  • 脆弱性情報の公開データを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インストール

# 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にアクセスします。



脆弱性診断した対象のレポートを選択→[Submit]



左上のプルダウンから[03. Pivot: Package/CVSS-Severity/CveID/Summary => ServerName]を選択→[Save]

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          = "[email protected]"
to            = ["[email protected]"]
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