tjinjin's blog

インフラ要素多めの個人メモ

サーバの脆弱性チェックできるVulsをdockerを使って試した

世のインフラエンジニアの方々は、何らかの形で利用しているソフトウェアのセキュリティ情報を日々チェックしていると思います。しかし、利用するソフトウェアが増えてくると全部のチェックはなかなか難しいのではないでしょうか。

そんな中最近Amazon Inspectorがプレビューから一般利用開始となり、注目されている方もいると思います。そういったツールが様々出る中で、最近Vulsというものを知ったので試してみたいと思います。

Vulsとは

github.com

scan対象サーバのパッケージやフレームワームに脆弱性がないか、脆弱性情報を元にして検査するツールです。

Amazon Inspectorとの違い

運用観点で言うと大きな違いはInspectorはSaaSでVulsは自分で運用する点、あとはエージェントの有無でしょうか。VulsはSSHでチェックするのでエージェントは不要です。

Amazon Inspector (自動化されたセキュリティ評価サービス) | AWS

またセキュリティのチェックの範囲が違います。以下はAmazon Inspectorについてです。

  • Common Vulnerabilities and Exposures
  • CIS Operating System Security Configuration Benchmarks
  • Security Best Practices
  • Runtime Behavior Analysis

ざっくり言うとOSパッケージや、ネットワーク周りのセキュリティ強度なども見てくれるので、脆弱性診断ツールのような位置づけな印象です。フレームワークRailsなど)の脆弱性は見てくれないようでした。

一方Vulsは利用しているパッケージに脆弱性があるのかチェックするようなツールです。チェックの仕方は単純に今利用しているパッケージのバージョンとcveなどの情報を照らし合わせるようなイメージでしょうか。フレームワークもチェックできるので、脆弱性に限って言えばこちらの方が幅広くみれそうです。

go-cve-dictionaryについて

CVEの情報を取得するツールです。NVDとJVNの情報をローカルにコピーします。取得したデータとサーバの情報を照らし合わせる部分をVulsが担っています。

実際に使ってみる

リポジトリにサンプル用のDockerfileがあるのでdockerを使って試してみます。

検証環境のバージョン

Vuls server

今回はローカルのMacにあるdocker上で動かします。

  • docker 1.11.0
  • centos7-hvm

scan対象サーバ

VMでもいいのですが、今回はEC2を使うことにしました。

  • EC2 t2.micro
  • Centos7

事前準備

$ git clone git@github.com:future-architect/vuls.git
$ cd vuls/docker # 今後ここで作業します

ローカルにcloneしたらscan対象サーバの準備をします。

  • AWS上にサーバを立てる
  • 上記に鍵を登録する(dockerコンテナからログインできるようにする)

dockerコンテナからEC2インスタンスにログインできるように、EC2に登録されている鍵をid_rsaというファイルにリネームしてカレントディレクトリに作っておきます。そうするどdocker build内でコンテナに追加され、対象サーバにコンテナからログインできるようになります。

slack通知を試す

事前の準備が出来たので、実際に動かします。

まず、configファイルを修正します。

$ cat config.toml
[servers]

[servers.hogehoge]
host      = "hogehoge"
port      = "22"
user      = "centos"
keyPath   = "/app/id_rsa"

[slack]
hookURL      = "https://hooks.slack.com/services/XXXXXXXXXXX/XXXXXXXX/XXXXX"
channel      = "general"
iconEmoji    = ":ghost:"
authUser     = "username"
notifyUsers  = ["@here"]

見ての通りですが、EC2インスタンスSSHログインするための情報を設定ファイルに持たせます。設定がうまく行っていればdockerコンテナを起動させるとするに実行されるようにスクリプトが用意されています。スクリプトの中身は下記のようになっています。

## run.sh

#!/bin/bash
go-cve-dictionary server &
sleep 2
vuls scan -config /app/config.toml -report-slack

試しにこの状態で実行してみます。

$ docker build -t .
$ docker run -ti vuls
[Apr 24 01:37:27] ERROR [hogehoge:22] yum-plugin-changelog is not installed
[Apr 24 01:37:27] ERROR [localhost] Please execute with [prepare] subcommand to install required packages before scanning
[Apr 24 01:37:27] ERROR [localhost] Failed to scan. err: centos@52.68.242.209:22: yum-plugin-changelog is not installed

上記エラーはscan対象サーバに前提パッケージが入っていない場合のエラーでした。Centos7の場合scan対象サーバにyum-plugin-security, yum-plugin-changelogが必要です。OS毎に前提パッケージが違いますので、READMEを確認しましょう。

GitHub - future-architect/vuls: Vulnerability scanner for Linux, agentless, written in golang.

ただ、Vulsにはprepareコマンドが用意されているので、そのコマンドを実行すればインストールすることができます。便利ですね。

$ vuls prepare -config /app/config.toml

今回は面倒ですが、EC2インスタンスにログインしてパッケージを導入しておきました。インストールが終わったら再度実行してみます。

コマンドがうまくいくとまず、go-cve-dictionaryが起動し、その後scanが実施されます。今回のようにslack通知の設定をしておくと、slackに通知されます。

f:id:cross_black777:20160507145421p:plain

デフォルトだとすべての脆弱性が通知されますが、実行時に-cvss-over 6.5のようにCVSSのレベルを指定できるので重要度の高いものだけ出力させることも可能です。

TUI(Terminal-Based User Interface)を試す

slack通知でもよいですが、TUIが用意されているのでそちらも使ってみます。今のままだとスクリプトが終わるとdockerコンテナが死ぬので、手動で実行するようにします。

...
COPY config.toml .
COPY run.sh .
# コメントアウトする
# ENTRYPOINT ["/bin/bash", "/app/run.sh"]
COPY id_rsa .
COPY id_rsa.pub .

この状態でbuild,runを実行します。

$ docker build -t vuls
$ docker run -ti vuls
# go-cve-dictionary server &
# vuls scan -config /app/config.toml

初期処理が終わるとtuiが利用できるようになります。

$ vuls tui

f:id:cross_black777:20160507154809p:plain

OSパッケージ以外もチェックする

vulsでは設定をすることでRailsなどの脆弱性も確認することができます。立てたサーバにRailsアプリをデプロイしたので、試してみます。OSパッケージでないものはCPEというところからデータ拾ってくるようです。

$ cat config.toml
[servers]

[servers.hogehoge]
host      = "hogehoge"
port      = "22"
user      = "centos"
keyPath   = "/app/id_rsa"
cpeNames = [
  "cpe:/a:rubyonrails:ruby_on_rails:4.0.5",
]

cpeNAmesというところで、フレームワークの名前とバージョンを指定します。設定を変更して再度dockerを実行してみます。

$ docker build -t vuls
$ docker run -ti vuls
# go-cve-dictionary server &
# vuls scan -config /app/config.toml

f:id:cross_black777:20160507152059p:plain

無事Rails関連の脆弱性情報を取得できました。

まとめ

まだ運用イメージが湧いてないのですが(脆弱性情報をslackに投げていいのかや、vulsサーバたてるならどこで運用するか、サービス毎に分けるか、CI的な使い方をするかなど)、前から欲しいなと思ってたので、すごくわくわくしています!開発もどんどん進んでいるようで、FreeBSDやネットワーク機器への対応も検討されているようです。作者が日本人なので、参加へのハードルが低いのでどんどん協力していきたいものです(Go勉強中)。また、Amazon Inspectorの方もまだ使ったことがないので早いうちにチェックしておきたいと思います。