本番環境のすべてのパイプラインには、3つの自動スキャンレイヤーが必要です。1つでも欠けていれば、インシデントの振り返りで「なぜもっと早く検知できなかったのか?」と説明する時間に多くを費やすことになります。
3つの最低レイヤー——その理由
| レイヤー | 検出対象 | 代表的なツール |
|---|---|---|
| SAST | ソースコードの脆弱性(SQLi、XSS、パストラバーサル、安全でないデシリアライゼーション) | Semgrep、CodeQL、SonarQube |
| SCA | 依存関係内のCVE、ライセンス違反 | Trivy、Grype、Snyk、Dependency-Track |
| シークレットスキャン | 誤ってコミットされたAPIキー、トークン、秘密鍵 | Gitleaks、Trufflehog、GitHub secret scanning |
SAST:Semgrepから始める
Semgrepは導入が容易で、オープンソースのルールセットが豊富、ルール記述の構文が実コードに近い特徴があります。最小構成のGitHub Actionsワークフロー:
name: semgrep
on:
pull_request:
push:
branches: [main]
jobs:
semgrep:
runs-on: ubuntu-latest
container: returntocorp/semgrep
steps:
- uses: actions/checkout@v4
- run: semgrep ci --config=p/owasp-top-ten --baseline-ref=origin/main
2つの重要なコツ:
- ベースライン差分スキャン:PRでは新しい検出だけをブロックし、既存検出はオーナー付きでバックログに入れる。導入直後にビルドが大量に壊れるのを防ぎます。
- カスタムルール:社内固有のパターンを止める5〜10ルールを書く(例:シークレットのログ出力、共通クライアントを介さない内部API呼び出し)。これが独自の価値を生み出します。
Trivy/Grype + SyftによるSCAとSBOM
同一パイプラインでCycloneDX形式のSBOMを生成し、CVEをスキャン:
- name: Generate SBOM
uses: anchore/sbom-action@v0
with:
format: cyclonedx-json
output-file: sbom.cdx.json
name: Scan SBOM with Grype uses: anchore/scan-action@v3 with: sbom: sbom.cdx.json fail-build: true severity-cutoff: high
SBOMをOWASP Dependency-Trackに投入してロングテールを追跡しましょう:新しいCVEが公開されると、ダッシュボードが影響を受けるプロジェクトを自動アラートします。SLAポリシーの参考例:
- 修正があるCRITICAL:7日以内に対応。
- 修正があるHIGH:30日以内に対応。
- MEDIUM/LOW:四半期ごとにレビューし、受容またはバックログで対応。
シークレットスキャン:プリコミット + CI + リポジトリ全体
3つのレイヤー:
gitleaks protectを使ったプリコミットフック:ローカルでコミットした瞬間にブロック。- 各PRでのCIスキャン:フックをバイパスしたコミットや、Web UIからのコミットを捕捉。
- 定期的なリポジトリ全体の履歴スキャン:git logに残っている古いシークレットを発見。
シークレット漏洩を検出した場合:
- ステップ1——漏洩したものとみなす:履歴削除に頼らず、即座にキー/トークンをローテーション。
- ステップ2:使用状況を監査(CloudTrail、Vault監査ログ)し、異常な挙動がないか確認。
- ステップ3:パブリックリポジトリの場合、BFGまたは
git filter-repoで履歴を整理。 - ステップ4:同様のパターンが再発しないようプリコミットルールを追加。
シークレットを正しく管理する
理想は、コードがいかなる場合もシークレット(暗号文すら)を含まないことです。選択肢:
- DBやキューに対する動的クレデンシャルを発行できるVault / AWS Secrets Manager / Azure Key Vault。
- Mozilla SOPSでシークレットファイルを暗号化してgitにコミットし、鍵をKMSに置く——GitOpsに適しています。
- GitHub Actionsとクラウド間のOIDCフェデレーションで長寿命のアクセスキーを完全に廃止。
注意:アラート疲労
レガシーな100リポジトリで3レイヤーのスキャンを同時に有効化すると、初日に数千件の検出が出ます。結果として誰も対応せず、皆が無効化することに。安全な戦略:
- ベースラインモードを有効化:新規検出のみブロック。
- 高い重要度(CRITICAL/HIGH)から始め、徐々に下げていく。
- 専任のトリアージオーナーを置き、24時間以内に検出を適切なチームに振り分ける。
- 唯一のKPIは重要度別のMTTRダッシュボード——実行したスキャン数ではない。
結論
SAST + SCA + シークレットスキャンは、今週中に有効化できる中で最も安価で効果的なベースラインです。小さく始めましょう——1リポジトリ、1ルールセット、1プリコミットフック——MTTRを測定し、徐々に拡大します。3〜4ヶ月後には、これら3レイヤーが基本的な欠陥の大部分をブロックし、セキュリティチームは脅威モデリング、サプライチェーン、ランタイムにエネルギーを集中できます。
