Chuyển đến nội dung chính

SAST、SCA、シークレットスキャン:あらゆるCIパイプラインに必要な3つの最低レイヤー

Duy Tran10分
SAST、SCA、シークレットスキャン:あらゆるCIパイプラインに必要な3つの最低レイヤー
本番環境のすべてのパイプラインには、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つのレイヤー:

  1. gitleaks protectを使ったプリコミットフック:ローカルでコミットした瞬間にブロック。
  2. 各PRでのCIスキャン:フックをバイパスしたコミットや、Web UIからのコミットを捕捉。
  3. 定期的なリポジトリ全体の履歴スキャン: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レイヤーのスキャンを同時に有効化すると、初日に数千件の検出が出ます。結果として誰も対応せず、皆が無効化することに。安全な戦略:

  1. ベースラインモードを有効化:新規検出のみブロック。
  2. 高い重要度(CRITICAL/HIGH)から始め、徐々に下げていく。
  3. 専任のトリアージオーナーを置き、24時間以内に検出を適切なチームに振り分ける。
  4. 唯一のKPIは重要度別のMTTRダッシュボード——実行したスキャン数ではない。

結論

SAST + SCA + シークレットスキャンは、今週中に有効化できる中で最も安価で効果的なベースラインです。小さく始めましょう——1リポジトリ、1ルールセット、1プリコミットフック——MTTRを測定し、徐々に拡大します。3〜4ヶ月後には、これら3レイヤーが基本的な欠陥の大部分をブロックし、セキュリティチームは脅威モデリング、サプライチェーン、ランタイムにエネルギーを集中できます。