[Linux][Security] vulsを試す

経緯

久方ぶりにSoftware Design (2017年10月号) を買ったんですが、その中に「脆弱性スキャナ:vuls入門」という特集があり、興味を持ちました。ロゴもあるようでして。

Webサイトはココみたいです。

Vulsとは

脆弱性データベースと、管理下にあるサーバのソフトウェア情報を比較し、そのサーバがどのような脆弱性を有するのかをチェックするツールのようです。あくまでチェック・報告までが有する機能で、更新は別途考える必要があるとのことです。

セキュリティに疎い私ですが、せっかく興味を持ったのだしということで、導入してみることにしました。運用管理サーバが持つジョブ連携機能とも組み合わせてみたいな~とか、ここ最近理解してきたからこそ着手できたのかもしれないなーと思います。

今回想定する構成

今回想定している構成はこんな感じです。

サマるとこんな感じです。

  1. 統合管理サーバからジョブ実行命令をスケジュールに従い発行する
  2. スキャンサーバに最新の脆弱性情報をダウンロードする
  3. スキャンサーバよりLinuxサーバ群全体に対して脆弱性スキャンを実行する
  4. スキャン完了後、脆弱性レポートをメール送信する

前提パッケージのインストール

# yum -y install sqlite git gc wget gcc

go言語のインストール

■go言語の入手
# wget https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz

■go言語のインストール
# tar -C /usr/local -xzf go1.8.3.linux-amd64.tar.gz

■bash_profile設定の追加
# sh -c 'cat << "EOF" > /etc/profile.d/goenv.sh
> export GOROOT=/usr/local/go
> export GOPATH=$HOME/go
> export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
> EOF'

■bash_profile設定追加の反映
# source /etc/profile.d/goenv.sh

vuls実行ユーザの作成

■vulsユーザ・ワークディレクトリ作成(ワークディレクトリは/opt/vuls)
# useradd vuls -b /opt

■パスワード設定
# passwd vuls

■ログ保管ディレクトリの作成
# mkdir /var/log/vuls
# chown vuls /var/log/vuls
# chmod 700 /var/log/vuls

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

■vulsユーザへ切り替え
# su - vuls

■vuls関連ユーティリティインストールディレクトリ作成
$ mkdir -p $GOPATH/src/github.com/kotakanbe
$ cd $GOPATH/src/github.com/kotakanbe

■gitリポジトリからgo-cve-dictionaryをダウンロード
$ git clone https://github.com/kotakanbe/go-cve-dictionary.git

■ビルド&インストール
$ cd go-cve-dictionary/
$ make install
$ ../

goval-dictionaryのインストール

■gitリポジトリからgoval-dictionaryをダウンロード
$ git clone https://github.com/kotakanbe/goval-dictionary.git

■ビルド&インストール
$ cd goval-dictionary/
$ make install
$ cd ~/

脆弱性情報の取得

■NVDおよびJVNから過去2年間の脆弱性情報を入手する
$ go-cve-dictionary fetchnvd -last2y
$ go-cve-dictionary fetchjvn -last2y

■OVALからRedHat Enterprise Linux 6/7の脆弱性情報を入手する
$ goval-dictionary fetch-redhat 6
$ goval-dictionary fetch-redhat 7

vulsのインストール

■vulsインストールディレクトリ作成&移動
$ mkdir -p $GOPATH/src/github.com/future-architect
$ cd $GOPATH/src/github.com/future-architect

■gitリポジトリからvulsをダウンロード
$ git clone https://github.com/future-architect/vuls.git

■ビルド&インストール
$ cd vuls
$ make install
$ cd ~/

config.tomlの作成

■コンフィグファイルを作成する
$ vi config.toml
-----------
[email]
smtpAddr = "localhost"
smtpPort = "25"
#user = "username"
#password = "password"
from = "vuls@bluecore.net"
to = ["words@bluecore.net"]
cc = ["<ccメールアドレス>"]
subjectPrefix = "[vuls]"

[servers]
[servers.vuls]
host = "localhost"
port = "local"

[servers.XXXXX]
host = "192.168.XXX.XXX"
port = "22"
user = "root"
keyPath = "/opt/vuls/.ssh/id_rsa"
          :
          :
          :
----------
■注意事項を以下の通り示す。
・基本的に値は全部ダブルクォートで囲う。
・smtpAddrはFQDNを指定する必要がある模様。IPアドレスでは後述の設定テストで失敗する。
・user/passwordはSMTP認証しない場合は省略可能。
・localhostに対するport設定は「local」とする。
・リモートに対するアクセスは公開鍵埋め込みのSSHノーパスワードアクセスが必要
 ⇒スキャンサーバ、vulsアカウントで鍵ペアを作成し、各サーバの/root/.ssh/authorized_keysに埋め込むってやつ
・複数台サーバがあるものに関しては、[servers.XXXXX]を区切りとしてhost/port/user/keyPathを追加していけば良い。
 ⇒hostはIPアドレスでもホスト名でも良さそう。
 ⇒keypathはまぁ、同一になるよね。きっと。

