gitlab-vulnerability について
gitlab-vulnerabilityは、glab apiを通じてGitLabプロジェクトの脆弱性を管理するスキルです。検出結果の確認、状態変更、データ出力により、セキュリティレビューとトリアージを支援します。
主な機能
- 01プロジェクトの脆弱性一覧と絞り込み
- 02脆弱性とスキャナー検出結果の確認
- 03脆弱性の確認・却下・解決
- 04検出状態への差し戻し
- 05脆弱性データの出力と統計確認
活用シーン
- 01新たに検出された高重大度脆弱性のトリアージ
- 02重大度や状態別の脆弱性集計
- 03誤検知や許容リスクの記録
- 04CVEまたはパイプライン検出結果の確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ grandcamel/ gitlab-assistant-skills --skill gitlab-vulnerabilityインストール後、Claude Code で/gitlab-vulnerabilityを入力して読み込まれたか確認します。
詳細
脆弱性スキル
glab api の生エンドポイント呼び出しを使用した、GitLab のセキュリティ脆弱性管理です。
クイックリファレンス
| 操作 | コマンドパターン | リスク |
|---|---|---|
| 脆弱性の一覧表示 | glab api projects/:id/vulnerabilities | - |
| 脆弱性の取得 | glab api projects/:id/vulnerabilities/:vuln_id | - |
| 脆弱性の確認 | glab api projects/:id/vulnerabilities/:vuln_id/confirm -X POST | ⚠️ |
| 脆弱性の却下 | glab api projects/:id/vulnerabilities/:vuln_id/dismiss -X POST -f ... | ⚠️ |
| 脆弱性の解決 | glab api projects/:id/vulnerabilities/:vuln_id/resolve -X POST | ⚠️ |
| 検出済みに戻す | glab api projects/:id/vulnerabilities/:vuln_id/revert -X POST | ⚠️ |
| 検出結果の一覧表示 | glab api projects/:id/vulnerability_findings | - |
リスク凡例:- 安全 | ⚠️ 注意 | ⚠️⚠️ 警告 | ⚠️⚠️⚠️ 危険
このスキルを使用するタイミング
必ず使用する場合:
- ユーザーが「脆弱性」、「セキュリティの問題」、「CVE」に言及した場合
- ユーザーがセキュリティスキャンの結果を表示したい場合
- ユーザーが「SAST」、「DAST」、「依存関係スキャン」、「コンテナスキャン」に言及した場合
- ユーザーがセキュリティ検出結果を却下または解決したい場合
- ユーザーがセキュリティダッシュボードについて尋ねた場合
使用しない場合:
- ユーザーがセキュリティスキャンを実行したい場合(gitlab-ci を使用)
- ユーザーがセキュリティ設定を構成したい場合(プロジェクト設定を使用)
- ユーザーが一般的なイシュー追跡を行いたい場合(gitlab-issue を使用)
API の前提条件
必須のトークンスコープ: read_api または api
権限:
- 脆弱性の読み取り:Developer 以上
- 脆弱性の管理:Developer 以上
GitLab のティア: 脆弱性管理機能をすべて利用するには Ultimate が必要です
脆弱性の状態
| 状態 | 説明 |
|---|---|
detected | 新規で、未レビューの脆弱性 |
confirmed | 実際の脆弱性であると確認済み |
dismissed | 誤検知、または修正しないものとしてマーク済み |
resolved | 修正済みで、存在しなくなった脆弱性 |
深刻度レベル
| 深刻度 | 説明 |
|---|---|
critical | 最も深刻度が高く、直ちに対応が必要 |
high | 大きなリスク |
medium | 中程度のリスク |
low | 軽微なリスク |
info | 情報提供目的の検出結果 |
unknown | 深刻度が未判定 |
利用可能なコマンド
プロジェクトの脆弱性を一覧表示
# List all vulnerabilities
glab api projects/123/vulnerabilities --method GET
# Filter by state
glab api "projects/123/vulnerabilities?state=detected" --method GET
# Filter by severity
glab api "projects/123/vulnerabilities?severity=critical,high" --method GET
# Filter by multiple criteria
glab api "projects/123/vulnerabilities?state=detected&severity=critical,high" --method GET
# With pagination
glab api projects/123/vulnerabilities --paginate
# Using project path
glab api "projects/$(echo 'mygroup/myproject' | jq -Rr @uri)/vulnerabilities"
脆弱性の詳細を取得
# Get specific vulnerability
glab api projects/123/vulnerabilities/456 --method GET
脆弱性を確認
検出された脆弱性を、確認済み(実際のセキュリティ上の問題)としてマークします。
# Confirm vulnerability
glab api projects/123/vulnerabilities/456/confirm --method POST
脆弱性を却下
脆弱性を却下(誤検知または受容したリスク)としてマークします。
# Dismiss as false positive
glab api projects/123/vulnerabilities/456/dismiss --method POST \
-f comment="False positive - this code path is not reachable"
# Dismiss as acceptable risk
glab api projects/123/vulnerabilities/456/dismiss --method POST \
-f comment="Accepted risk - mitigated by network controls"
# Dismiss with dismissal reason (if available)
glab api projects/123/vulnerabilities/456/dismiss --method POST \
-f comment="Not applicable to our use case" \
-f dismissal_reason="used_in_tests"
脆弱性を解決
脆弱性を解決済み(修正済み)としてマークします。
# Resolve vulnerability
glab api projects/123/vulnerabilities/456/resolve --method POST
検出済みの状態に戻す
脆弱性を検出済みの状態に戻します。
# Revert to detected
glab api projects/123/vulnerabilities/456/revert --method POST
脆弱性の検出結果を一覧表示
検出結果は、セキュリティスキャナーからの生の結果です。
# List all findings
glab api projects/123/vulnerability_findings --method GET
# Filter by severity
glab api "projects/123/vulnerability_findings?severity=critical,high" --method GET
# Filter by scanner
glab api "projects/123/vulnerability_findings?scanner=sast" --method GET
# Filter by pipeline
glab api "projects/123/vulnerability_findings?pipeline_id=789" --method GET
# With pagination
glab api projects/123/vulnerability_findings --paginate
セキュリティダッシュボード(グループレベル)
# Get security statistics for group
glab api groups/456/vulnerability_exports --method POST \
-f export_format="csv"
# Get group vulnerability statistics
glab api "groups/456/vulnerability_statistics" --method GET
一般的なワークフロー
ワークフロー 1:新しい脆弱性のトリアージ
project_id=123
# Get all detected (new) vulnerabilities
glab api "projects/$project_id/vulnerabilities?state=detected" --paginate | \
jq -r '.[] | "[\(.severity)] \(.title) - \(.id)"'
# Review critical/high first
glab api "projects/$project_id/vulnerabilities?state=detected&severity=critical,high" | \
jq -r '.[] | "ID: \(.id)\nTitle: \(.title)\nSeverity: \(.severity)\nScanner: \(.scanner.name)\nLocation: \(.location | @json)\n---"'
ワークフロー 2:セキュリティレポートの生成
project_id=123
# Summary by severity
echo "=== Vulnerability Summary ==="
glab api "projects/$project_id/vulnerabilities" --paginate | \
jq -r 'group_by(.severity) | map({severity: .[0].severity, count: length}) | .[] | "\(.severity): \(.count)"'
# Summary by state
echo ""
echo "=== By State ==="
glab api "projects/$project_id/vulnerabilities" --paginate | \
jq -r 'group_by(.state) | map({state: .[0].state, count: length}) | .[] | "\(.state): \(.count)"'
# Summary by scanner
echo ""
echo "=== By Scanner ==="
glab api "projects/$project_id/vulnerabilities" --paginate | \
jq -r 'group_by(.scanner.name) | map({scanner: .[0].scanner.name, count: length}) | .[] | "\(.scanner): \(.count)"'
ワークフロー 3:誤検知を一括で却下
project_id=123
# Dismiss all info-level findings from specific scanner
glab api "projects/$project_id/vulnerabilities?severity=info&state=detected" --paginate | \
jq -r '.[].id' | while read vuln_id; do
echo "Dismissing $vuln_id"
glab api projects/$project_id/vulnerabilities/$vuln_id/dismiss --method POST \
-f comment="Bulk dismissed - info level findings"
done
ワークフロー 4:重大な脆弱性の追跡
project_id=123
# List critical vulnerabilities with details
glab api "projects/$project_id/vulnerabilities?severity=critical" --paginate | \
jq -r '.[] | {
id: .id,
title: .title,
state: .state,
detected_at: .detected_at,
scanner: .scanner.name,
identifiers: [.identifiers[]?.name] | join(", ")
}'
ワークフロー 5:CVE の確認
project_id=123
cve="CVE-2021-44228"
# Search for specific CVE
glab api "projects/$project_id/vulnerabilities" --paginate | \
jq -r ".[] | select(.identifiers[]?.name == \"$cve\") | \"ID: \(.id), State: \(.state), Title: \(.title)\""
ワークフロー 6:脆弱性のエクスポート
project_id=123
# Export to JSON
glab api "projects/$project_id/vulnerabilities" --paginate > vulnerabilities.json
# Export to CSV format
glab api "projects/$project_id/vulnerabilities" --paginate | \
jq -r '["id","title","severity","state","scanner","detected_at"],
(.[] | [.id, .title, .severity, .state, .scanner.name, .detected_at]) | @csv' > vulnerabilities.csv
ワークフロー 7:パイプラインの結果を比較
project_id=123
# Get findings from specific pipeline
pipeline_id=789
glab api "projects/$project_id/vulnerability_findings?pipeline_id=$pipeline_id" | \
jq -r '.[] | "\(.severity): \(.name)"'
スキャナーの種類
| スキャナー | レポートの種類 | 説明 |
|---|---|---|
sast | SAST | 静的アプリケーションセキュリティテスト |
dast | DAST | 動的アプリケーションセキュリティテスト |
dependency_scanning | 依存関係スキャン | サードパーティ製依存関係の脆弱性 |
container_scanning | コンテナスキャン | コンテナイメージの脆弱性 |
secret_detection | シークレット検出 | コード内にハードコードされたシークレット |
coverage_fuzzing | カバレッジファジング | ファジングテストの結果 |
api_fuzzing | API ファジング | API ファジングの結果 |
トラブルシューティング
| 問題 | 原因 | 解決策 |
|---|---|---|
| 403 Forbidden | Ultimate が必要、またはアクセス権がありません | GitLab のプランと権限を確認します |
| 結果が空 | スキャンが実行されていません | CI でセキュリティスキャナーを設定して実行します |
| 脆弱性が古い | 最近のパイプラインがありません | セキュリティジョブを含む新しいパイプラインを実行します |
| 却下できない | すでに却下または解決済みです | 現在の状態を確認します |
| スキャナーの種類が見つからない | スキャナーが設定されていません | CI 設定にスキャナーを追加します |
ベストプラクティス
- 定期的にトリアージする:新しい脆弱性を頻繁に確認します
- 却下の理由を記録する:理由を説明するコメントを必ず追加します
- 重大な問題を追跡する:重大度が「Critical」または「High」の脆弱性を注意深く監視します
- イシューと連携する:確認済みの脆弱性についてイシューを作成します
- 可能な場合は自動化する:CI を使用して、新たに検出された重大な脆弱性がある場合に失敗するようにします
関連ドキュメント
コメント
Markdown 対応