るいすときのこの物語

オタクエンジニアの雑記

脆弱性スキャナ「vuls」を cron で定期的にスキャンする


バイト先で動いているサーバーが多いため脆弱性に関しては大きく問題にならないと気づかなかったりします。 そんな中で便利なツールを見つけた。

 

vuls

@kotakabe さんという日本人が作ったものなので日本語もサポートされています。 日本語の脆弱性情報をJVNから取得し、スキャンを行った結果を Slack に通知することも可能!

 

 

環境

・CentOS 7.2.1511 ・go1.6.2

 

Golang のインストール

現時点(2016/05/17)での最新は 1.6.2 でした。 最新版は公式サイトで確認してください。

# cd /usr/local/src
# wget https://storage.googleapis.com/golang/go1.6.2.linux-amd64.tar.gz
# tar -C /usr/local/ -xzf go1.6.2.linux-amd64.tar.gz

 

Go 用のワークスペースの作成

# mkdir -p /var/golang

 

Go 実行パスの設定

/root/.bashrc に下記を追記

export GOROOT=/usr/local/go
export GOBIN=$GOROOT/bin
export GOPATH=/var/golang
export PATH=$PATH:$GOBIN

 

設定の反映

# source /root/.bashrc

 

動作確認

# which go
/usr/local/go/bin/go

# go version
go version go1.6.2 linux/amd64

問題なく表示できれば Golang のインストールは終了です。

 

 

go-cve-dictionary のインストール

脆弱性情報をダウンロードして、サーバーモードで起動することで 簡単に参照ができるといったもの。

# mkdir /var/log/vuls
# chmod 700 /var/log/vuls
# go get github.com/kotakanbe/go-cve-dictionary

 

JVNから日本語の脆弱性情報を取得

1時間以上かかります。 カレントディレクトリに cve.sqlite3 ができていることを確認。

# go-cve-dictionary fetchjvn -entire

 

サーバーモードで起動する

# go-cve-dictionary server &
[May 17 20:25:55]  INFO Opening DB. datafile: /root/cve.sqlite3
[May 17 20:25:55]  INFO Migrating DB
[May 17 20:25:55]  INFO Starting HTTP Sever...
[May 17 20:25:55]  INFO Listening on 127.0.0.1:1323

ここで # ls とか適当なコマンドを打てば入力待ちに戻れます。

 

 

vuls のインストール

# go get github.com/future-architect/vuls

 

設定ファイルの作成

cve.sqlite3 と同じディレクトリに作成しておきましょう。

[slack]
hookURL = ""
channel = "#vuls"
authUser = "buri"
#notifyUsers = ["@username"]

[servers]

[servers.192-168-20-3]
host = "192.168.20.3"
port = "22"
user = "root"
# パスワード認証の場合
password = ""
# 鍵認証
#keyPath = "/home/path/to/id_rsa"

スキャンした結果を Slack へ通知してみます。 その他詳しい通知の仕方は Github を見て下さい。

 

前準備

# vuls prepare

WARN[0000] [Depricated] password and keypassword in config file are unsecure. Remove them immediately for a security reason. They will be removed in a future release. 
INFO[0000] Start Preparing (config: /root/vuls/config.toml) 
[May 17 21:31:53]  INFO [localhost] Detecting OS... 
[May 17 21:31:53]  INFO [localhost] (1/1) Successfully detected. 192-168-20-3: centos 6.7
[May 17 21:31:53]  INFO [localhost] Installing...
[May 17 21:31:53]  INFO [192-168-20-3:22] Ignored: yum-plugin-security already installed
[May 17 21:31:54]  INFO [192-168-20-3:22] Ignored: yum-plugin-changelog already installed
[May 17 21:31:54]  INFO [localhost] Success

前もってリモート先に yum-plugin-security と yum-plugin-changelog がインストールされます。

 

実行

# vuls scan -lang=ja -report-slack

と実行すれば結果が表示されると思います。 その他のオプションについては # vuls scan -h で見れます。

ERROR [localhost] CVE HTTP server is not running. cveapi.cvedictClient{baseURL:""}

こんなエラーが表示された場合は # go-cve-dictionary server がきちんと動いているか確認しませう。

FireShot Capture 50 - 21_servers I MediaLobby Slack - https___mel-tut.slack.com_messages_21_servers_

buri ちゃんはどっかの企業のBOT名からパクりました。 バイト先で多分活躍してるであろう buriちゃん です。

Web のように脆弱性が見つからなかった場合は上記のように。 脆弱性が見つかるとスコアが高い順に表示されます。

 

 

定期的に実行をする

本題はここからです。 もちろん cron を使用して行いますがどうも # go-cve-dictionary server のプロセスが定期的に死んでしまい、スキャン前に実行するようにしないといけません。(何か知っている人がいれば教えて下さい)

# 定義ファイルのダウンロード 毎日 3時 #
0 3 * * * cd /root; /usr/local/go/bin/go-cve-dictionary fetchjvn -week > /dev/null 2>&1
# go-cve-dictionary server start #
55 8 * * * cd /root; /usr/local/go/bin/go-cve-dictionary server 2>&1 > /dev/null 2>&1
# スキャンの実行 毎日6時 #
0 9 * * * source /root/.bashrc; vuls scan -lang=ja -report-slack > /dev/null 2>&1

毎日午前3時に定義ファイルを取得し、午前8時55分にサーバーを起動し、午前9時にスキャンをするようにしてます。 go-cve-dictionary コマンドに関しては絶対パスで指定しないとダメでした。

また、スキャンを行う前に vuls が使えるように .bashrc を読み込んでおく必要があります。