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などにも対応しています。

インストール時は安全だったパッケージでも、後になって脆弱性が見つかることは頻繁にあります。リポジトリが依存しているパッケージを人が手動で管理していくにはやはり限界があると思いますので、今回ご紹介したようなツールを活用して、継続的にリポジトリをチェックし安全を保っていきましょう。