Edited at
VulsDay 24

Vuls/Vulsrepo を cron で動かすまで

More than 1 year has passed since last update.


Vuls/Vulsrepo を cron で動かすまで


  • vuls report の結果を何回分残すかの設定もできます。


条件


  1. CentOS7

  2. ユーザー vuls (あらかじめ作っておいてください、sudo できるように)

  3. グループ vuls (あらかじめ作っておいてください)

  4. Proxy サーバーがある場合も考慮します


TODO:


  • vuls が検査対象に root でログインして検査する deep mode は書き足していない

  • 動かないときの対処、ここみたらいいよとか


ディレクトリ・ファイル構成


vuls/vulsrepo 専用ディレクトリ

$ pwd

/usr/local/share/vuls
$ LANG=C tree
.
|-- config.toml # vuls の設定ファイル
|-- cve.sqlite3 # nvd, jvn データベース
|-- cve.sqlite3-shm
|-- cve.sqlite3-wal
|-- oval.sqlite3 # oval データベース
|-- results # vuls report -format-json
| |-- 2017-12-17T08:01:56+09:00
| | `-- localhost.json
| |-- 2017-12-18T08:01:43+09:00
| | `-- localhost.json
| |-- 2017-12-19T08:01:52+09:00
| | `-- localhost.json
| |-- 2017-12-20T08:01:51+09:00
| | `-- localhost.json
| |-- 2017-12-21T08:01:40+09:00
| | `-- localhost.json
| |-- 2017-12-22T08:02:01+09:00
| | `-- localhost.json
| |-- 2017-12-23T08:01:38+09:00
| | `-- localhost.json
| |-- 2017-12-24T08:01:45+09:00
| | `-- localhost.json
| |-- 2017-12-25T08:01:22+09:00
| | `-- localhost.json
| `-- current -> /usr/local/share/vuls/results/2017-12-25T08:01:22+09:00
|-- vuls-cron # nvd, jvn, oval データベースアップデート vuls 実行
`-- vulsrepo-config.toml # vulsrepo の設定ファイル


環境変数設定

$ pwd

/etc
$ LANG=C tree profile.d
profile.d
|-- goenv.sh # go 用の環境変数と proxy 設定環境変数
`-- vuls.sh # vuls 用の環境変数


systemd 用 vulsrepo の自動起動


  • /usr/lib/systemd/system/vulsrepo.service


cron 設定


  • /etc/crontab


ログディレクトリ


  • /var/log/vuls/


インストール



  • vuls の github にある正規手順を元にして少し変更します。


Install requirements

Vulsセットアップに必要な以下のソフトウェアをインストールする。


  • SQLite3

  • git

  • gcc

  • GNU Make

  • go v1.8.3(レポジトリを利用します)

$ id

uid=33333(vuls) gid=33333(vuls) groups=33333(vuls),10(wheel)
$ sudo yum -y install sqlite git gcc make wget golang
$ sudo mkdir -p /usr/local/share/go/src
$ cd /usr/local/share/
$ sudo chown -r vuls:vuls /usr/local/share/go


  • /etc/profile.d/goenv.sh を作成し、下記を追加する。


/etc/profile.d/goenv.sh

$ sudo vim /etc/profile.d/goenv.sh

GOPATH=/usr/local/share/go
if [ -n "$GOPATH" ]; then
export GOPATH
PATH=`echo $PATH | sed -e "s|:$GOPATH/bin||"`
PATH=$PATH:$GOPATH/bin
export PATH
else
unset GOPATH
fi
# proxy サーバーを設定
# 10.233.3.10:3128 は自身の proxy サーバーに変更する
# proxy サーバーがなければ、以下は消去する
export http_proxy=http://10.233.3.10:3128
export https_proxy=http://10.233.3.10:3128


  • カレントシェルに上記環境変数をセットする。

$ source /etc/profile.d/goenv.sh


  • git の proxy 設定


    • 10.233.3.10:3128 は自身の proxy サーバーに変更する

    • proxy がなければ設定の必要なし



$ git config --global http.proxy http://10.233.3.10:3128

$ git config --global https.proxy http://10.233.3.10:3128
$ cat ~/.gitconfig
[http]
proxy = http://10.233.3.10:3128
[https]
proxy = http://10.233.3.10:3128
[url "https://"]
insteadOf = git://


