vulsの導入・slackの日次通知

みなさんこんにちは、虎の穴ラボです。

今回は、各サービスのサーバにインストールされているパッケージのセキュリティチェックとslack通知の導入を行います。

導入の経緯

弊社のサービスは、KEEPER、とらのあなクラフトなど様々なサービスごとに複数台のサーバがあり
AWS、GCP、ConoHaなど多様なインフラプラットフォームを使用しています。

それ故、手動でセキュリティチェックを行うと管理コストが高くなってしまいます。
そこで、vulsで毎日セキュリティを行い、slackに通知するようにしました。


vulsの構築の方法は
↓のページを参考にしました。
https://blog.dshimizu.jp/article/810

パッケージインストール

yum install apt install ca-certificates git openssh-server sqlite build-essential wget curl

ユーザ作成

groupadd -g 20001 vuls
useradd -u 20001 -g vuls -G sudo -d /home/vuls -m vuls -s /bin/bash
vim /etc/sudoers.d/vuls

vuls ALL=NOPASSWD: ALL

sudo su - vuls

ssh鍵設定

mkdir .ssh
chmod 700 .ssh
ssh-keygen -t rsa -b 4096 -C "foo@example.com"
cat ~/.ssh/id_rsa.pub >> .ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

goのインストール

wget https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.8.3.linux-amd64.tar.gz
vim .bashrc
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
mkdir ~/go

以下のコマンド実行時にエラーが出なければgoのインストール完了

go version

ログ用のディレクトリ作成

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

go-cve-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
for i in {2002..2017}; do go-cve-dictionary fetchnvd -years $i; done

goval-dictionaryのインストール

cd $GOPATH/src/github.com/kotakanbe
git clone https://github.com/kotakanbe/goval-dictionary.git
cd goval-dictionary
make install
cd
goval-dictionary fetch-redhat 7
goval-dictionary fetch-amazon

goval-dictionaryのオプションを変更するとredhat系(CentOS)やAmazon Linuxの他にUbuntuなどもセキュリティチェックできます
下のリンクにredhat系やAmazon Linux以外のOSをセキュリティチェックしたいときのやり方が載っています。
https://github.com/kotakanbe/goval-dictionary

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のコンフィグファイルを設定します

cd
vim config.toml

コンフィグファイルには、対象のサーバを指定します。
今回、slack通知を行うため、slackの設定も入れています。

[default]
port = "22"

[slack]
hookURL      = "https://hooks.slack.com/services/YYYYYYYYY/XXXXXXXXX/ZZZZZZZZZZZZZZZ"
channel      = "#dev-infra"
authUser     = "vuls-test"

[servers.keeper-ap1]
host = "ec2-255-255-255-255.ap-northeast-1.compute.amazonaws.com"
user = "centos"
keyPath = "/home/vuls/key/KEEPER-AP1-KEY.pem"

[servers.keeper-ap2]
host = "ec2-255-255-255-254.ap-northeast-1.compute.amazonaws.com"
user = "centos"
keyPath = "/home/vuls/key/KEEPER-AP2-KEY.pem"

以下のコマンドで設定に問題ないかどうかがチェックできます。

vuls configtest

※対象のサーバが初接続の場合は失敗するので、1回ssh接続をしてからテストします。

問題なければ以下のコマンドを打ちます。

vuls scan -deep
vuls report -to-slack

slackに通知が来るので内容を確認します。
f:id:toranoana-lab:20180906195614p:plain




これで、vulsによるセキュリティチェックができるようになったので、
cronで定時実行します。↓参考サイト
https://blog.adachin.me/archives/5619

cronの設定

crontab -e
#vuls dictionary update
00 19 * * * sudo -u vuls /home/vuls/go/bin/go-cve-dictionary fetchnvd -last2y -dbpath=/home/vuls/cve.sqlite3
00 22 * * * sudo -u vuls /home/vuls/go/bin/go-cve-dictionary fetchjvn -latest -dbpath=/home/vuls/cve.sqlite3

#vuls scan/report
00 0 * * * sudo -u vuls /home/vuls/go/bin/vuls scan -deep -config=/home/vuls/config.toml -results-dir=/home/vuls/results -cachedb-path=/home/vuls/cache.db
20 0 * * * sudo -u vuls /home/vuls/go/bin/vuls report -cvedb-path=/home/vuls/cve.sqlite3 -ovaldb-path=/home/vuls/oval.sqlite3 -config=/home/vuls/config.toml -results-dir=/home/vuls/results -format-short-text -format-json -to-slack -lang=ja

#vuls results remove
00 18 * * * sudo find /home/vuls/results/ -mtime +30 -exec rm -f {} \;


これで、時間になれば通知が来ます。
f:id:toranoana-lab:20180906192526p:plain
※サーバの時刻ががUTCなので、cronの設定+9時間に来てます。



これで、毎日サーバにインストールされているパッケージの脆弱性をチェックできます。
また、3ヶ月程度セキュリティのセキュリティーアップデートをしなかっただけでこれだけの脆弱性の発見があるので
日々のチェックの重要性を感じました。


最後に、虎の穴ではRubyエンジニアをはじめとして一緒に働く仲間を絶賛募集中です。
この記事を読んで、興味を持っていただけた方はぜひ弊社の採用情報をご覧下さい。
www.toranoana.jp