IDCF テックブログ

IDCF テックブログ

クラウド・データセンターを提供するIDCフロンティアの公式テックブログ

コミュニティテンプレート Vuls の利用とTips

こんにちは。株式会社アールワークスの井上と申します。

VulsユーザーズグループであるVulsのSlackに参加している関係で、記事を書く機会をいただきました。 IDCFクラウド アンバサダープログラムのMORIO Dojoにも参加しています(白帯のままです...)。

前回は、Vulsのミートアップである Vuls祭りVol.1の記事を書きました。引き続き、Vulsの記事を寄稿させていただきます。
さて先日、IDCFエバンジェリストグループの方から、Vulsのコミュニティテンプレートが公開されました。 今回は、このコミュニティテンプレートについて内容を確認し、追加の情報を提供させていただきます。

  • 始まりのVuls/VulsRepo (Vulsを使ってみよう)
  • Vulsコミュニティテンプレート利用時に役立つTips
  • Vulsコミュニティテンプレートの構成について
  • Vulsミートアップ「Vuls祭り #2」のご紹介 & 有用なリンク集
  • 最後に

まずは、Vulsアップデートはせず、テンプレートのまま使ってみましょう。

始まりのVuls/VulsRepo

そもそも、Vuls/VulsRepoとは

f:id:kkamiyakenshiroh:20170412192907p:plain
Vulsは、OSSの脆弱性検知ツールです。Githubで公開されています。

  • コミュニティはSlackにあります。自由に参加可能です
  • 英語圏での反響もあるため、GithubのPullRequestやIssueは英語のことが多いです
    • ですが、Slack内のvulsjpでは日本語でやり取りされているので、英語が苦手でも大丈夫です

VulsRepoは、Vulsのスキャン結果をインタラクティブに見ることができる、OSSのWEBアプリケーションです。 こちらもGithubで公開されています。

  • 使い方は、Github上にgif動画で公開されています
  • 基本的には、見たいスキャン日時やサーバーを選択し、任意の条件でドリルダウンしていくように使います

Vulsでスキャンして、VulsRepoで見る、というのが一連の流れになります。

使ってみよう

Vulsコミュニティテンプレートを利用することで、Vuls/VulsRepoをすぐに利用できます。 初期設定では、自分自身の脆弱性をスキャンするように設定されています。

  1. Vulsコミュニティテンプレートから、サーバーを作成
  2. 構築したサーバーへのアクセス経路を調整
  3. SSH接続し、脆弱性のスキャン
  4. HTTPアクセスで、脆弱性の状況を確認

簡単ですね。
もう少し詳しく、設定を見てみましょう。

1.Vulsコミュニティテンプレートから、サーバーを作成
サーバーの作成方法は、他のコミュニティテンプレートの作成方法と同じですので、割愛します。
IDCFが「コミュニティテンプレートから仮想マシンを作成する」というTIPSページを公開しています。
https://www.idcf.jp/help/cloud/guide/vm_community_temp.htmlwww.idcf.jp

2.構築したサーバーへのアクセス経路を調整
サーバー作成後、Vuls設定のためにSSHアクセス、VulsRepoを見るためにHTTPアクセスの設定が必要になります。

  • IDCFクラウド上のサーバーで同じセグメントから利用する分には、特に設定は不要です
  • インターネット側から見る場合には、ポートフォワードとファイアウォールの設定が必要になります
    • インターネット経由でアクセスをさせる場合は、アクセス制限等を 別途しっかり行う必要があります。 必要に応じて、ソースIP制限や認証の追加をしましょう
    • 今回は特に制限を行わず、作成したサーバーをインターネット経由で公開してテストしました
ポート番号 用途
22 Vulsの設定時に必要
80 VulsRepoの閲覧時に必要

3.SSH接続し、脆弱性のスキャン
設定が出来たら、SSHで作成したサーバーにログインし、脆弱性スキャンをしてみましょう。

  • サーバー作成直後であれば、rootでのみログインできます
  • su で vulsユーザになり、スキャンコマンドを実行します
    • go-cve-dictionaryというCVEデータベースのアップデートを行ったあと、vulsでスキャンを行います

f:id:kkamiyakenshiroh:20170313103356p:plain

今回は、CVE番号が割り当てられている脆弱性はなく、12個分の更新がある事が分かります。

  • 12 updateable packageとありますが、1つにパッケージに複数の更新がある場合もあるので、yum upadteで出てくる アップデート可能パッケージ数とは異なる場合があります
    • この記事のタイミングで上記確認できたので、最新版では修正されます。 Vulsのupdatableの数は、check-updateの数と同じになります

