CircleCIを用いたnpm パッケージの脆弱性検知システムの構築

CircleCIを用いたnpm パッケージの脆弱性検知システムの構築
===

### やったこと
- circle-ci 実行時に、nsp を実行させて、脆弱性が含まれるパッケージの検知が行えるようにした。
- つまりは、継続的に脆弱性監視しましょう ということ。

#### nsp とは？
[Node Security Platform | Home](https://nodesecurity.io/)
Node に関するセキュリティ関連の情報が集約されている他、そのチェックツールも提供されている。

その中で、Free Tool として用意されている [Node Security Platform | Tools](https://nodesecurity.io/opensource) を 利用して、今回は、Circle-CI 上に組み込むだけ。

gulpのスクリプトとしても、実行できるようになっているので、他のbuildと一緒に実行すること可能ですね。

### サンプル

- 成功した例
<img width="1173" alt="circleci_success_img.png" src="https://qiita-image-store.s3.amazonaws.com/0/19979/b32dccc3-1348-dba1-7c52-f7d1cbfc578b.png">

```bash
> gulp nsp
[11:26:47] Requiring external module babel-register
[11:26:51] Using gulpfile ~/hogemoge/gulpfile.babel.js
[11:26:51] Starting 'nsp'...
[11:26:56] (+) No known vulnerabilities found
[11:26:56] Finished 'nsp' after 5.85 s
```

- 失敗した例
<img width="953" alt="circleci_error.png" src="https://qiita-image-store.s3.amazonaws.com/0/19979/20dc0319-ec88-a025-38f3-dd9501fe16fb.png">


- 実際ci画面
[circleci - syenze/gulp-nsp](https://circleci.com/gh/syenze/gulp-nsp/2)
※ 実際に、 [nodesecurity/gulp-nsp](https://github.com/nodesecurity/gulp-nsp) が用意している gulp ライブラリを circleci 上に載せてみた[結果](https://github.com/syenze/gulp-nsp)です。


```bash
npm run test
> gulp-nsp@2.4.2 test /home/ubuntu/gulp-nsp
> gulp nsp
[12:59:59] Using gulpfile ~/gulp-nsp/gulpfile.js
[12:59:59] Starting 'nsp'...
[13:00:00] 'nsp' errored after 741 ms
[13:00:00] Error in plugin 'gulp-nsp'
Message:
    (+) 2 vulnerabilities found
┌───────────────┬───────────────────────────────────────────────────────┐
│               │ ReDoS via long string of semicolons                   │
├───────────────┼───────────────────────────────────────────────────────┤
│ Name          │ tough-cookie                                          │
├───────────────┼───────────────────────────────────────────────────────┤
│ Installed     │ 2.2.2                                                 │
├───────────────┼───────────────────────────────────────────────────────┤
│ Vulnerable    │ >=0.9.7 <=2.2.2                                       │
├───────────────┼───────────────────────────────────────────────────────┤
│ Patched       │ >=2.3.0                                               │
├───────────────┼───────────────────────────────────────────────────────┤
│ Path          │ gulp-nsp@2.4.2 > nsp@2.3.0 > nodesecurity-npm-utils@… │
├───────────────┼───────────────────────────────────────────────────────┤
│ More Info     │ https://nodesecurity.io/advisories/130                │
└───────────────┴───────────────────────────────────────────────────────┘
┌───────────────┬───────────────────────────────────────────────────────┐
│               │ Regular Expression Denial of Service                  │
├───────────────┼───────────────────────────────────────────────────────┤
│ Name          │ minimatch                                             │
├───────────────┼───────────────────────────────────────────────────────┤
│ Installed     │ 3.0.0                                                 │
├───────────────┼───────────────────────────────────────────────────────┤
│ Vulnerable    │ <=3.0.1                                               │
├───────────────┼───────────────────────────────────────────────────────┤
│ Patched       │ >=3.0.2                                               │
├───────────────┼───────────────────────────────────────────────────────┤
│ Path          │ gulp-nsp@2.4.2 > nsp@2.3.0 > nodesecurity-npm-utils@… │
├───────────────┼───────────────────────────────────────────────────────┤
│ More Info     │ https://nodesecurity.io/advisories/118                │
└───────────────┴───────────────────────────────────────────────────────┘
npm run test returned exit code 1
```

### まとめ
そもそも脆弱性チェック自体は、検知するための仕組みを導入するところから大変だったりするので、cd上のｐipelineに組み込んでciでチェックするのと、
脆弱性チェックを定期的にまわして、cdが走らないタイミングでも検知できる仕組みづくるにも、今回の有効かと思います。


### その他
[Node Security Platform | Home](https://nodesecurity.io/#pricing)
有料 ( 月$1 / rep ) で、github 連携したプランもあるが、ciサービスに組み込めれば、月額課金しなくても同要件はカバーできるかと思います。