はじめに
- 脆弱性診断を行うために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 = "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