vuls と redmine を連携してみよう（その後）

#前回はチケット登録で完了
## 今回はチケットクローズまで頑張ってみるよ
### vuls-log-converter の出力データの精査から

```shell:data.csv
"ScannedAt","Platform","Family","Release","ServerName","Container","CveID","DetectionMethod","Packages","PackageVer","NewPackageVer","NotFixedYet","CweID","CVSS Score","CVSS Severity","CVSS (AV)","CVSS (AC)","CVSS (Au)","CVSS (C)","CVSS (I)","CVSS (A)","Summary","Published","LastModified"
"2017/12/20 05:05:59","other","centos","7.3.1611","localhost","None","healthy","healthy","healthy","healthy","healthy","healthy","healthy","healthy","healthy","healthy","healthy","healthy","healthy","healthy","healthy","healthy","healthy","healthy"
```

１行目がデータヘッダーで２行目がデータ
今回の場合脆弱性が残っているサーバでは無いのでこれだけで終了
脆弱性がある場合は

```shell:vul.csv
"2017/12/20 06:05:56","other","centos","6.6","vulserver","None","CVE-2017-9798","OvalMatch","httpd-tools","2.2.15-39.el6.centos","2.2.15-60.el6.centos.6",false,"CWE-416",5,"Medium","NETWORK","LOW","NONE","PARTIAL","NONE","NONE","Apache HTTP Server には、解放済みメモリの使用に関する脆弱性が存在します。","2017/10/16 18:11:00","2017/10/16 18:11:00"
```
こんな感じのデーターが付与される。
と言うことは「前回精査データと今回精査データを突合させると差分が取れる」と踏んでみました。

#### 前回の精査データ と 今回の精査データ を突合させて差分を拾い出す

| |前回のデータ|今回のデータ|状態|残すデータ|
|:--:|:-------------------------:|:-------------------------------:|:-----------------------:|:-----------:|
|1|存在する|存在しない|クローズ|前回のデータ|
|2|存在する|存在する|未対応で変化のない脆弱性|両方消す|
|3|存在する|存在するが何かが違う（Summaryなど)|変更のあった脆弱性|今回のデータ|
|4|存在しない|存在する|新規の脆弱性|今回のデータ|

という事で「全文検索」を行い「残すデータ(チケット化する)」を選別してみました。

##今回は上記のデータを元にチケットのクローズまで実装してみた
まずは元データの生成
「初回」は現在の脆弱性状況を全チケット化するために
こんな感じのスクリプトを実行します。

```shell:data.sh
#!/bin/sh
result="/home/vuls/results"
tmp_old="/tmp/old"
tmp_new="/tmp/new"
cd /tmp
rm -rf $tmp_old $tmp_new
mkdir -p $tmp_old $tmp_new
touch $tmp_old/csvdata.csv
ls $result/current/*.json | grep  -v "_diff.json" | xargs -I{} cp -p {} $tmp_new
/usr/bin/vulslogconv -i $tmp_new -o $tmp_new/csvdata.csv -t csv
```
/tmp/pld/csvdata.csv を 0件にして json-to-diff/pl を実行すると全てが「差分あり」データとなります。
無論、vuls-to-redmine.conf のpathとfilesを/tmp/new/csvdata.csv としてもOK

２回目以降は以下のスクリプトを実行してください。

```shell:data.sh
#!/bin/sh
result="/home/vuls/results"
tmp_old="/tmp/old"
tmp_new="/tmp/new"
cd /tmp
rm -rf $tmp_old $tmp_new
mkdir -p $tmp_old $tmp_new
result_old=`find $result -maxdepth 1 -type d |sort -nr | head -2 | tail -1`
ls $result_old/*.json | grep  -v "_diff.json" | xargs -I{} cp -p {} $tmp_old
ls $result/current/*.json | grep  -v "_diff.json" | xargs -I{} cp -p {} $tmp_new
/usr/bin/vulslogconv -i $tmp_old -o $tmp_old/csvdata.csv -t csv
/usr/bin/vulslogconv -i $tmp_new -o $tmp_new/csvdata.csv -t csv
```
こんな感じで前回JSONデータと最新JSONデータをcsv化しておく。

## vuls-to-redmimeを導入
最新の [vuls-to-redmime](https://github.com/nakacya/vuls-to-redmine) を取得

```
$ git clone https://github.com/nakacya/vuls-to-redmine.git
$ chmod 755 vuls-to-redmine.pl json-to-diff.pl
$ vi json-to-diff.conf
[API]
oldpath=/tmp/old         <-------tmp_pldに合わせる
oldfiles=csvdata.csv     <-------tmp_oldに出力されているcsvデータ
newpath=/tmp/new         <-------tmp-newに合わせる
newfiles=csvdata.csv     <-------tmp_newに出力されているcsvデータ
path=/tmp/new            <-------突合後のデータ出力先パス
files=output.csv         <-------突合後のデータ出力ファイル名
```

この後に vuls-to-diff.pl を実行

```
$ ./vuls-to-diff.pl -c json-to-diff.conf
S                                                E
END.............................................
```

csvdata.csv の量によって変わるが「ホスト名・パッケージ名・バージョン・CVEID・CWEID・新バージョン・サマリ」で全件マッチを行っている都合上結構時間を要する。
※おおよそ10000件で20分位掛かる

出力されるデータはこんな感じ

```
"2017/12/20 06:05:56","other","centos","6.6","vulserver","None","CVE-2017-0000","OvalMatch","hogehoge","1.1.1","",false,"CWE-416",5,"Medium","NETWORK","LOW","NONE","PARTIAL","NONE","NONE","CLOSED!!","2017/10/16 18:11:00","2017/10/16 18:11:00"
"2017/12/20 06:05:56","other","centos","6.6","vulserver","None","CVE-2017-9798","OvalMatch","httpd-tools","2.2.15-39.el6.centos","2.2.15-60.el6.centos.6",false,"CWE-416",5,"Medium","NETWORK","LOW","NONE","PARTIAL","NONE","NONE","Apache HTTP Server には、解放済みメモリの使用に関する脆弱性が存在します。","2017/10/16 18:11:00","2017/10/16 18:11:00"
```

## vuls-to-redmine の実行
差分データが出力されたら vuls-to-redmine.pl を実行する。

```
$./vuls-to-redmine.pl -c param.conf
S                                                E
END.............................................
```
こちらはAPIを叩いている関係上それなりに時間を要します。

## 結構考えて考慮した部分
・ホスト名、パッケージ名、旧バージョン番号でチケットを作成しているため「どのホストの何のパッケージを更新する必要性があるか」少し分かりやすくなる
・条件によっては一部のCVEIDやCWEで途中クローズしてしまうことがあるので最後までクローズしないように考慮（最後の最後でクローズ）
・チケットSPAMが発生しないように考慮
・CVSS Score が下がらないように考慮
・一度クローズしてしまったチケットも再度同じ条件で脆弱性情報が発見された場合再オープンする

## 超絶重要な事
・perlド初心者なCOBOLerなのでいじめないでね（一応メモリの気持ちになって書いたよ
・Bug情報は出来るだけ対応するように心がけしますが技術が追いつかないかも