VulsがAlpine Linuxに対応したぞ

こんにちは、Vulsのちょんまげこと、サウナおじさんです
![alt](https://camo.qiitausercontent.com/793939a153ce1ace15a2b319cc957d3ad952a9c4/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f32323436322f35656136383466352d346261622d356339312d663361392d3730383765383061386661632e706e67)

![alt](https://alpinelinux.org/alpinelinux-logo.svg)
コンテナ向け軽量OSである、Alpine Linuxですが結構流行ってるみたいっすねぇ。
Dockerの公式イメージもAlpineベースになってるとか。[Docker Official Images are Moving to Alpine Linux](https://www.brianchristner.io/docker-is-moving-to-alpine-linux/)

![alt](https://github.com/future-architect/vuls/raw/master/img/vuls_logo.png)
GitHubのISSUEやSlackでもAlpine, Alpine、あんまりゆうもんだから対応しなきゃなぁっておもってたんだよ。
で、ついに先日、勢いで実装した[Vuls:#545](https://github.com/future-architect/vuls/pull/545)をマージしたもんですのて、Vulsのスキャン可能なOSに[Alpine Linux](https://alpinelinux.org/)が追加されやした。
使い方は[Vuls:#545](https://github.com/future-architect/vuls/pull/545)に書いてるのでそれ見てもらうとして、このVuls Advent Calendar3日目ではどーいう感じでAlpine Linuxに対応したのかを書いてみるよ。

# Alpine Linuxが提供する脆弱性情報

[alpine-secdb](https://git.alpinelinux.org/cgit/alpine-secdb/)にてYAML形式で提供されてるよ。
現在はv3.2 - v3.6の脆弱性情報が提供されてるんだね。[リンク](https://git.alpinelinux.org/cgit/alpine-secdb/tree/)

[v3.6](https://git.alpinelinux.org/cgit/alpine-secdb/tree/v3.6)の情報を見ると、それぞれのバージョンごとに、
- community.yaml
- main.yaml
の２ファイルにわけて提供されてます。なんで２つに分かれているのか？
Vulsの[Issue](https://github.com/future-architect/vuls/issues/194#issuecomment-332442846)経由で公式のWikiにその理由が載ってるよとの情報あり。
https://wiki.alpinelinux.org/wiki/Enable_Community_Repository

```
Starting with Alpine Linux version 3.3, there is a new repository called community.
Many packages have been moved from the main repository to community to 
indicate that they are not guaranteed to be supported beyond six months. 
If you are using any of these packages, be sure to add the community repository.
```

で、２つみたらいいんじゃね、と。

```
so in my opinion it would make sense to check against both - why should we left of users of software from the community repo
```

YAMLの内容は、こんな感じ。

```yaml
packages:
  - pkg:
      name: apache2
      secfixes:
        2.4.27-r1:
          - CVE-2017-9798
        2.4.26-r0:
          - CVE-2017-3167
          - CVE-2017-3169
          - CVE-2017-7659
          - CVE-2017-7668
          - CVE-2017-7679
        2.4.27-r0:
          - CVE-2017-9789
```

パッケージ名、バージョン名、直したCVE-IDのリストになっとる。この情報、使えますな。

# Alpine-secdbの取り込み

2017/12/3時点のVulsでは、インターネット上で公開されている脆弱性データベースを使っててそれにVulsからアクセスしやすくするために以下の２つのツールを作って使ってる。

- [go-cve-dictionary](https://github.com/kotakanbe/go-cve-dictionary)
    * 米国NISTが提供する[NVD](https://nvd.nist.gov/)
    * IPAが提供する日本語の脆弱性情報である[JVN](http://jvndb.jvn.jp/)
     
- [goval-dictionary](https://github.com/kotakanbe/goval-dictionary)
    - Linux系ディストリビュータが提供するOVAL形式の脆弱性データベース

で、今回Alpine-secdbをどーやってVulsに組み込もうかなーと悩んで、別ツールとしてリポジトリ分けようかなーともかんがえたんだけど、そうなるとセットアップの手間が増えるのでアレかな、うーんとかサウナで悩んで、結局alpine-secdbを無理やりOVAL形式に変換して組み込むことにした。OVAL形式にしたほうがVuls本体側の実装が楽になるしね。

それがコレ[goval-dictionary:#22](https://github.com/kotakanbe/goval-dictionary/pull/22)
Alpine-secdbからYAMLをフェッチしてきてDBにぶち込んでるだけや。

利用例は[ここ](https://github.com/kotakanbe/goval-dictionary#usage-fetch-alpine-secdb-as-oval-data-type)に書いといたよ


# Vuls側の実装

このプルリク[Vuls:#545](https://github.com/future-architect/vuls/pull/545)がVuls側の実装だよ。
実装は簡単だったよ。
以下、何やってるか書いとくよ。

- Alpine Linuxを[判別](https://github.com/future-architect/vuls/pull/545/files#diff-1ee8af717e9c5a6049484f272bf72c9fR55)
    - `ls /etc/alpine-release`で判別してるよ
    - serverspecの実装を徹底的に参考にさせていただきやした
- インストールされてるソフトウェアリストを取ってくる[部分](https://github.com/future-architect/vuls/pull/545/files#diff-1ee8af717e9c5a6049484f272bf72c9fR118)
    - `apk info -v`の結果をパースしてる
- アップデー後のバージョンを取っていくる[部分](https://github.com/future-architect/vuls/pull/545/files#diff-1ee8af717e9c5a6049484f272bf72c9fR145)
    - `apk version`をパースしてる

基本そんだけで対応出来たよ。OVAL形式にしたので既存の実装に乗っかれたわけだね。
あたしゃOVAL形式に合わせといて良かったよ。天才だね

さーてサウナでも行くべよ（土曜日20:40記）