jvnman - JVN Vulnerability Data Management
jvnman は JVN が提供する「脆弱性対策情報共有フレームワーク」を使った脆弱性情報の収集・管理ツールです。
jvnman のインストール
jvnman のインストールは go get
コマンドで自動的にビルド&インストールしてくれます。
$ go get -u github.com/spiegel-im-spiegel/jvnman
なお,内部で github.com/mattn/go-sqlite3 パッケージを使用しているため,ビルド時に GCC C コンパイラが必要です。 Windows 環境の場合は別途 GCC のインストールが必要です。 Windows 環境で GCC のインストールを行う場合は MinGW-w64 を利用することを強くおすすめします。
- MinGW-w64 を導入する — しっぽのさきっちょ | text.Baldanders.info
- Go 言語で SQLite を使う(Windows 向けの紹介) — プログラミング言語 Go | text.Baldanders.info
なお go get
コマンドでビルドに失敗する場合は dep コマンドで vendoring すると上手くいくかもしれません。
$ dep ensure
リリースページでは Windows 64bit 用のバイナリのみ提供しています。
jvnman の使い方
$ jvnman -h
JVN database management
Usage:
jvnman [flags]
jvnman [command]
Available Commands:
help Help about any command
info Output vulnerability information
init Initialize vulnerability database
list List vulnerability data
update Update vulnerability database
version Print the version number
Flags:
--config string config file (default $HOME/.jvnman.yaml)
--dbfile string database file path (default "./jvndb.sqlite3")
-h, --help help for jvnman
--logfile string logfile path (default standard error)
--loglevel string log level: trace/debug/info/warn/error/fatal (default "error")
Use "jvnman [command] --help" for more information about a command.
jvnman はローカルに SQLite データベース・ファイルを作成し情報の蓄積・管理を行います。
まず最初に jvnman init
コマンドでデータベースの初期化を行います。
jvnman init
コマンドの usage は以下の通り。
$ jvnman init -h
Initialize vulnerability database
Usage:
jvnman init [flags]
Flags:
-h, --help help for init
Global Flags:
--config string config file (default $HOME/.jvnman.yaml)
--dbfile string database file path (default "./jvndb.sqlite3")
--logfile string logfile path (default standard error)
--loglevel string log level: trace/debug/info/warn/error/fatal (default "error")
初期化を行う場合は引数なしで jvnman init
コマンドを実行します。
$ jvnman init
これでカレントディレクトリに jvndb.sqlite3
ファイルが作成されます。
また --dbfile
オプションでパスを直接指定することもできます。
SQLite データベース・ファイルを初期化して作り直したい場合も jvnman init
コマンドで初期化できます。
データベースのテーブル仕様はリポジトリの docs/ フォルダ以下にあります。
JVN のデータベースから脆弱性情報を取得するには jvnman update
コマンドを用います。
$ jvnman update -h
Update vulnerability database
Usage:
jvnman update [flags]
Flags:
-h, --help help for update
-k, --keyword string keyword for filtering
-m, --month get the data for the past month
Global Flags:
--config string config file (default $HOME/.jvnman.yaml)
--dbfile string database file path (default "./jvndb.sqlite3")
--logfile string logfile path (default standard error)
--loglevel string log level: trace/debug/info/warn/error/fatal (default "error")
引数なしで
$ jvnman update
とすると1週間以内に公開・更新された脆弱性情報を取得します。
既に蓄積された除法がある場合は前回の最新更新日以降に公開・更新された脆弱性情報を取得します。
-m
オプションを指定すると1ヶ月以内に公開・更新された脆弱性情報を取得します。
-k
オプションでキーワードを指定するとキーワードに合致する情報のみを取得します。
たとえば, Java 関連の情報のみを収集したければ
$ jvnman update -k java
として情報を絞り込むことができます。 なお,大文字小文字の区別はしません。
jvnman list
コマンドを用いて蓄積した脆弱性情報を一覧表示することができます。
$ jvnman list -h
List vulnerability data
Usage:
jvnman list [flags]
Flags:
-c, --cve string CVE-ID (see https://cve.mitre.org/) for filtering
-f, --form string output format: html/markdown/csv (default "markdown")
-h, --help help for list
-p, --product string product name for filtering
-r, --range int list the data for the past days (default 3)
-s, --score float minimum score of CVSS for filtering
-t, --template string template file path
Global Flags:
--config string config file (default $HOME/.jvnman.yaml)
--dbfile string database file path (default "./jvndb.sqlite3")
--logfile string logfile path (default standard error)
--loglevel string log level: trace/debug/info/warn/error/fatal (default "error")
出力フォーマットには html, markdown, csv を指定できます。 既定は markdown です。 一覧表は標準出力に出力されます。 出力時の文字エンコーディングは UTF-8 です。
$ jvnman list -f csv > list.csv
コマンドラインでいくつかのフィルタリング条件を指定できます。 オプションと条件の対応は以下のとおりです。
オプション | 既定値 | 内容 |
---|---|---|
-c |
指定なし | CVE-ID でフィルタリングします |
-p |
指定なし | ベンダ名または製品名でフィルタリングします |
-r |
現時点から3日以内 | 出力範囲を最終更新日をキーにフィルタリングします |
-s |
0 (指定なし) | CVSS 基本評価値の下限値でフィルタリングします |
各条件は論理積(AND)で効きます。 たとえば
$ jvnman list -p java -s 7.0 -r 30
とすれば,過去30日以内に更新された情報のうち Java 関連でかつ CVSS 基本評価値が 7.0 以上のものに絞って出力されます。
また,あらかじめ CVE-ID の値がわかっているのであれば
$ $ jvnman list -c CVE-2018-2783 -r 30
という感じで絞り込むことができます。
-t
オプションで一覧を整形する際のテンプレートファイルを指定できます。
$ jvnman list -t template-list.md
jvnman が使用している標準のテンプレートファイルはリポジトリの jvnman/report/assets/ フォルダにあります。 参考にしてください。
jvnman info
コマンドを用いて指定した脆弱性情報 ID の脆弱性情報を帳票として出力することができます。
$ jvnman info -h
Output vulnerability information
Usage:
jvnman info [flags] <JVN Vulnerability ID>
Flags:
-f, --form string output format: html/markdown (default "markdown")
-h, --help help for info
-t, --template string template file path
Global Flags:
--config string config file (default $HOME/.jvnman.yaml)
--dbfile string database file path (default "./jvndb.sqlite3")
--logfile string logfile path (default standard error)
--loglevel string log level: trace/debug/info/warn/error/fatal (default "error")
出力フォーマットには html, markdown を指定できます。 既定は markdown です。 一覧表は標準出力に出力されます。 出力時の文字エンコーディングは UTF-8 です。
$ jvnman info -f html JVNDB-2018-002862 > JVNDB-2018-002862.html
ローカルの SQLite データベース・ファイルに情報がない場合は JVN のデータベースにアクセスして情報を取得します。
-t
オプションで情報を整形する際のテンプレートファイルを指定できます。
$ jvnman info -t template-info.md JVNDB-2018-002862
jvnman が使用している標準のテンプレートファイルはリポジトリの report/assets/ フォルダにあります。 参考にしてください。
jvnman は実行時の状況をログ出力します。
ログの出力先ファイルと出力レベルは --logfile
および --loglevel
オプションで設定できます。
出力先の既定は標準エラー出力です。
ログファイルのハンドリングについては github.com/lestrrat-go/file-rotatelogs パッケージを用いているため jvnman-%Y%m%d%H%M.log
のような指定も可能です。
出力レベルは trace, debug, info, warn, error, fatal の6段階で指定します。 既定値は error です。 trace を指定するとデバッグ用に SQL 文を出力するためログの量が大量になります。 ご注意ください。
$ jvnman update --logfile jvnman-%Y%m%d%H%M.log --loglevel trace
jvnman の起動時,ホーム・ディレクトリに .jvnman.yaml
ファイルがあれば環境設定ファイルとして読み込みます。
環境設定ファイルには dbfile
, logfile
, loglevel
各オプションを YAML 形式で記述します。
dbfile: /path/to/jvndb.sqlite3
logfile: /path/to/jvnman-%Y%m%d%H%M.log
loglevel: trace
jvnman 起動時の --config
オプションで環境設定ファイルのパスを指定することもできます。
環境設定ファイルの記述よりコマンドラインの指定のほうが優先されます。
フィードバックはお気軽にどうぞ。 日本語で大丈夫です。