メインコンテンツへスキップ

OSS のセキュリティ監査 - 個人でもできる依存関係の安全確認

この記事は約 13 分で読めます

現代のソフトウェアプロジェクトは数百のオープンソースパッケージに依存しています。平均的な Node.js アプリケーションは 1,200 以上の推移的依存関係を持ち、Synopsys の 2024 年オープンソースセキュリティ・リスク分析レポートによると、商用コードベースの 96% がオープンソースコンポーネントを含み、そのうち 84% が少なくとも 1 つの既知の脆弱性を含んでいます。しかし、ほとんどの個人開発者は依存関係のセキュリティ監査を実施していません。幸いなことに、npm audit、Snyk、Dependabot といった強力なツールにより、依存関係の監査はエンタープライズのセキュリティチームだけでなく、すべての開発者が実施できるようになっています。本記事では、個人開発者が今日から始められるオープンソース依存関係の安全確認手順を解説します。

npm audit で始める依存関係チェック

npm audit の基本的な使い方

npm audit は Node.js プロジェクトの依存関係に含まれる既知の脆弱性を検出するビルトインコマンドです。プロジェクトディレクトリで `npm audit` を実行するだけで、依存ツリー全体をスキャンし、脆弱性の深刻度 (Critical / High / Moderate / Low)、影響を受けるパッケージ名、修正バージョンの有無を一覧表示します。`npm audit fix` を実行すると、互換性を壊さない範囲で自動的にパッケージを更新します。ただし、メジャーバージョンの更新が必要な場合は `npm audit fix --force` が必要で、これは破壊的変更を含む可能性があるため慎重に実行してください。

CVSS スコアの読み方

CVE に紐づく CVSS (Common Vulnerability Scoring System) スコアは、脆弱性の深刻度を 0.0 から 10.0 の数値で表します。9.0 以上が Critical、7.0 以上が High、4.0 以上が Medium、それ未満が Low です。ただし、CVSS スコアだけで対応の優先度を決めるのは危険です。スコアが高くても、自分のプロジェクトで該当する機能を使っていなければ実質的なリスクは低い場合があります。逆に、スコアが中程度でも、認証やデータ処理に関わるパッケージの脆弱性は優先的に対処すべきです。CVSS スコアは参考指標として活用し、実際の影響範囲を自分のコードベースで確認する習慣をつけてください。

GitHub Dependabot による自動監視

Dependabot の設定と運用

GitHub Dependabot は、リポジトリの依存関係を自動的に監視し、脆弱性が発見された場合にプルリクエストを自動生成するサービスです。GitHub のすべてのパブリックリポジトリで無料で利用でき、プライベートリポジトリでも GitHub Advanced Security のライセンスがあれば利用可能です。`.github/dependabot.yml` ファイルをリポジトリに追加するだけで有効化できます。更新頻度 (daily / weekly / monthly)、対象パッケージエコシステム (npm、pip、Maven など)、自動マージの条件などを細かく設定できます。個人開発者には weekly の設定が推奨されます。daily だと通知が多すぎて疲弊し、monthly だと脆弱性の放置期間が長くなるためです。

Snyk との比較と使い分け

Snyk は Dependabot と同様に依存関係の脆弱性を検出するツールですが、いくつかの点で異なります。Snyk は独自の脆弱性データベースを持ち、NVD (National Vulnerability Database) に登録される前の脆弱性を検出できる場合があります。また、脆弱性の修正パッチを自動生成する機能や、コンテナイメージのスキャン、IaC (Infrastructure as Code) テンプレートのスキャンなど、より広範なセキュリティチェックが可能です。無料プランでは月 200 回のテストが可能で、個人開発者には十分です。Dependabot は GitHub に統合されている手軽さが利点で、Snyk はより詳細な分析と広範なカバレッジが利点です。両方を併用することで、検出漏れを最小化できます。

SBOM で依存関係を可視化する

SBOM (Software Bill of Materials) は、ソフトウェアに含まれるすべてのコンポーネントとそのバージョンを一覧化した文書です。npm では `npm sbom --sbom-format cyclonedx` コマンドで CycloneDX 形式の SBOM を生成できます。SBOM を定期的に生成し、脆弱性データベースと照合することで、プロジェクトのセキュリティ状態を継続的に把握できます。米国では大統領令 14028 により連邦政府向けソフトウェアに SBOM の提供が義務化されており、今後は民間でも SBOM の提供を求められるケースが増えると予想されます。サプライチェーン攻撃への防御としても、SBOM による依存関係の可視化は不可欠です。

個人開発者の実践ワークフロー

日常の開発フローに組み込む

セキュリティ監査を特別なイベントではなく、日常の開発フローに組み込むことが継続のコツです。具体的には、`npm install` の後に必ず `npm audit` を実行する習慣をつけてください。package.json の scripts に `"postinstall": "npm audit --audit-level=high"` を追加すれば、パッケージインストール時に自動的に High 以上の脆弱性をチェックできます。CI/CD パイプラインにも `npm audit --audit-level=critical` を組み込み、Critical な脆弱性がある場合はビルドを失敗させる設定が推奨されます。GitHub Actions であれば、Dependabot のアラートと組み合わせることで、脆弱性の検出から修正プルリクエストの生成まで自動化できます。

サプライチェーンセキュリティの全体像についてはサプライチェーン攻撃を参照してください。OSS セキュリティの実践を深く学ぶには、オープンソースセキュリティの解説書 (Amazon)が参考になります。

今すぐできること

  1. プロジェクトディレクトリで `npm audit` を実行し、現在の脆弱性状況を把握する
  2. GitHub リポジトリに `.github/dependabot.yml` を追加し、weekly の自動監視を有効にする
  3. Critical と High の脆弱性を優先的に修正し、修正できないものは影響範囲を確認して対処方針を決める
  4. パスつく.com で npm / GitHub アカウントに固有の強力なパスワードを設定し、パッケージレジストリのアカウント乗っ取りを防ぐ

よくある質問

npm audit で大量の脆弱性が表示されたらどうすればいいですか?
まず Critical と High に絞って対処してください。`npm audit fix` で自動修正できるものから始め、残りは手動で対応します。devDependencies のみに影響する脆弱性は、本番環境のリスクが低いため優先度を下げて構いません。すべてを一度に解決しようとせず、深刻度の高いものから段階的に対処することが重要です。
個人開発でも Dependabot は必要ですか?
はい、個人開発こそ Dependabot が有効です。企業にはセキュリティチームがいますが、個人開発者は自分一人で脆弱性を追跡する必要があります。Dependabot は無料で自動的に脆弱性を検出し、修正プルリクエストまで生成してくれるため、個人開発者の負担を大幅に軽減します。
npm audit と Snyk はどちらを使うべきですか?
両方の併用を推奨します。npm audit はビルトインで手軽に使え、Snyk はより広範な脆弱性データベースと詳細な分析を提供します。まずは npm audit から始め、余裕があれば Snyk の無料プランを追加するのが現実的なアプローチです。

この記事は役に立ちましたか?

関連用語

Xはてブ