依存性スキャンと SCA
アプリが使う外部ライブラリの既知脆弱性を自動で検出する手法です。SCA や SBOM で「何を使っているか」を把握し、CI に組み込んで危険な依存を早期に止めます。
- 1.依存性スキャン(SCA)は、利用しているOSSライブラリの既知脆弱性(CVE)を自動検出する手法。
- 2.前提は「何を使っているか」の把握。SBOM(ソフトウェア部品表)で直接・推移的な依存をすべて棚卸しする。
- 3.CI に組み込んで毎回検査し、危険な依存はビルドで止める。シフトレフトでサプライチェーンを守る。
依存性スキャンとは
現代のアプリは、コードの大半が 自前ではなく外部のライブラリ(OSS) でできています。Web フレームワーク、JSON パーサ、暗号ライブラリ……これらを npm install などで取り込んで動かします。便利な反面、取り込んだライブラリに既知の脆弱性があれば、それはそのまま自分のアプリの穴 になります。
依存性スキャン(SCA:Software Composition Analysis、ソフトウェア構成分析)は、アプリが使っている外部ライブラリを洗い出し、既知の脆弱性が含まれていないかを自動で検査する 手法です。脆弱性は CVE(共通脆弱性識別子)という番号で公開・管理されており、SCA ツールはこの脆弱性データベースと照合して「どのライブラリのどの版が危険か」を教えてくれます。
自分の書いたコードの欠陥を探す SAST(静的解析) とは対象が違います。SCA が見るのは 「借り物(依存ライブラリ)」側のリスク です。
推移的依存:見えない依存に注意
依存性スキャンが必要な最大の理由が 推移的依存(transitive dependency) です。あなたが直接指定したライブラリ(直接依存)は、さらに別のライブラリに依存しています。その依存もまた別に依存し……と連鎖します。
myapp
└─ web-framework ← 直接依存(自分で入れた)
└─ http-parser ← 推移的依存(間接的に入った)
└─ utils-lib ← さらにその先(自分は意識すらしていない)
問題は、脆弱性は“自分が意識していない奥の依存”に潜むことが多い 点です。直接入れたライブラリは把握していても、その何階層も下にある utils-lib の脆弱性までは、人手では追えません。依存性スキャンは、この 見えない依存の木全体 を機械的にたどって検査します。
過去の大きなインシデントの多くは、直接ではなく推移的な依存 に潜む脆弱性が引き金でした。自分の package.json に書いた数行の裏で、何百ものライブラリが芋づる式に入っています。「何を直接入れたか」だけ見ていては不十分で、依存ツリー全体 を機械で棚卸しする必要があります。
SBOM:ソフトウェアの部品表
依存性スキャンの前提となるのが 「そもそも何を使っているのか」を正確に把握すること です。これを文書化したものが SBOM(Software Bill of Materials、ソフトウェア部品表) です。
SBOM は、製造業の「部品表」になぞらえた概念で、そのソフトウェアに含まれる全コンポーネント(名前・バージョン・ライセンス等)の一覧 です。直接依存も推移的依存も、すべて列挙します。
| SBOM が答えること | 例 |
|---|---|
| 何が含まれているか | 使用ライブラリと各バージョンの一覧 |
| 脆弱性の影響範囲 | 「あの危険な版を含む製品はどれか」を即座に特定 |
| ライセンスの把握 | 各依存のライセンス(法務・コンプライアンス用途) |
SBOM の価値が際立つのは 新たな脆弱性が公表されたとき です。「あのライブラリの 1.2.x に重大な穴」と発表された瞬間、SBOM があれば「自社のどの製品・どのリリースが該当するか」を即座に洗い出せます。SBOM がないと、全プロジェクトを手で調べ回ることになります。標準フォーマットとして SPDX や CycloneDX が使われます。
CI への組み込み:シフトレフト
依存性スキャンは、一度きりの監査ではなく、開発の流れに常時組み込む ことで効果を発揮します。問題をできるだけ 早い段階(左側) で捕まえる考え方を シフトレフト と呼びます。
組み込みどころは複数あります。
- CI パイプライン:ビルドのたびに依存をスキャンし、危険な依存が見つかればビルドを失敗させる(/devops/ci-cd/)。本番に届く前の関所。
- プルリクエスト時:新しい依存を追加した PR で自動チェックし、危険なら取り込み前に警告する。
- リポジトリの常時監視:すでにマージ済みのコードについても、新しい脆弱性が後から公表される たびに通知する(コード自体は変わらなくても、危険度は変わる)。
- アーティファクトレジストリ:登録されたコンテナイメージをスキャンする(/devops/artifact-registry/)。
依存性スキャンの肝は、コードが変わらなくてもリスクは変わる という点です。今日安全な版が、明日 CVE 公表で一転して危険になることがあります。だから「PR のときだけ」では足りず、リポジトリやレジストリを継続監視 して、後から判明した脆弱性も拾える体制が要ります。
運用のコツ:ノイズと優先度
依存性スキャンを始めると、たいてい 大量の警告 に直面します。すべてを一律に「即対応」にすると、開発が止まり、警告に慣れて無視するようになります(アラート疲れ)。優先度づけが重要です。
- 深刻度(severity)で絞る:Critical / High を優先し、Low は計画的に。脆弱性には深刻度スコア(CVSS)が付く。
- 到達可能性を見る:その脆弱な関数を 実際に呼んでいるか。ライブラリに穴があっても使っていない機能なら、リスクは相対的に低い。賢いツールはこれを判定する。
- 直せるかで判断:多くは「より新しい版に上げる」だけで解消する。修正版が出ているものから着手する。
警告ゼロを目指して一気に全依存をアップグレードすると、互換性が壊れて別の障害 を生みがちです。深刻度の高いもの・実際に使っている経路から、段階的に 対応するのが現実的。自動更新も、テスト(CI)で守られていてこそ安全に回せます。
まとめ
- 依存性スキャン(SCA)は 利用OSSの既知脆弱性(CVE)を自動検出 する手法。借り物のライブラリ側のリスクを見る。
- 特に危ないのは 推移的依存(奥の見えない依存)。SBOM で依存ツリー全体を棚卸しし、影響範囲を即特定できるようにする。
- CI/PR/レジストリに組み込み、シフトレフトで早期に止める。コード不変でも後から危険になるため 継続監視 が要。
- 運用は 深刻度・到達可能性・修正可能性 で優先度づけ。一気に上げず段階的に、CI で守りながら対応する。
DevOps/インフラ Article
依存性スキャンと SCAを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
依存性スキャン
比較で見る軸
難易度: intermediate / カテゴリ: DevOps/インフラ / タグ数: 4
導入後に効く点
前提は「何を使っているか」の把握。SBOM(ソフトウェア部品表)で直接・推移的な依存をすべて棚卸しする。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- intermediate
- カテゴリ
- DevOps/インフラ
- タグ数
- 4
判断チェックリスト
- 自社の用途が「依存性スキャン / SCA」に近いか確認する。
- 強みである「依存性スキャン(SCA)は、利用しているOSSライブラリの既知脆弱性(CVE)を自動検出する手法。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。