次に、Vulsスキャン結果を CVEデータベースと突き合わせる report コマンドを発行します。

  • reportコマンドにより、パッケージのChangelogにある CVE番号から、共通脆弱性評価システムCVSSの情報と連携します
    • CVSSについては、IPAの資料が詳しいです
    • ざっくりと、どの程度危険なのかを判別するための情報、と考えてよいです
    • 見方がよく分からない場合は、Base値 ( 基本値 ) を見て、大きいほうが影響が大きい、と考えてください
  • レポート形式は複数選択可能です
    • 出力先は -to オプションで選択します。ファイルの場合は -to-localfile、Slackの場合は -to-slackなどです
    • 出力フォーマットは -format オプションで選択します。XMLの場合は -format-xml、短いテキストの場合は -format-short-textなどです
  • VulsRepoはjson形式が必要となるため、-to-localfile -format-json で出力する必要があります
[vuls@vuls vuls]$ vuls report -to-localfile -format-json
[Mar  6 20:38:50]  INFO [localhost] Validating Config...
[Mar  6 20:38:50]  INFO [localhost] cve-dictionary: /opt/vuls/cve.sqlite3
[vuls@vuls vuls]$ vuls report -format-full-text
[Mar  6 20:39:00]  INFO [localhost] Validating Config...
[Mar  6 20:39:00]  INFO [localhost] cve-dictionary: /opt/vuls/cve.sqlite3

vuls-server (centos6.8)
=======================
Total: 0 (High:0 Medium:0 Low:0 ?:0)    12 updatable packages

No CVE-IDs are found in updatable packages.
12 updatable packages

[vuls@vuls vuls]$

4.HTTPアクセスで、脆弱性の状況を確認
スキャンとレポーティングが無事に完了したので、VulsRepoで見てみましょう。 今回はCVE番号が割り当てられた脆弱性はないため、healthy、という表示になっています。

  • http://割り当てたIP/vulsrepo/ へアクセスすると表示されます
  • 最初に、左側から「確認したい日付」を選びます
    • 複数選択可能です。チェックを入れて「submit」を押してください
  • 左側の項目を ScanTime の列に移動させることで、項目ごとでのドリルダウンが可能です

f:id:kkamiyakenshiroh:20170313103555p:plain
これで、一連の スキャン/閲覧(と対応)の流れが終わりました。

次のステップ

まずは使ってみる、という観点からそのまま動かしてみました。しかしながら、これだけでは今回構築した Vulsサーバーしか脆弱性検査ができません。
次回以降、ほかのサーバーをスキャンする方法などを記載していきます。

Vulsコミュニティテンプレート利用時に役立つTips

Vulsは開発速度が速く、日によっては毎日PullRequestやMargeがされています。これは、脆弱性検知精度向上や 新たな対応OSの追加などのためです。( 先日、RaspberryPi用のRasbianがサポートOSに加わりました! )

自分でVuls/VulsRepoを更新することで、追加された機能/バグ修正/検知精度向上の効果を得ることができます。 アップデート手順等は次回以降で記載します。
今回は、コミュニティテンプレート版でも使える、最近実装した機能を紹介します。

ローカルスキャンを使う

同梱されている設定は、自分自身へ SSH経由でのスキャン を実施する設定です。 しかしながら、なるべくSSHでのスキャンをしたくない環境もあります。

その際に有用なのが、Vulsのローカルスキャンモードです。

  • ローカルスキャンの詳細については、次回以降で説明します
  • SSH接続をしてスキャンをするのではなく、ローカルのコマンドを利用してスキャンを行います
    • スキャンユーザには、SSH接続でのスキャン ( リモートスキャン ) と同様の権限が必要です

ローカルスキャンの設定

設定は、config.tomlを以下のように書き換えるだけです。

  • portをlocalに変更し、SSHユーザ/鍵の記載を削除する
    • hostが"localhost"若しくは"127.0.0.1" かつ portが"local"、の場合にローカルスキャンモードとなります
[servers]

[servers.vuls-server]
host         = "127.0.0.1"
port        = "local"

設定後、通常通りに vuls scan を行ってください。

cronでの実行

定期的な脆弱性スキャンのためには、cron等での実行が必要です。 その際には、どのような通知が必要なのか(メールやSlack通知が必要か、 VulsRepoのWEB-UIで見えればいいのか、等)を検討する必要があります。

出力方法に合わせて reportオプション(およびconfig.toml)を調整します。

以下に、メール通知想定でまとめてみます。

