寝て起きて寝て

プログラミングが出来ない情報系のブログ

なうでヤングなセキュリティツールvulsの設定しslackに通知また自動更新する【ubuntu】※08/30更新

最後の自動設定の箇所実装間違えがあったので更新しました

Vulsの仕様変更に伴いScanで止まる不具合の対処法の記述をしました。

導入の経緯


最近vulsが流行ってることを知ってちょっといじるついでにslackのbotを一度作って みようと思ったから。

Vulsとは


毎日脆弱性の調査やソフトウェアアップデートをする作業は大変。

しかもアプリケーション環境を運用している場合、アップデートによるサービスの停止リスクを避けるために、パケージマネージャーの自動更新機能を使わず手動更新が多くなる。

しかしこれはシステム管理者にとって、とても負荷のかかる作業である

そこで使うサービスがvuls

Vulsには以下の特徴がある(以下githubから引用)

  • システムに関係ある脆弱性のみ教えてくれる

  • その脆弱性に該当するサーバを教えてくれる

  • 自動スキャンのため脆弱性検知の漏れを防ぐことができる

  • CRONなどで定期実行、レポートすることで脆弱性の放置を防ぐことできる

Vulsは以上のことができる。

VulsはCVEの情報を取得してサーバにインストールされているパッケージの脆弱性をチェックする。

CVEはソフトウェアの脆弱性をまとめたデータベースここにスコア別に脆弱性の情報が記録されている。

導入環境


  • ubuntu 14.04

  • vuls 0.1.4

  • go 1.6

今回の目標


  1. SSHの設定
  2. パッケージのインストール
  3. Goでスクリプトを作成
  4. go-cve-dictionaryをデプロイ
  5. Vulsインストール
  6. Vulsコンフィグファイル作成
  7. VulsのPrepareとScan
  8. Slackの通知
  9. 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)

  • gcc

  • 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