npqやRenovateでリポジトリを安全に保つ
UI開発者 加藤Webのフロントエンド開発に関する記事を読んでいると度々目にする
npm install package-name
というコマンドがあります。この記事を読んでいる皆さんも数えきれないほど実行してきたコマンドではないでしょうか。
このコマンドはnpmのレジストリから指定したパッケージをインストールするコマンドですが、中には脆弱性が含まれているパッケージもあります。
上のキャプチャの通りnpm install
コマンドは脆弱性を報告してくれるものの、それによってインストールが中断されることはありません。
「npq」はパッケージをインストールする際にパッケージの安全性についてチェックを行い、チェックに通らない場合はインストールを続行するかどうかを確認してくれるパッケージです。
いくつかのマーシャルと呼ばれる指標が用意されており、現状では以下の6つのマーシャルに当てはまる場合はパッケージのインストールを継続するかどうかの確認が発生します。
※公式サイトのドキュメントには5つのマーシャルについてのみ説明されていますが、実際は6つのマーシャルが存在します。
- age:パッケージが作成されてから22日以内の場合
- author:パッケージに著者のemailが設定されていない場合
- downloads:前月のパッケージダウンロード数が合計で20以下の場合
- readme:パッケージにREADMEファイルが含まれていない、もしくはREADMEの中に「# Security holding package」が含まれる場合
- scripts:package.jsonに悪意がある可能性のあるpreinstall、postinstallコマンドが指定されている場合
- snyk:snykのデータベースに脆弱性が報告されている場合
snykを参照するにはsnykのAPIトークンを設定する必要があります。snykをnpm経由でインストールしてからsnyk CLIを使うか「SNYK_TOKEN」を環境変数として設定しましょう。
※snykにはいくつかプランがあり、npqのテストを実行するにはStandard plan以上に設定する必要があります。
脆弱性があるパッケージをインストールすると以下のキャプチャのように、インストールを継続するかどうかを確認してくれます。
ここで「y」を選択すると、あらためてnpm install
もしくはyarn add
が実行されます。
インストール済みのパッケージに潜む脆弱性を検査するnpm audit
というコマンドもありますが、こちらはnpmが提供しているSecurity advisoriesをもとにしているため、両方活用するとなおよいと思います。
npqのほかにも、GitHubやGitLabではRenovateと呼ばれるBotが無料で利用できます。
このBotはリポジトリが依存しているパッケージにアップデートがあるとプルリクエストを立ててくれるBotです。プルリクエストの中にはパッケージのリリースノートが含まれます。もちろんマージするかどうかは自分で決めることができます。
以下のキャプチャはpackage.jsonに記載のあるパッケージについてのプルリクエストの一例ですが、composer.jsonやgo.modなどにも対応しています。
インストール時は安全だったパッケージでも、後になって脆弱性が見つかることは頻繁にあります。リポジトリが依存しているパッケージを人が手動で管理していくにはやはり限界があると思いますので、今回ご紹介したようなツールを活用して、継続的にリポジトリをチェックし安全を保っていきましょう。