スキャンの実行

■スキャン処理の実行
$ vuls scan

■出力結果はこんな感じ
[Oct 27 19:04:48] INFO [localhost] Start scanning
[Oct 27 19:04:48] INFO [localhost] config: /opt/vuls/config.toml
[Oct 27 19:04:48] INFO [localhost] Validating config...
[Oct 27 19:04:48] INFO [localhost] Detecting Server/Container OS... 
[Oct 27 19:04:48] INFO [localhost] Detecting OS of servers... 
[Oct 27 19:04:48] INFO [localhost] (1/14) Detected: vuls: centos 7.4.1708
[Oct 27 19:04:49] INFO [localhost] (2/14) Detected: sns-db: centos 7.3.1611
            :
[Oct 27 19:04:50] INFO [localhost] (13/14) Detected: kome: centos 7.2.1511
[Oct 27 19:04:53] INFO [localhost] (14/14) Detected: kaimon: centos 7.3.1611
[Oct 27 19:04:53] INFO [localhost] Detecting OS of containers... 
[Oct 27 19:04:53] INFO [localhost] Detecting Platforms... 
[Oct 27 19:05:05] INFO [localhost] (1/14) vuls is running on other
[Oct 27 19:05:05] INFO [localhost] (2/14) izanami is running on other
            :
[Oct 27 19:05:05] INFO [localhost] (13/14) kome is running on other
[Oct 27 19:05:05] INFO [localhost] (14/14) kaimon is running on other
[Oct 27 19:05:05] INFO [localhost] Scanning vulnerabilities... 
[Oct 27 19:05:05] INFO [localhost] Scanning vulnerable OS packages...

One Line Summary
================
vuls centos7.4.1708 0 updatable packages 
kamapuaa centos6.9 67 updatable packages 
           :
nandin centos6.9 59 updatable packages

To view the detail, vuls tui is useful.
To send a report, run vuls report -h.

レポートの作成

$ vuls report -to-email -lang=ja
⇒大量に該当するCVE情報が標準出力に出て来る。取り敢えず待ち、エラー無しでコマンドプロンプトに戻ればOK。

エラーの場合、こんな出力が最後に出る。
-----
[Oct 27 19:53:55] ERROR [localhost] Failed to report: Failed to send emails:
 535 5.7.8 Error: authentication failed: authentication failure
-----

今回、メール送信でだいぶ苦労をする羽目になりました。取り敢えずはlocalhostのpostfixからメールサーバへの転送をすることでメール送信が出来るようになりました。

メールはサーバ毎に個別送信されます。つまり、スキャン対象のサーバ台数分のメールが飛んできますので、そのつもりで。なお、virus reportのオプションスイッチとして、「-diff」を追加すると前回スキャンとの差分を表示するようになるようです。もしかしたら少しは見やすくなるのかもしれません。

スクリプトの作成(というか、単にコマンド並べただけ)

$ cd ~/
$ vi vuls_weekly.sh
-----
#!/bin/sh

cd /opt/vuls
/opt/vuls/go/bin/go-cve-dictionary fetchnvd -last2y
/opt/vuls/go/bin/go-cve-dictionary fetchjvn -last2y
/opt/vuls/go/bin/goval-dictionary fetch-redhat 6
/opt/vuls/go/bin/goval-dictionary fetch-redhat 7

/opt/vuls/go/bin/vuls scan -config=/opt/vuls/config.toml
/opt/vuls/go/bin/vuls report -to-email -lang=ja -config=/opt/vuls/config.toml > /dev/null 2>&1
-----
$ chmod +x vuls_weekly.sh

後やること

  1. Hinemos Agentの導入(ココに記載している)
  2. Hinemosクライアントから、Hinemos マネージャへ接続する
  3. vulsサーバをレポジトリ画面からノード追加する
  4. ジョブ管理画面にて、ジョブユニット・ジョブネット・コマンドジョブを作成する(この時、実行ユーザをrootではなくvulsユーザにすることを忘れずに)
  5. 作成したジョブユニットを実行登録する
  6. ジョブ管理(実行契機)にてスケジュールの新規作成を行う
  7. 後はスケジュール通りに実行されるか、実行後にサーバ毎のスキャン結果がメール送信されることを確認する

他にやりたいこと

実際やってみましたが、面白かったです。びっくりするほど脆弱性情報が出てきて涙が出てきました。ひとまず結果を見て反省の上、各サーバのyum updateを実行していきました。おかげさまでだいぶupdatable packagesは減りました。が、1日経過しただけでパッケージ数は増えているので、まぁ・・パッケージの数が数だけにしょうがないのかなと言う気もします。

他、やってみたいのはこんなこと。

  • VulsRepoと言うものを触ってみたい
    • グラフィカルにレポートを確認する事ができるらしいのでやってみたい
  • yum updateの処理一括化&スケジュール化
    • 一度昔やったことがあるんですが、全サーバ一括でやったらストレージが死にかけますた。加えてVMが一台死にますた。
    • もう少しきちんと順序立ててアップデートできる構成を考えたいなぁとか思っとります。