ストーリー
田
田中VPoE
シフトレフトの考え方はわかったな。では、具体的なセキュリティスキャンの種類と統合方法を見ていこう
あなた
SAST、DAST、SCA — 名前は聞いたことがありますが、組織全体で統合するとなると、どう使い分けるんですか?
あ
田
田中VPoE
それぞれ検出できる脆弱性の種類が違う。一つだけでは不十分で、組み合わせて使うことで網羅的なセキュリティカバレッジを実現する。ただし、全部入れるとパイプラインが遅くなる。ここでもトレードオフの判断が必要だ
3つのスキャン手法の比較
| 項目 | SAST | DAST | SCA |
|---|
| 正式名称 | Static Application Security Testing | Dynamic Application Security Testing | Software Composition Analysis |
| 対象 | ソースコード | 実行中のアプリケーション | 依存ライブラリ |
| 実行タイミング | ビルド前/ビルド時 | デプロイ後 | ビルド時 |
| 検出対象 | SQLインジェクション、XSS、バッファオーバーフロー等 | 認証バイパス、CSRF、設定ミス等 | 既知の脆弱性(CVE)、ライセンス違反 |
| 長所 | 高速、早期検出 | 実際の攻撃をシミュレート | 既知脆弱性の網羅的検出 |
| 短所 | 偽陽性が多い | 実行環境が必要、時間がかかる | ゼロデイには対応できない |
検出範囲のカバレッジ
SAST SCA DAST
┌──────┐ ┌──────┐ ┌──────┐
│自作 │ │OSS │ │実行時│
│コード │ │依存 │ │の挙動│
│の脆弱│ │ライブ │ │ │
│性 │ │ラリの │ │ │
│ │ │脆弱性 │ │ │
└──────┘ └──────┘ └──────┘
3つを組み合わせることでカバレッジを最大化
SAST: 静的アプリケーションセキュリティテスト
組織標準ツールの選定
| ツール | 対応言語 | 特徴 | ライセンス |
|---|
| Semgrep | 多言語 | カスタムルール作成が容易 | OSS + 商用 |
| CodeQL | 多言語 | GitHub統合が強力 | GitHub利用者は無料 |
| SonarQube | 多言語 | 品質ゲートとの統合 | OSS + 商用 |
パイプラインへの統合
# GitHub Actions: SAST統合
security-sast:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run Semgrep
uses: semgrep/semgrep-action@v1
with:
config: "p/owasp-top-ten"
generateSarif: true
- name: Upload SARIF
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: semgrep.sarif
偽陽性の管理
SASTの最大の課題は偽陽性です。組織レベルでの管理戦略が必要です。
| 戦略 | 説明 |
|---|
| ルールのチューニング | 組織のコーディングパターンに合わせてルールを調整 |
| ベースラインの設定 | 既存の検出結果をベースラインとし、新規のみアラート |
| 抑制リスト | 検証済みの偽陽性をリスト管理 |
| 定期レビュー | 月次でルールと抑制リストをレビュー |
SCA: ソフトウェアコンポジション分析
組織標準ツールの選定
| ツール | 特徴 | 自動修正 |
|---|
| Snyk | 幅広い言語対応、修正PR自動作成 | あり |
| Dependabot | GitHub統合、無料 | あり |
| Trivy | コンテナスキャン対応、OSS | なし |
脆弱性の優先順位付け
すべてのCVEに即座に対応するのは現実的ではありません。優先順位をつけます。
| 重要度 | CVSS | 対応期限 | アクション |
|---|
| Critical | 9.0-10.0 | 24時間以内 | パイプラインをブロック、即時修正 |
| High | 7.0-8.9 | 7日以内 | パイプラインをブロック |
| Medium | 4.0-6.9 | 30日以内 | 警告表示 |
| Low | 0.1-3.9 | 90日以内 | ログ記録のみ |
DAST: 動的アプリケーションセキュリティテスト
実行タイミングと戦略
DASTはアプリケーションを実際に実行してテストするため、実行環境が必要です。
| 実行環境 | テスト範囲 | 頻度 |
|---|
| ステージング | フルスキャン | リリース前 |
| エフェメラル環境 | APIスキャン | PR単位(重要エンドポイントのみ) |
| 本番 | パッシブスキャン | 常時 |
# GitHub Actions: DAST統合(ステージングデプロイ後)
security-dast:
needs: deploy-staging
runs-on: ubuntu-latest
steps:
- name: OWASP ZAP Scan
uses: zaproxy/action-full-scan@v0.11.0
with:
target: "https://staging.example.com"
rules_file_name: "zap-rules.tsv"
統合戦略:パイプラインへの配置
3つのスキャンをパイプラインのどこに配置するかを定義します。
PR作成時:
├── SAST(Semgrep / CodeQL) ← 必須、ブロック
├── SCA(Snyk / Dependabot) ← 必須、Critical/Highはブロック
└── シークレットスキャン ← 必須、ブロック
ビルド後:
└── コンテナイメージスキャン(Trivy) ← 必須、Critical はブロック
ステージングデプロイ後:
└── DAST(OWASP ZAP) ← 必須、Highはブロック
本番:
└── ランタイムモニタリング ← 継続的
まとめ
| ポイント | 内容 |
|---|
| SAST | ソースコードの脆弱性をビルド前に検出、偽陽性管理が重要 |
| SCA | 依存ライブラリの既知脆弱性を検出、CVSS重要度で優先順位付け |
| DAST | 実行中のアプリの脆弱性を検出、ステージング環境で実施 |
| 統合 | 3手法を組み合わせてカバレッジを最大化 |
チェックリスト
次のステップへ
次は「コンプライアンスゲートの設計」です。セキュリティスキャンの結果を、組織のコンプライアンス要件に沿ってゲートとして機能させる方法を学びましょう。
推定読了時間: 30分