サーバの脆弱性チェックできるVulsをdockerを使って試した
世のインフラエンジニアの方々は、何らかの形で利用しているソフトウェアのセキュリティ情報を日々チェックしていると思います。しかし、利用するソフトウェアが増えてくると全部のチェックはなかなか難しいのではないでしょうか。
そんな中最近Amazon Inspectorがプレビューから一般利用開始となり、注目されている方もいると思います。そういったツールが様々出る中で、最近Vulsというものを知ったので試してみたいと思います。
Vulsとは
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 [email protected]: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: [email protected]: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に通知されます。
デフォルトだとすべての脆弱性が通知されますが、実行時に-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
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
まとめ
まだ運用イメージが湧いてないのですが(脆弱性情報をslackに投げていいのかや、vulsサーバたてるならどこで運用するか、サービス毎に分けるか、CI的な使い方をするかなど)、前から欲しいなと思ってたので、すごくわくわくしています!開発もどんどん進んでいるようで、FreeBSDやネットワーク機器への対応も検討されているようです。作者が日本人なので、参加へのハードルが低いのでどんどん協力していきたいものです(Go勉強中)。また、Amazon Inspectorの方もまだ使ったことがないので早いうちにチェックしておきたいと思います。