はじめに
Node.jsで開発している方は多くのnpmパッケージを利用していますよね。これらの脆弱性をいち早く見つけて対応するために、私が実践していることを紹介します。
CIと言えるかやや不安ですが、細かく考えずCI/CD Advent Calendarに投稿してしまいます。
背景
ある程度の規模の企業では、依存パッケージの脆弱性スキャンとしてOSSや商用ツールを利用しているところもあるでしょう。ただし、小規模な企業や個人開発ではそこまでなかなか手が回らない、お金が出せないというケースもあるかもしれません。そこで、安価に(できれば無料で)手っ取り早く脆弱性を発見する仕組みを検討してみました。
対象
package-lock.json
に列挙されている依存パッケージの脆弱性検知を対象とします。自前のソースコードの脆弱性スキャンなどは本記事の対象外です。
脆弱性検知の方法
私は個人開発のリポジトリで2つの方法を併用しています。
- Snyk
- npm audit on CircleCI
本記事では後者を紹介します。
npm audit on CircleCI
npm audit
はnpmに標準で含まれるサブコマンドで https://www.npmjs.com/advisories(など?)を情報源として脆弱性を見つけるものです。npm v6ぐらいから利用できます。
私が採用している方法は何も難しいものではなく、このnpm audit
コマンドをCircleCIで毎日実行して、脆弱性が見つかったらSlackに通知するというものです。では、設定ファイルを紹介します。
version:2jobs:build:docker:-image:circleci/nodesteps:-checkout-run:name:update npmcommand:'sudonpminstall-gnpm@latest'-run:npm ci-run:name:npm testcommand:$(npm bin)/nyc npm test && $(npm bin)/nyc report --reporter=text-lcov | $(npm bin)/coveralls-run:npm run lint-run:name:install serverlesscommand:'sudonpminstall-gserverless'-deploy:name:sls deploycommand:|if [ "${CIRCLE_BRANCH}" == "master" ]; thensls deploy --stage prodelsesls deploy --stage devfivul-check:docker:-image:circleci/nodesteps:-checkout-run:name:update npmcommand:'sudonpminstall-gnpm@latest'-run:npm ci-run:npm auditworkflows:version:2commit-workflow:jobs:-buildnightly:triggers:-schedule:cron:"016***"filters:branches:only:masterjobs:-vul-check
https://github.com/oke-py/container-linux-release-feed/blob/master/.circleci/config.yml
npm auditに関係ない部分もそのまま掲載していますが、vul-check
あたりをご参照ください。nightly buildでmasterブランチに対してnpm ci
、npm audit
を実行しています。こちらがエラー時の例です。
https://circleci.com/gh/oke-py/container-linux-release-feed/193
脆弱性対応
こうして毎晩脆弱性をチェックし、見つかったときはどうするかを示します。
npm audit fix; npm update
基本的にはこれだけです。極稀にnpm audit fix
では解決できず、手動で対応する必要があります(昔すぎてどんな対応をしたか忘れました)。
所感
前述のように2種類の方法を併用していますが、半年ほど使ってみてSnykからの通知を起点に対応したことはありません。npm audit
で脆弱性を見つけています。
おわりに
安価で手っ取り早く脆弱性スキャンする方法を紹介しました。ざっと確認したところ他の言語では3rd partyのツールに頼らざるを得ない感じです。標準サポートされないかな・・・