こんにちは。てぃろです。
今回はnpmパッケージの脆弱性をチェックし対応するための工夫についてお話しします。
ここのところVueやAngularを触ることが多いので、必然的にnpmパッケージをよく扱います。そこで、フロントのセキュリティについても気になったのですが、日々気にしたくないので、半自動化する工夫をしました。
ポイントは脆弱性に気付けることと気付いた後やることが明確なことです。
npmパッケージはユーザのブラウザで丸見え
最近も変わらず脆弱性をついたセキュリティ被害は多く見受けられます。
nodeやnpmパッケージも例外ではなく、むしろよく報道されているほうと言ってもいいのではないでしょうか。
特に、フロントエンドJSが隆盛を極める今としては、フロントで使うnpmパッケージに関するセキュリティは言わずもがなです。
作っている側から言わせれば、ユーザに対してソースコードがすべて見えている状態で配布するわけなので、脆弱性も見せているともいえる状態であり、恐ろしいことこの上ない。
npmパッケージの脆弱性に気づける仕組みを作る
ソースコードがすべて見えているということは、脆弱性も見えやすいということです。
だからこそ、npmパッケージの脆弱性はいつでも気を付けておきたいのです。
でも、毎日脆弱性に気を付けるなんてそんなめんどくさいことはできないので、脆弱性が発見されたときに気付ける仕組みを考えたいんです。
今は、npmパッケージの脆弱性を検知する仕組みが整ってきているのでそれをうまく使いましょう。
気付く仕組み1:Githubが送ってくれるメール通知
最近githubでは勝手にnpmパッケージのセキュリティチェックをしてくれて、警告のメールを ↓ みたいに送ってくれます。
リンクを進むと、以下のようにオススメしてくれます。
要約すると、
http-proxyの1.18.1未満があぶないから、1.18.1以上にアップデートしてな
ということです。本文は細かい脆弱性の情報です。勉強のためにもできるだけ見ておきましょう。
気付く仕組み2:自前のCI/CDパイプラインにnpm auditコマンドを組み込む
npmコマンドには、脆弱性のあるパッケージを一覧してくれるコマンドがあります。それが、
npm audit
です。詳細は以下を参照してください。
これを使うと、以下のように脆弱性のあるパッケージを一覧してくれます。
今回試しにやった環境では、Highしか出ませんでしたが、lowなども出ることもあります。詳しいnpm auditの使い方などは、他にも解説記事があるので ↓ などを参照してみてください。
このnpm auditコマンドは、上記の警告がある状態だと、終了コードが1になります。
つまり、Github ActionなどのCI/CDのコマンドとして使えばCI/CDのパイプラインで失敗させられるのです。
パイプラインの最初にこのコマンドを入れてしまえば、最初に脆弱性があればパイプラインが止まるので危険なコードにすばやく気づけます。
パッケージのビルドは結構時間がかかることが多いので、先に脆弱性チェックするほうが無駄なビルドを待つ必要がないのでオススメです。
脆弱性に気づいた後は、パッケージをアップデートしよう
脆弱性は気づいたらおしまいではなく、直すところまでが重要です。
npmコマンドには、自動でパッケージを脆弱性の観点でアップデートしてくれるコマンドがあります。
それが、
npm audit fix
です。ただ、たまにこれでは全部自動で直してくれないこともあります。
そんなときは、
npm audit fix --force
を試しましょう。
それでもダメなら、↓ の記事なんかも参考にして力技で頑張りましょう…。
結果として、パッケージがアップデートされることになるので、このアップデートをしたあとにアプリが動くことは保証されていません。
必ずこれらのアップデートはローカルで実施し、動作確認をしてからリポジトリにコミットするようにしましょう!
パッケージの開発が終わっててアップデートされないときには、本番での採用はあきらめよう
本番ビルドで使う場合には、残念ですが脆弱性が残るということになるので、そのパッケージの採用を諦めましょう。
もし開発で使うだけのもの(–save-devしてるやつ)であれば、以下のコマンドで本番ビルドだけで使うパッケージだけに検出範囲を絞れます。
npm audit --production
私が仕事で使っているリポジトリでまさにこの問題にあたったので、上記コマンドをパイプラインに入れていますが、うまく動いています。
まとめ:セキュリティ対策はコストをできるだけかけずに最大限実施したい
まず気付く工夫が必要だということで、その方法についてご紹介しました。
npm audit fixコマンドで修正も半自動化できているのがありがたいところですね。
npm auditコマンドは非常に便利なコマンドで、ここに紹介した以外にもまだまだオプションもありますので、やりたいことができなかった場合などは、一度公式のドキュメントをしっかり読んでみることをオススメします。
それではよいセキュリティチェックライフを!