脆弱性管理とプロジェクト可視化
(トップページはこちら) - (アプリケーションのセキュリティを始める)
GitLabは、セキュリティ管理とプロジェクト管理を統合的に扱える強力なプラットフォームです。本記事では、脆弱性レポート、セキュリティダッシュボード、ラベル、イシューボードといった機能を組み合わせることで、開発チームがどのように効率的にセキュリティリスクを管理し、プロジェクトを可視化できるかを解説します。
1. セキュリティ管理の全体像
GitLabのセキュリティ機能は、脆弱性の検出から修正までのライフサイクル全体をカバーします。以下の図は、セキュリティスキャンから脆弱性管理までの流れを示しています。
2. 脆弱性レポート
脆弱性レポートは、プロジェクトやグループ全体のセキュリティ状況を一元的に把握するための機能です。デフォルトブランチで検出されたすべての脆弱性を表示し、重要度、レポートタイプ、スキャナーなどの属性でソートできます。
2.1 主な機能
2.1.1 フィルタリング機能
脆弱性レポートでは、以下の条件でフィルタリングが可能です。
- ステータス: 要トリアージ、確認済み、却下、解決済み
- 重要度: Critical、High、Medium、Low、Info、Unknown
- レポートタイプ: SAST、DAST、Dependency Scanning、Container Scanningなど
- スキャナー: 特定のスキャナーで検出された脆弱性
- アクティビティ: イシュー有無、マージリクエスト有無、ソリューション有無など
- 識別子: 脆弱性の識別子(Advanced Vulnerability Management必須)
- 到達可能性: 脆弱性が到達可能かどうか
- 妥当性チェック: アクティブ、非アクティブ、おそらくアクティブ
2.1.2 グルーピング機能
脆弱性を効率的にトリアージするために、以下の基準でグルーピングできます。
- ステータス
- 重要度
- レポートタイプ
- スキャナー
- OWASP Top 10 2017
- OWASP Top 10 2021(Advanced Vulnerability Management必須)
2.1.3 一括操作
複数の脆弱性を選択して、以下の操作を一括で実行できます。
- ステータス変更(却下理由とコメントを含む)
- 重要度の変更(変更理由を記録)
- 既存イシューへの紐付け
- 新規イシューの作成
2.2 脆弱性の重要度変更
GitLab 17.9以降では、スキャナーが割り当てた重要度を手動で上書きできます。これにより、組織の優先順位に合わせて脆弱性の重要度を調整できます。
2.3 エクスポート機能
脆弱性レポートはCSV形式でエクスポートできます。エクスポートされるフィールドには以下が含まれます。
- ステータス
- グループ名/プロジェクト名
- レポートタイプ
- スキャナー名
- 脆弱性名
- 重要度
- CVE/CWE
- 検出日時
- 場所
- CVSSベクトル
- 却下理由
- 脆弱性ID
3. セキュリティダッシュボード
セキュリティダッシュボードは、アプリケーションのセキュリティ状況を評価するための視覚的なツールです。プロジェクトレベルとグループレベルの両方で利用できます。
3.1 プロジェクトセキュリティダッシュボード
プロジェクトセキュリティダッシュボードでは、最大365日間の履歴データを含む脆弱性の総数を時系列で表示します。デフォルトブランチのオープンな脆弱性(要トリアージまたは確認済みステータス)の履歴ビューを提供します。
3.1.1 主な機能
- 重要度別の脆弱性総数
- 時系列チャート(30日、60日、90日の期間選択可能)
- チャートのSVG形式でのダウンロード
- 重要度でのフィルタリング
- 特定期間へのズーム機能
3.2 グループセキュリティダッシュボード
グループセキュリティダッシュボードは、グループとそのサブグループ内のすべてのプロジェクトのデフォルトブランチで検出された脆弱性の概要を提供します。
3.2.1 プロジェクト評価システム
各プロジェクトは、最も重要度の高いオープンな脆弱性に基づいて、以下のようにレターグレードで評価されます。
| グレード | 説明 |
|---|---|
| F | 1つ以上のCritical脆弱性 |
| D | 1つ以上のHighまたはUnknown脆弱性 |
| C | 1つ以上のMedium脆弱性 |
| B | 1つ以上のLow脆弱性 |
| A | 脆弱性なし |
3.3 新しいセキュリティダッシュボード(GitLab 18.6以降)
GitLab 18.6では、Advanced Vulnerability Managementを使用した改善版のセキュリティダッシュボードが導入されました。
3.3.1 主な特徴
- 30日、60日、90日の期間での脆弱性トレンド
- 重要度別のオープンな脆弱性総数
- ダッシュボード全体に適用されるフィルター機能
- レポートタイプとプロジェクトでのフィルタリング
3.3.2 脆弱性の時系列チャート
時系列チャートでは、以下の操作が可能です。
- データポイントにホバーして詳細を確認
- 期間セレクターで30日、60日、90日を切り替え
- レンジハンドルをドラッグして特定期間にズーム
- 重要度とレポートタイプでフィルタリング
3.3.3 重要度パネル
重要度パネルには、重要度別のオープンな脆弱性の総数が表示されます。各重要度の「View」ボタンをクリックすると、その重要度の脆弱性のみを含む脆弱性レポートが開きます。
4. セキュリティスキャン結果
セキュリティスキャン結果は、パイプラインで実行されたセキュリティスキャンの結果を表示し、対処するための機能です。
4.1 用語の理解
4.1.1 Finding(検出結果)
開発ブランチで検出された潜在的な脆弱性です。ブランチがデフォルトブランチにマージされると、脆弱性になります。検出結果は、関連するCI/CDジョブアーティファクトの有効期限が切れるか、パイプライン作成後90日で期限切れになります。
4.1.2 Vulnerability(脆弱性)
デフォルトブランチで検出されたソフトウェアセキュリティの弱点です。脆弱性レコードは、アーカイブされるまで永続化されます。
4.2 パイプラインセキュリティレポート
パイプラインセキュリティレポートには、ブランチで検出されたすべての検出結果または脆弱性の詳細が含まれます。デフォルトブランチに対して実行されたパイプラインの場合、パイプラインセキュリティレポート内のすべての脆弱性は脆弱性レポートにも含まれます。
4.2.1 主な機能
- 詳細を表示するために説明を選択
- ステータスまたは重要度の変更
- GitLabイシューの作成
4.3 マージリクエストセキュリティウィジェット
マージリクエストには、変更が検出結果に与える影響の概要を提供するセキュリティウィジェットが表示されます。
4.3.1 差分の計算方法
例えば、以下のようなスキャン結果がある場合:
- ソースブランチパイプライン:
V1とV2を検出 - ターゲットブランチパイプライン:
V1とV3を検出
マージリクエストウィジェットでは:
-
V2が「追加」として表示 -
V3が「修正」として表示 -
V1は両方のブランチに存在するため表示されない
5. ラベルによる作業の整理
ラベルは、GitLabの機能全体で作業を整理し追跡するための強力なツールです。プロジェクトが小規模チームから大規模組織に成長するにつれて、ラベルは増加する作業量の追跡と管理に役立ちます。
5.1 ラベルの種類
GitLabでは3種類のラベルを使用できます。
- プロジェクトラベル: そのプロジェクトのイシューとマージリクエストにのみ割り当て可能
- グループラベル: 選択したグループまたはそのサブグループ内の任意のプロジェクトのイシュー、マージリクエスト、エピックに割り当て可能
- インスタンスラベル: インスタンス管理者が作成し、すべての新規プロジェクトにコピーされる
5.2 スコープ付きラベル
スコープ付きラベルは、相互排他的なラベルでイシュー、マージリクエスト、エピックに注釈を付けるための機能です(Premium/Ultimateティア)。特定のラベルの組み合わせを防ぐことで、より複雑なワークフローを作成できます。
5.2.1 構文
スコープ付きラベルは、タイトルにダブルコロン(::)構文を使用します。例: workflow::in-review
5.2.2 動作
イシュー、マージリクエスト、またはエピックは、同じkeyを持つkey::value形式の2つのスコープ付きラベルを持つことはできません。同じkeyで異なるvalueを持つ新しいラベルを追加すると、以前のkeyラベルは新しいラベルに置き換えられます。
5.2.3 使用例
5.2.4 ネストされたスコープ
複数のダブルコロン::を使用して、ネストされたスコープを持つラベルを作成できます。この場合、最後の::より前のすべてがスコープになります。
例:
workflow::backend::reviewworkflow::backend::developmentworkflow::frontend::review
この場合、イシューはworkflow::backend::reviewとworkflow::backend::developmentの両方を同時に持つことはできません(同じスコープworkflow::backendを共有しているため)。一方、workflow::backend::reviewとworkflow::frontend::reviewは異なるスコープなので、両方を持つことができます。
5.3 ラベルの優先順位
ラベルには相対的な優先順位を設定でき、イシューとマージリクエストのリストをラベル優先順位でソートする際に使用されます。
5.3.1 優先順位の設定方法
- プロジェクトの管理 > ラベルに移動
- 優先順位を付けたいラベルの横にある星アイコンを選択
- ラベルリストの上部の「優先順位付きラベル」セクションに表示される
- ドラッグして順序を変更(リストの上位ほど優先順位が高い)
5.4 アーカイブラベル
GitLab 18.3以降では、積極的に使用されなくなったが履歴的な観点と検索目的で保持する必要があるラベルをアーカイブできます。
5.4.1 アーカイブ時の動作
- イシュー、マージリクエスト、エピックのラベル選択ドロップダウンリストから非表示になる
- 以前に割り当てられた既存のイシュー、マージリクエスト、エピックには表示されたまま
- 検索と履歴データの表示は可能
- ラベルページの「アーカイブ済み」タブに表示される
6. イシューボードによる脆弱性の可視化と管理
イシューボードは、検出された脆弱性をイシューとして管理し、修正作業を追跡するための視覚的な方法を提供します。KanbanやScrumなどのアジャイル手法をサポートし、セキュリティチームと開発チームが協力して脆弱性に対処できます。
6.1 イシューボードの構成要素
6.1.1 リスト
リストは、イシューボード上の列で、選択したラベル、マイルストーン、イテレーション、担当者、またはステータスに一致するイシューを表示します。リストの種類:
- Open(デフォルト): 他のリストに属さないすべてのオープンなイシュー
- Closed(デフォルト): すべてのクローズされたイシュー
- ラベルリスト: ラベルのすべてのオープンなイシュー
- 担当者リスト: ユーザーに割り当てられたすべてのオープンなイシュー(Premium/Ultimate)
- マイルストーンリスト: マイルストーンのすべてのオープンなイシュー(Premium/Ultimate)
- イテレーションリスト: イテレーションのすべてのオープンなイシュー(Premium/Ultimate)
- ステータスリスト: ステータスを持つすべてのイシュー(Premium/Ultimate)
6.1.2 カード
カードはリスト上のボックスで、イシューを表します。カードには以下の情報が表示されます:
- イシュータイトル
- 関連ラベル
- イシュー番号
- 担当者
- ウェイト
- マイルストーン
- イテレーション(Premium/Ultimate)
- 期限
- 時間追跡の見積もり
- ヘルスステータス
6.1.3 スイムレーン
スイムレーンは、イシューボード上のイシューの水平グループ化です。例えば、親エピックごとにグループ化できます(Premium/Ultimate)。
6.2 複数のイシューボード
複数のイシューボードにより、以下が可能になります:
- すべてのティアでプロジェクトに複数のボード
- Premium/Ultimateティアでグループに複数のボード
これは、セキュリティチームと開発チームで異なるボードを使用したり、脆弱性の重要度別にボードを分けたりする場合に最適です。
6.3 設定可能なイシューボード(Premium/Ultimate)
イシューボードは、マイルストーン、ラベル、担当者、ウェイト、現在のイテレーションに関連付けることができ、それに応じてボードのイシューが自動的にフィルタリングされます。
6.3.1 スコープの設定
ボード作成時または「ボードを設定」ボタンを選択して、ボードのスコープを定義できます。マイルストーン、イテレーション、担当者、またはウェイトがイシューボードに割り当てられると、検索バーでこれらをフィルタリングできなくなります。
6.4 担当者リスト(Premium/Ultimate)
選択したラベルを持つすべてのイシューを表示する通常のリストと同様に、ユーザーに割り当てられたすべてのイシューを表示する担当者リストを追加できます。
6.4.1 追加方法
- 新しいリストを選択
- 担当者を選択
- ドロップダウンリストでユーザーを選択
- ボードに追加を選択
担当者リストが追加されると、担当者リストとの間でイシューを移動することで、そのユーザーにイシューを割り当てたり割り当て解除したりできます。
6.5 マイルストーンリスト(Premium/Ultimate)
割り当てられたマイルストーンでイシューをフィルタリングするマイルストーンリストを作成できます。これにより、特定のリリースやスプリントで修正すべき脆弱性を管理できます。
6.6 イテレーションリスト(Premium/Ultimate)
イテレーション内のイシューのリストを作成できます。アジャイル開発において、各イテレーションで対処すべき脆弱性を明確にできます。
6.7 ステータスリスト(Premium/Ultimate)
特定のステータスを持つイシューのリストを作成できます。ステータスリストは、進行中や完了などのワークフローステージでイシューを整理するのに役立ちます。
6.7.1 他のリストタイプとの違い
- ステータスリスト: ステータスがオープンまたはクローズ状態にマップされるかどうかに応じて、オープンとクローズの両方のイシューを含むことができる
- 他のリスト(担当者やマイルストーンなど): 常にオープンなイシューのみを表示
6.8 スイムレーンでのイシューのグループ化(Premium/Ultimate)
スイムレーンを使用すると、エピックごとにグループ化されたイシューを視覚化できます。大規模なセキュリティ改善プロジェクトを複数の脆弱性修正イシューに分割して管理する場合に便利です。
6.8.1 使用方法
- 表示オプションを選択
- エピックスイムレーンを選択
スイムレーンでは、このビューを離れることなくイシューを編集でき、ドラッグして位置とエピックの割り当てを変更できます:
- イシューを並べ替えるには、リスト内の新しい位置にドラッグ
- イシューを別のエピックに割り当てるには、エピックの水平レーンにドラッグ
- イシューをエピックから削除するには、「エピックが割り当てられていないイシュー」レーンにドラッグ
- イシューを別のエピックと別のリストに同時に移動するには、イシューを斜めにドラッグ
6.9 イシューウェイトの合計(Premium/Ultimate)
各リストの上部には、そのリストに属するイシューのイシューウェイトの合計が表示されます。これは、特に担当者リストと組み合わせて、セキュリティ修正作業のキャパシティ割り当てにボードを使用する場合に便利です。
6.10 進行中作業(WIP)制限(Premium/Ultimate)
イシューボードの各イシューリストに進行中作業(WIP)制限を設定できます。制限が設定されると、現在の状態と設定された制限がボードリストヘッダーに表示されます。
6.10.1 制限のタイプ
GitLabは2種類のWIP制限をサポートしています:
- アイテム: ウェイトに関係なく、リスト内のイシューの数を制限します
- ウェイト: リスト内のイシューの合計ウェイトを制限します
6.10.2 設定方法
- 編集したいリストの上部でリスト設定を編集を選択
- 進行中作業制限の横にある編集を選択
- ドロップダウンリストから制限タイプを選択
- 最大アイテム数または最大ウェイトを入力
- Enterキーを押して保存
6.11 ブロックされたイシュー(Premium/Ultimate)
イシューが別のイシューによってブロックされている場合、タイトルの横にアイコンが表示されます。ブロックされたアイコンにホバーすると、詳細情報のポップオーバーが表示されます。これにより、脆弱性修正の依存関係を可視化できます。
7. 統合ワークフローの実践例
セキュリティ管理とプロジェクト管理を統合したワークフローの例を示します。
7.1 実践的なワークフロー設定
7.1.1 ラベルの準備
まず、ワークフローに必要なスコープ付きラベルを作成します:
priority::criticalpriority::highpriority::mediumpriority::lowworkflow::triageworkflow::developmentworkflow::reviewworkflow::testingworkflow::deployed
7.1.2 イシューボードの設定
複数のイシューボードを作成します:
セキュリティトリアージボード: 脆弱性関連のイシューを管理
- リスト: Open、Triage、Development、Review、Testing、Closed
開発ボード: 通常の開発タスクを管理
- リスト: Open、Todo、In Progress、Review、Done、Closed
担当者ボード: チームメンバーごとの作業負荷を可視化
- 各メンバーの担当者リストを作成
7.1.3 脆弱性管理フロー
7.1.4 進行中作業制限の活用
各リストにWIP制限を設定して、作業の流れを最適化します:
- Developmentリスト: アイテム制限5
- Reviewリスト: アイテム制限3
- Testingリスト: ウェイト制限20
これにより、ボトルネックを早期に発見し、チームのキャパシティを適切に管理できます。
8. Advanced Vulnerability Management
GitLab 18.1以降では、Advanced Vulnerability Managementが導入され、より高度な脆弱性管理が可能になりました。
8.1 主な機能
8.1.1 Elasticsearchによる高速フィルタリング
PostgreSQLのインデックス制限とパフォーマンスの課題を克服するため、特定の脆弱性管理機能にはAdvanced Search(Elasticsearch)が使用されます。
8.1.2 サポートされる機能
- OWASP 2021カテゴリーによるグルーピング
- 脆弱性の識別子によるフィルタリング
- 到達可能性の値によるフィルタリング
- 新しいセキュリティダッシュボードのパネルとダッシュボード全体のデータフィルタリング
8.1.3 要件
- Advanced Searchが有効になっている必要がある
- プロジェクトまたはグループの脆弱性レポートで使用可能
9. まとめ
GitLabのセキュリティ管理機能とプロジェクト管理機能を統合することで、以下のメリットが得られます。
9.1 セキュリティ面
- 脆弱性の検出から修正までのライフサイクル全体を一元管理
- 重要度やレポートタイプによる効率的なフィルタリングとグルーピング
- CVSSスコアやEPSSスコアなどの詳細情報へのアクセス
- 脆弱性の重要度を組織の優先順位に合わせて調整可能
9.2 プロジェクト管理面
- ラベルによる柔軟な作業分類
- スコープ付きラベルによる相互排他的なワークフロー管理
- イシューボードによる視覚的な作業追跡
- 複数のボードによるチームごとの作業管理
- WIP制限によるボトルネックの早期発見
9.3 統合のメリット
- セキュリティイシューを通常の開発ワークフローに統合
- 脆弱性から直接イシューを作成し、イシューボードで管理
- 担当者リストによる作業負荷の可視化
- スイムレーンによるエピック単位の進捗管理
これらの機能を組み合わせることで、開発チームはセキュリティリスクを効率的に管理しながら、プロジェクトの進捗を可視化し、チーム全体の生産性を向上させることができます。GitLabの統合的なアプローチにより、セキュリティと開発速度のバランスを取りながら、高品質なソフトウェアを継続的に提供できる環境が実現します。