なうでヤングなセキュリティツールvulsの設定しslackに通知また自動更新する【ubuntu】※08/30更新
最後の自動設定の箇所実装間違えがあったので更新しました
Vulsの仕様変更に伴いScanで止まる不具合の対処法の記述をしました。
- 導入の経緯
- Vulsとは
- 導入環境
- 今回の目標
- SSHの設定
- パッケージのインストール
- Goでスクリプトを作成
- vulsのログディレクトリ作成
- go-cve-dictionaryをデプロイ
- Vulsインストール
- Vulsコンフィグファイル作成
- VulsのPrepareとScan
- Slackの通知
- Vulsの自動化
- 参考サイト
導入の経緯
最近vulsが流行ってることを知ってちょっといじるついでにslackのbotを一度作って みようと思ったから。
Vulsとは
毎日脆弱性の調査やソフトウェアアップデートをする作業は大変。
しかもアプリケーション環境を運用している場合、アップデートによるサービスの停止リスクを避けるために、パケージマネージャーの自動更新機能を使わず手動更新が多くなる。
しかしこれはシステム管理者にとって、とても負荷のかかる作業である
そこで使うサービスがvuls
Vulsには以下の特徴がある(以下githubから引用)
システムに関係ある脆弱性のみ教えてくれる
その脆弱性に該当するサーバを教えてくれる
自動スキャンのため脆弱性検知の漏れを防ぐことができる
CRONなどで定期実行、レポートすることで脆弱性の放置を防ぐことできる
Vulsは以上のことができる。
VulsはCVEの情報を取得してサーバにインストールされているパッケージの脆弱性をチェックする。
CVEはソフトウェアの脆弱性をまとめたデータベースここにスコア別に脆弱性の情報が記録されている。
導入環境
ubuntu 14.04
vuls 0.1.4
go 1.6
今回の目標
- SSHの設定
- パッケージのインストール
- Goでスクリプトを作成
- go-cve-dictionaryをデプロイ
- Vulsインストール
- Vulsコンフィグファイル作成
- VulsのPrepareとScan
- Slackの通知
- Vulsの自動化
SSHの設定
SSHの設定をしてある場合はここは飛ばしても大丈夫・・・ではない
今回は自分から自分のサーバへSSH接続をする為もう一個作っておいたほうがいい
外部から接続している場合は別の鍵作ったほうがいいと思います!
$cd ~/.ssh $ssh-keygen -t rsa -C comment -f vuls_rsa $cat vuls_rsa.pub >> authorized_keys $chmod 600 ~/.ssh/authorized_keys $rm vuls_rsa.pub
ssh-keygenのpassphraseはつけないでEnter2回
パッケージのインストール
今回使うパッケージは以下の通り
sqlite3
git(versionが1.7以上のほうがいい今回は1.9推奨は2)
go *version 1.6以上のもの
$ sudo yum install -y sqlite3 git gcc
goはそのまま落としてくるとバージョンが古いのでgvmを使う
もし先に古いバージョンのGOが入っているならアンインストールしておく
$sudo apt install curl git mercurial make binutils bison gcc build-essential $bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer) $[[ -s "/home/hoge/.gvm/scripts/gvm" ]] && source "/home/hoge/.gvm/scripts/gvm" $sudo reboot $sudo apt install -y bison $gvm listall $gvm install go1.4 $gvm use go1.4 $export GOROOT_BOOTSTRAP=$GOROOT $gvm install go1.6.3 $gvm use go1.6.3 --default $ go version go version go1.6.3 linux/amd64
ポイントは先に1.4をinstallしておくこと
Goでスクリプトを作成
$ sudo vim /etc/profile.d/goenv.sh $export GOROOT=/usr/local/go $export GOPATH=$HOME/go $export PATH=$PATH:$GOROOT/bin:$GOPATH/bin $ source /etc/profile.d/goenv.sh
vulsのログディレクトリ作成
$ sudo mkdir /var/log/vuls $ sudo chown "ユーザ名" /var/log/vuls $ sudo chmod 700 /var/log/vuls $ toudh /var/log/vuls/vuls.log #自動で使用する
go-cve-dictionaryをデプロイ
2002年~2016年のCVE情報を取得
$cd ~ $for i in {2002..2016}; do go-cve-dictionary fetchnvd -years $i; done $ ls -alh cve.sqlite3 -rw-r--r-- 1 user 557M 7月 27 22:17 cve.sqlite3
ここでくっそ時間がかかった。ほかのサイトだと30分とか言ってたけどそんなもんじゃ終わらなかった (多分みんなやって混んでたのかなぁ・・・)
Vulsインストール
$ go get github.com/future-architect/vuls
何も出ないで少し時間がかかるけど待ってればおk
Vulsコンフィグファイル作成
$ cd ~ $ vim config.toml
設定ファイルを以下のように記述するのだが ここから重要
[servers.xxx-xxx-xxx-xxx]の部分のxxxはそのサーバのIPアドレスが記述されるのだが
.(ピリオド)を使うとエラーになるので-(ハイフン)を使う
[servers] [servers.xxx-xxx-xxx-xxx] host = "xxx.xxx.xxx.xxx" port = "22" user = "[ユーザー名]" keyPath = "[さっき作ったSSHキー(秘密鍵)のpathを記述]"
記述し終わったらconfigtestでSSH接続できるかを確認する
$ vuls configtest [Jul 28 14:34:34] INFO [localhost] Validating Config... [Jul 28 14:34:34] INFO [localhost] Detecting Server/Contianer OS... [Jul 28 14:34:34] INFO [localhost] Detecting OS of servers... [Jul 28 14:34:35] INFO [localhost] (1/1) Detected: address: ubuntu 14.04 [Jul 28 14:34:35] INFO [localhost] Detecting OS of containers... [Jul 28 14:34:35] INFO [localhost] SSH-able servers are below...
VulsのPrepareとScan
次に脆弱性のスキャンを開始!といきたいところだがこのスクリプトを実行するとapt-get updateが実行されるので、権限が無いとERRORが出る。
vuls prepare INFO[0000] Start Preparing (config: /home/username/config.toml) [Jul 28 14:37:41] INFO [localhost] Detecting OS... [Jul 28 14:37:41] INFO [localhost] Detecting OS of servers... [Jul 28 14:37:42] INFO [localhost] (1/1) Detected: address: ubuntu 14.04 [Jul 28 14:37:42] INFO [localhost] Detecting OS of containers... [Jul 28 14:37:42] INFO [localhost] SSH-able servers are below... address [Jul 28 14:37:42] INFO [localhost] Installing... [Jul 28 14:37:42] INFO [address] apt-get update... [Jul 28 14:37:44] ERROR [address] Failed to SSH: SSHResult: servername: address, cmd: set -o pipefail; echo ***** | sudo -S apt-get update, exitstatus: 1, stdout: [sudo] password for username: Sorry, try again. [sudo] password for username: sudo: 1 incorrect password attempt , stderr: , err: %!!(MISSING)s(<nil>) [Jul 28 14:37:44] ERROR [localhost] Failed: usernameadress:22: Failed to SSH: SSHResult: servername: address, cmd: set -o pipefail; echo ***** | sudo -S apt-get update, exitstatus: 1, stdout: [sudo] password for username: Sorry, try again. [sudo] password for username: sudo: 1 incorrect password attempt , stderr: , err: %!!(MISSING)s(<nil>)
これを実行するためには2つの方法があります(僕個人では)
8/30日追記1のやり方は非推奨になりました
1. 実行する際パスワードを記述するようにする
2.apt-getでの実行ではroot権限をなくす
1のやり方は
vuls scan -cve-dictionary-dbpath=$PWD/cve.sqlite3 -ask-sudo-password
といったように-ask-sudo-password
を記述する
しかしこれは自動化するためには少し不便なのでここでは2番目の案を採用します
$ sudo visudo
開いたファイルの# Allow members of group sudo to execute any command
の部分に以下のように記述する
8/30ファイルの記述を追記(/usr/bin/apt-cacheの部分)
ユーザー名 ALL=NOPASSWD: /usr/bin/apt-get, /usr/bin/apt-cache
これを保存する。
これでapt-getの部分でエラーが出なくなる
$ vuls prepare INFO[0000] Start Preparing (config: /home/username/config.toml) [Jul 28 14:52:17] INFO [localhost] Detecting OS... [Jul 28 14:52:17] INFO [localhost] Detecting OS of servers... [Jul 28 14:52:18] INFO [localhost] (1/1) Detected: address: ubuntu 14.04 [Jul 28 14:52:18] INFO [localhost] Detecting OS of containers... [Jul 28 14:52:18] INFO [localhost] SSH-able servers are below... address [Jul 28 14:52:18] INFO [localhost] Installing... [Jul 28 14:52:18] INFO [address] apt-get update... [Jul 28 14:52:26] INFO [localhost] Success $ vuls scan -cve-dictionary-dbpath=$PWD/cve.sqlite3 INFO[0000] Start scanning INFO[0000] config: /home/username/config.toml INFO[0000] cve-dictionary: /home/username/cve.sqlite3 [Jul 28 14:54:39] INFO [localhost] Validating Config... [Jul 28 14:54:39] INFO [localhost] Detecting Server/Contianer OS... [Jul 28 14:54:39] INFO [localhost] Detecting OS of servers... [Jul 28 14:54:40] INFO [localhost] (1/1) Detected: address: ubuntu 14.04 [Jul 28 14:54:40] INFO [localhost] Detecting OS of containers... [Jul 28 14:54:40] INFO [localhost] SSH-able servers are below... address [Jul 28 14:54:40] INFO [localhost] Detecting Platforms... [Jul 28 14:54:43] INFO [localhost] (1/1) address is running on other [Jul 28 14:54:43] INFO [localhost] Scanning vulnerabilities... [Jul 28 14:54:43] INFO [localhost] Check required packages for scanning... [Jul 28 14:54:43] INFO [localhost] Scanning vulnerable OS packages... [Jul 28 14:54:55] INFO [address] Fetching CVE details... [Jul 28 14:54:55] INFO [address] Done [Jul 28 14:54:55] INFO [localhost] Scanning vulnerable software specified in the CPE... [Jul 28 14:54:55] INFO [localhost] Insert to DB... [Jul 28 14:54:56] INFO [localhost] Reporting... address (ubuntu14.04) ========================= No unsecure packages.
最後に脆弱性試験結果の出力
$ vuls tui
これでvulsの導入は終わり
Slackの通知
最初にSlackのteamと投稿したいchannelを作っておいてください。
URLの準備
SlackのIncoming WebHookの設定ページで投稿用URLを発行する
先ほど作ったchannel名をプルダウンメニューから選択し、
Add Incoming WebHooks integration
を押す。
発行されたWebhookURLを控えておく。
次にサーバ側の設定を行う。設定ファイルconfig.toml
を開き以下の文を追記する
[slack] hookURL = "https://hooks.slack.com/services/xxxxxxxx/xxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxx" channel = "チャンネル名" iconEmoji = ":ghost:" authUser = "vuls" notifyUsers = ["@username"]
保存してvuls scan -cve-dictionary-dbpath=$PWD/cve.sqlite3 -report-slack
を入力。これでslackにも通知が行くはず
Vulsの自動化
自動化は上でやってきたことをやるだけ
具体的には
- go-cve-dictionaryの更新
- Vuslのupdate
- CVEの情報の更新
- Vulsでスキャン
を毎日行うスクリプトを作る
$ cd ~ $ vim vuls_script.sh
以下のように記述する
#!/bin/bash cd ~ echo "###################" echo "vuls program start" echo "###################" echo "go-cve-dictionaryの更新" go get -u github.com/kotakanbe/go-cve-dictionary echo "Vulsの更新" go get -u github.com/future-architect/vuls echo "Update NVD Data" go-cve-dictionary fetchnvd -last2y echo "Vulsでスキャン" vuls scan -cve-dictionary-dbpath=$PWD/cve.sqlite3 -report-slack echo "###################" echo "vuls program end" echo "###################"
パーミッションは755
ここから更新
毎日実行させるにはcron.d
をいじる
毎日実行させるにはcrontab
をいじる
$ crontab -e
PATH=[ユーザで設定しているgoとgvmのPATHを入力] GVM_ROOT=[設定しているGVM_ROOTを入力] GOPATH=[設定しているGOPATHを入力] LOG_DIR=/var/log 10 09 * * * /home/ユーザー名/vuls_script.sh > $LOG_DIR/vuls/vuls.log 2>&1
PATH,GVM_ROOT,GOPATHの確認方法はコマンドライン上で
$PATH
,$GVM_ROOT
,GOPATH
と入力
Slackに通知が着てたら成功
または/var/log/vuls/vuls.log
ファイルを確認ししっかり実行されているかエラーが出ていないかを確認しておく
この設定だと朝の9時10分にこのシェルスクリプトが実行される
今回ホーム直下に作ったので少しきたないね・・・
その辺は各自移動してください。
おすすめは/opt
/opt/ └── vuls ├── config.toml ├── cve.sqlite3 ├── vuls.sqlite3 └── vuls_script.sh
お疲れ様でした。
参考サイト
セキュリティテストツールvulsをインストールしてみた | Developers.IO
あなたのサーバは本当に安全ですか?今もっともイケてる脆弱性検知ツールVulsを使ってみた - Qiita
vuls初歩的なエラーへの対処まとめ – ZacoDesign
vuls/README.ja.md at master · future-architect/vuls · GitHub