Deploy go-cve-dictionary, goval-dictionary



  • go-cve-dictionary をインストール


    • ログディレクトリ /var/log/vuls も作成



$ sudo mkdir /var/log/vuls

$ sudo chown vuls:vuls /var/log/vuls
$ sudo chmod 700 /var/log/vuls


  • go-cve-dictionary, goval-dictionary のインストール

$ 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
$ cd $GOPATH/src/github.com/kotakanbe
$ git clone https://github.com/kotakanbe/goval-dictionary.git
$ cd goval-dictionary
$ make install


  • vuls, vulsrepo の config、NVD, JVN, OVAL データベース用の専用ディレクトリを作成します。

$ sudo mkdir /usr/local/share/vuls

$ sudo chown vuls:vuls /usr/local/share/vuls


  • NVD, JVN, OVAL から脆弱性データベースを構築


    • RedHat 5,6,7 について取り込みます

    • RedHat 5 については 現在 ELS で早急に上位バージョンへの乗せ換えが必要、CentOS はに至ってはサポート切れで使ってはいけない OS です(参考: 各OSのリリース日とサポート終了日を表にまとめてみた

    • RedHat 5 については vuls は正式対応ではないので、警告を与える程度に使用してください。



$ cd /usr/local/share/vuls

$ for i in `seq 2002(date +"%Y")`; do go-cve-dictionary fetchnvd -years $i; done
-- 省略 --
$ for i in `seq 1998(date +"%Y")`; do go-cve-dictionary fetchjvn -years $i; done
-- 省略 --
$ goval-dictionary fetch-redhat 5 6 7


Deploy Vuls


  • /etc/profile.d/vuls.sh を作成し、下記を追加する。


    • カレントディレクトリがどこであろうとも、vuls だけでオプションが渡るようにします。




/etc/profile.d/vuls.sh

$ sudo vim /etc/profile.d/vuls.sh

function vuls() {
case $1 in
"scan")
/usr/local/share/go/bin/vuls $@ --config=/usr/local/share/vuls/config.toml;;
"configtest")
/usr/local/share/go/bin/vuls $@ --config=/usr/local/share/vuls/config.toml;;
"report")
/usr/local/share/go/bin/vuls $@ --config=/usr/local/share/vuls/config.toml -cvedb-path=/usr/local/share/vuls/cve.sqlite3 -ovaldb-path=/usr/local/share/vuls/oval.sqlite3;;
*)
;;
esac
}
alias vuls=vuls


  • カレントシェルに上記環境変数をセットする。

$ source /etc/profile.d/vuls.sh


  • 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


Deploy Vulsrepo

$ cd $GOPATH/src/github.com

$ git clone https://github.com/usiusi360/vulsrepo.git
$ cd $GOPATH/bin
$ ln -s $GOPATH/src/github.com/vulsrepo/server/vulsrepo-server .


Config


  • Vulsの設定ファイルを作成する(TOMLフォーマット)


/usr/local/share/vuls/config.toml

$ cd /usr/local/share/vuls

$ cat config.toml
[servers]

[servers.localhost]
host = "localhost"
port = "local"



  • config.toml の記述が正しいかどうかテストしましょう

$ vuls configtest


  • Vulsrepo の設定ファイルを作成する(TOMLフォーマット)


/usr/local/share/vuls/vulsrepo-config.toml

$ cd /usr/local/share/vuls

$ cat vulsrepo-config.toml
[Server]
rootPath = "/usr/local/share/go/src/github.com/vulsrepo"
resultsPath = "/usr/local/share/vuls/results"
serverPort = "5111"

[Auth]
authFilePath = "/usr/local/share/vuls/.htdigest"
realm = "vulsrepo_local"



  • そのままだと、vulsrepo がパスワード認証なしで見ることができるので basic 認証を加える


    • パスワードは vuls になります

    • ↑ vuls からの変更とオプションの意味については DigestAuth を参照してください



$ cd /usr/local/share/vuls

$ vulsrepo-server -m -c ./.htdigest


Always activate vulsrepo-server (CentOS7)


/usr/lib/systemd/system/vulsrepo.service

$ sudo vim /usr/lib/systemd/system/vulsrepo.service

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

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

[Install]
WantedBy = multi-user.target



  • 自動起動にして、vulsrepo を起動します

