みなさんこんにちは、虎の穴ラボです。
今回は、各サービスのサーバにインストールされているパッケージのセキュリティチェックと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に通知が来るので内容を確認します。
これで、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 {} \;
これで、時間になれば通知が来ます。
※サーバの時刻ががUTCなので、cronの設定+9時間に来てます。
これで、毎日サーバにインストールされているパッケージの脆弱性をチェックできます。
また、3ヶ月程度セキュリティのセキュリティーアップデートをしなかっただけでこれだけの脆弱性の発見があるので
日々のチェックの重要性を感じました。
最後に、虎の穴ではRubyエンジニアをはじめとして一緒に働く仲間を絶賛募集中です。
この記事を読んで、興味を持っていただけた方はぜひ弊社の採用情報をご覧下さい。
www.toranoana.jp