こんにちは。株式会社アールワークスの井上と申します。
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とは
Vulsは、OSSの脆弱性検知ツールです。Githubで公開されています。
- コミュニティはSlackにあります。自由に参加可能です
- 英語圏での反響もあるため、GithubのPullRequestやIssueは英語のことが多いです
- ですが、Slack内のvulsjpでは日本語でやり取りされているので、英語が苦手でも大丈夫です
VulsRepoは、Vulsのスキャン結果をインタラクティブに見ることができる、OSSのWEBアプリケーションです。 こちらもGithubで公開されています。
- 使い方は、Github上にgif動画で公開されています
- 基本的には、見たいスキャン日時やサーバーを選択し、任意の条件でドリルダウンしていくように使います
Vulsでスキャンして、VulsRepoで見る、というのが一連の流れになります。
使ってみよう
Vulsコミュニティテンプレートを利用することで、Vuls/VulsRepoをすぐに利用できます。 初期設定では、自分自身の脆弱性をスキャンするように設定されています。
- Vulsコミュニティテンプレートから、サーバーを作成
- 構築したサーバーへのアクセス経路を調整
- SSH接続し、脆弱性のスキャン
- 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でスキャンを行います
今回は、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 の列に移動させることで、項目ごとでのドリルダウンが可能です
これで、一連の スキャン/閲覧(と対応)の流れが終わりました。
次のステップ
まずは使ってみる、という観点からそのまま動かしてみました。しかしながら、これだけでは今回構築した 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 関連リンク集
- http://qiita.com/usiusi360/items/aeb3cd3630badfacdb4e
- VulsRepoの作者 usiusi360 さんがまとめているページです
- 日本語公式マニュアル
- https://github.com/future-architect/vuls/blob/master/README.ja.md
- 細かい情報は、ここから取得してください。最新情報です
- Vuls Slackチーム
- vuls-jp ( connpass )
- http://vuls-jp.connpass.com/
- Vuls祭りなどのイベントなどはこちらで公開しています
- Vuls Advent Calendar 2016
- http://qiita.com/advent-calendar/2016/vuls
- 2016年のAdvent Calendarです。
- ElasticSearchに取り込んだり、構成のデザインパターンがあったり、いろいろな記事があります
最後に
コミュニティテンプレートを利用して、まずはVulsを使ってみる、という目的で書いてみました。
Vulsは複数のサーバーをスキャンすることで、システム全体の脆弱性残存状況が分かります。 次回以降で、他のサーバーの脆弱性をスキャンする方法や、監視サーバー等の連携、ローカルスキャンモードについて 書いていけたらと思います。
そして、弊社 株式会社アールワークスでは、マネージド運用サービスにVulsを取り入れたプランを準備中です。 Vulsによる残存脆弱性情報の可視化をしながら運用ができます。
よろしくお願いいたします。