$ sudo chmod 644 /usr/lib/systemd/system/vulsrepo.service

$ sudo systemctl enable vulsrepo
Created symlink from /etc/systemd/system/multi-user.target.wants/vulsrepo.service to /usr/lib/systemd/system/vulsrepo.service.
$ sudo systemctl start vulsrepo


  • 認識しているか確認

$ systemctl list-unit-files --type=service|grep vulsrepo

vulsrepo.service enabled


  • 起動しているか確認


    • vulsrepo-config.toml の serverPort で指定するポートを listen しているか

    • taep-as-svc = 5111 (/etc/services を参照)

    • vulsrepo はそのまま Web サーバーなります



$ sudo lsof -i | grep taep-as-svc

vulsrepo- 7649 ansible 4u IPv6 1520439 0t0 TCP *:taep-as-svc (LISTEN)


  • vulsrepo-config.toml の serverPort で指定するポートが外から見えるように


    • --list-all で確認



$ sudo firewall-cmd --permanent --zone=public --add-port=5111/tcp

$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens4 ens3
sources:
services: dhcpv6-client ssh
ports: 5111/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:


  • (実行の必要なし)ちなみに 5111 ポートの閉鎖は

$ sudo firewall-cmd --permanent --zone=public --remove-port=5111/tcp


Cron


  • 以下処理をするスクリプトを置きます


    1. nvd, jvn, oval データベースを取り込み

    2. vuls scan

    3. vuls report で、 vulsrepo のデータを作る

    4. 過去データ消去


      • 何回分の vuls scan の結果をため込むかは BACKUPCYCLE で設定します。下記 BACKUPCYCLE=10 とすると 9 回分保存します。一日一回スキャンするとすると 9 日分です。





  • RedHat 5 については 現在 ELS で早急に上位バージョンへの乗せ換えが必要、CentOS はに至ってはサポート切れで使ってはいけない OS です(参考: 各OSのリリース日とサポート終了日を表にまとめてみた

  • RedHat 5 については vuls は正式対応ではないので、警告を与える程度に使用してください。


/usr/local/share/vuls/vuls-cron

$ cd /usr/local/share/vuls

$ cat vuls-cron
#!/bin/bash
BACKUPCYCLE=10
base_dir=${0%/*}
if [ $base_dir = $0 ]; then
base_dir="./"
fi
. /etc/profile.d/goenv.sh
. /etc/profile.d/vuls.sh
pushd $base_dir
if [ -z $http_proxy ] ; then
go-cve-dictionary fetchnvd -years $(date +"%Y")
go-cve-dictionary fetchjvn -years $(date +"%Y")
goval-dictionary fetch-redhat 5 6 7
else
go-cve-dictionary fetchnvd -http-proxy=$http_proxy -years $(date +"%Y")
go-cve-dictionary fetchjvn -http-proxy=$http_proxy -years $(date +"%Y")
goval-dictionary fetch-redhat -http-proxy=$http_proxy 5 6 7
fi
vuls scan >>/var/log/vuls/vuls-cron.log 2>&1
vuls report -format-json >>/var/log/vuls/vuls-cron.log 2>&1
# 古いものから順に消去
if [ -e "vulsrepo-config.toml" ]; then
resultpath=$(grep resultsPath vulsrepo-config.toml | sed -e "s/resultsPath[\t ]*=[\t \"\']*\(.*\)[\"\']/\1/i")
if [ -e "$resultpath" ]; then
for
dirname in `/bin/ls -d1 $resultpath/* | sed '/^$/d' | sort -r | sed -e "1,${BACKUPCYCLE}d" | sort`
do
/bin/rm -rfv $dirname
done
fi
fi
popd .


  • vuls-cron スクリプトを実行し vuls と vulsrepo の動作確認をします

$ cd /usr/local/share/vuls

$ chmod 775 vuls-cron
$ ./vuls-cron



  • Web からみてみます。 http://vulsrepoサーバーのIP:5111/


    • 今度は中身もでるはずです。




  • 指定時間に vuls-cron が動くようにします


    • 下記は一日一回、午前 8:00 に起動します




/etc/crontab

$ sudo vim /etc/crontab

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
00 08 * * * vuls /usr/local/share/vuls/vuls-cron