config.toml
SMTPサーバー接続情報等を追加で記載します。

[servers]

[servers.vuls-server]
host        = "127.0.0.1"
port        = "local"
smtpAddr    = "your-smtp-server-IP/FQDN"
smtpPort    = "25"
from        = "from-mail@domain"
to          = ["to-addr@domain"]
cc          = ["cc-addr@domain"]
subjectPrefix = "[vuls]"

cron化用のスクリプト
Vulsでのスキャン前に、CVEデータベースの更新が必要です。 そのため、CVEデータベースのアップデートをしてからVulsでスキャンをする、というスクリプトを作ります。 対話的に実行している場合はあまり気にならないのですが、いくつかの設定が必要です。

  • Vulsは、bashで実行する必要がある
  • いくつかのコマンド(rmなど)が必要なので、vulsユーザのパスを流用するのが簡単です。
  • スキャンデータの出力はカレントディレクトリとなるので、明示的に出力先を定義します。
  • 同様にconfig.tomlファイルも、明示的に指定します。

reportは メール かつ 短文形式 としています。ここは好みで変えてください。

#!/bin/bash
PATH=/bin:/usr/bin:/usr/sbin
CONFIG=/opt/vuls/config.toml
RESULTS=/opt/vuls/results
CVEDB=/opt/vuls/cve.sqlite3
LOGDIR=/var/log/vuls
go-cve-dictionary fetchnvd -last2y -dbpath=$CVEDB -log-dir=$LOGDIR
go-cve-dictionary fetchjvn -last2y -dbpath=$CVEDB -log-dir=$LOGDIR
vuls scan -config=$CONFIG -results-dir=$RESULTS -log-dir=$LOGDIR
vuls report -config=$CONFIG -results-dir=$RESULTS -cvedb-path=$CVEDB -log-dir=$LOGDIR -to-localfile -format-json
vuls report -config=$CONFIG -results-dir=$RESULTS -cvedb-path=$CVEDB -log-dir=$LOGDIR -to-email -format-short-text

Vulsコミュニティテンプレートの構成について

Vulsを動作させる環境は、人によって様々です。今回提供されている コミュニティテンプレートはどのように構成されているかを確認したので、 ある程度Vuls利用経験がある方は参考にしてください。

OS等について

OS CentOS6.8
OS Update 2017/02/24時点の最新
DISK (/dev/sda1)として 15GB
Vuls build 2017/02/06 v0.2.0 1730caf
sudo /etc/sudoers.d/vuls にエントリがある

ディレクトリ等について

ディレクトリ構成は以下の通りです。

  • /home/vuls以下に、バイナリ等が配置されている
  • /opt/vuls以下に、configとデータ類が置かれている
  • vuls/go-cve-dictionaryは、/var/log/vuls 以下にログを出す
/
├─....
├── opt
│   └── vuls
│       ├── config.toml
│       ├── cve.sqlite3
│       ├── cve.sqlite3-shm
│       ├── cve.sqlite3-wal
│       └── results
│           ├── 2017-02-24T11:54:18+09:00
│           └── current -> /opt/vuls/results/2017-02-24T11:54:18+09:00
├── home
│   └── vuls
│       ├── README
│       └── go
│           ├── bin
│           ├── go1.7.5.linux-amd64.tar.gz
│           ├── pkg
│           └── src
.....

Vulsミートアップ「Vuls祭り #2」のご紹介 & 有用なリンク集

Vuls祭り、またやります!

2017/03/24 (金) に、二回目のUser MeetUpである「Vuls祭り #2」が開催されます。 コアな方も、そうでない方も有意義に過ごせると思いますので、ぜひ参加いただければと思います。
https://vuls-jp.connpass.com/event/51343/
私も、ローカルスキャンと脆弱性対応の考え方について、少しお話をする予定です。

有用な情報源(リンク集)

また、Vulsに関する有用なリンクをまとめておきます。

最後に

コミュニティテンプレートを利用して、まずはVulsを使ってみる、という目的で書いてみました。

Vulsは複数のサーバーをスキャンすることで、システム全体の脆弱性残存状況が分かります。 次回以降で、他のサーバーの脆弱性をスキャンする方法や、監視サーバー等の連携、ローカルスキャンモードについて 書いていけたらと思います。

そして、弊社 株式会社アールワークスでは、マネージド運用サービスにVulsを取り入れたプランを準備中です。 Vulsによる残存脆弱性情報の可視化をしながら運用ができます。

よろしくお願いいたします。

Copyright © IDC Frontier Inc.