広告枠を募集中 ご相談ください

Snyk DeepCode AI を GitHub PR チェックと CI/CD パイプラインに統合してコードの脆弱性をブロックする方法

365Finds Editorial
Wiki 記事 11,430 本収録

あなたの AI で 365 Wiki を使う

下のプロンプトをコピーして、普段使っている AI に貼り付け、そのまま質問してください。

完全版 Skill をダウンロード

まずはプロンプトでお試しください。よく使う場合は完全版 365Wiki Skill をインストールすると、毎回貼り付ける必要がありません。普段使う AI がなければ、Gemini や Microsoft Copilot のウェブ版でも使えます。

本番環境に脆弱なコードが混入するのを未然に防ぐことは、現代の DevSecOps における最重要課題です。従来の静的アプリケーションセキュリティテスト(SAST)ツールは、スキャンに膨大な時間がかかり、偽陽性(誤検知)が多く、難解なアラートログによって開発者の作業を停滞させがちでした。Snyk Code の中核エンジンである DeepCode AI は、シンボリック AI(論理ルールエンジン)とセキュリティ特化の機械学習モデルを融合させることで、コードの意味論的解析を数秒から数十秒で完了し、極めて高い精度と低い誤検知率を実現しています。

脆弱なコードが保護ブランチへマージされるのを確実に阻止するため、DevOps およびエンジニアリングチームは通常、以下の「2層防御(Layered Defense)」アプローチを採用します。

  1. GitHub ネイティブ Pull Request(PR)チェック(SCM 連携): 開発者が PR を作成・更新した際に自動で差分スキャンを実行し、インラインコメントやサマリー表で結果をフィードバック。GitHub のブランチ保護ルールと連動してマージをブロックします。
  2. CI/CD パイプラインゲート(Snyk CLI と GitHub Actions): ビルドおよびデリバリーパイプライン内で snyk code test を実行し、重大度しきい値に基づいてビルドを自動的に失敗・停止させます。

本記事では、この両層の設定手順、ブランチ保護ゲートの適用方法、および DeepCode AI による自動修正機能の活用法を詳しく解説します。


1. Snyk DeepCode AI の仕組みと特長

DeepCode AI は Snyk Code の解析エンジンであり、ソースコードを抽象構文木(AST)および中間表現(IR)に変換して、データフローやテイント(汚染)の追跡を深く行います。単純なパターンマッチングや、ハルシネーション(幻覚)を起こしやすい汎用生成 AI とは異なり、DeepCode AI はハイブリッド AI アーキテクチャを採用しています。

スキャンは通常 1 分未満で完了するため、開発チームのデプロイ速度を犠牲にすることなくセキュリティ検査を日常の開発フローに組み込めます。


2. 第1層:GitHub ネイティブ Pull Request チェックの設定

GitHub ネイティブの PR チェックは、Snyk と GitHub の Webhook 連携によって動作し、CI サーバーの実行時間枠(Runner 分)を消費することなく、PR の変更点に対する即時フィードバックを提供します。

ステップ 1:前提条件の確認

ステップ 2:Snyk 側で PR チェックの失敗条件を設定

  1. Snyk Web UI にログインし、Settings > Integrations > GitHub を開きます。
  2. Pull Request Checks の設定エリアへ移動します。
  3. Code Analysis (Snyk Code) 項目にて:
    • Code Analysis を Enabled に切り替えます。
    • Fail conditions(失敗条件) を設定します。PR チェックを失敗と判定する重大度しきい値を選択します(例:High)。High を選択した場合、高重大度の脆弱性が検知された場合のみチェックが失敗となり、Low や Medium の問題は開発をブロックせずに通知されます。
    • (任意)Snyk の自動修正が利用可能な問題のみでブロックしたい場合は、Only fail when the issues found have a fix available を有効にします。
  4. 設定を保存します。組織全体に適用することも、個別プロジェクト単位でオーバーライドすることも可能です。

ステップ 3:PR サマリーとインラインコメントの有効化

Snyk の PR エクスペリエンス設定で以下をオンにします:


3. GitHub ブランチ保護ルールによるマージの強制ブロック

Snyk 側で PR チェックを「Failed」に設定しただけでは、GitHub 上で開発者がマージ操作を行うのを完全には阻止できません。これを必須条件にするには、GitHub の Branch Protection Rules(ブランチ保護ルール) を設定します。

手順は以下の通りです:

  1. 対象の GitHub リポジトリを開き、Settings > Branches を選択します。
  2. Branch protection rules セクションで Add rule をクリック(または main などの既存ルールを Edit)します。
  3. Require a pull request before merging(マージ前に PR を必須化)にチェックを入れます。
  4. Require status checks to pass before merging(マージ前にステータスチェックの成功を必須化)にチェックを入れます。
  5. Require branches to be up to date before merging を有効にして、マージ先ブランチの最新コードと同期した状態で検証されるようにします。
  6. ステータスチェックの検索欄で、Snyk のチェック(通常 snyk/code または code/snyk)を検索して選択します。
  7. ページ下部の Save changes をクリックして保存します。

これで設定は完了です。DeepCode AI がしきい値を超える脆弱性を検知した場合、GitHub の「Merge pull request」ボタンは無効化され、脆弱性が解消されるまでマージできなくなります。


4. 第2層:GitHub Actions を用いた CI/CD パイプラインゲートの構築

PR のレビュー画面でのチェックに加え、CI/CD パイプラインに snyk code test を組み込むことで、自動ビルド、ステージング反映、定期ビルドなどすべての工程で一貫したセキュリティゲートを維持できます。

認証情報の登録

  1. Snyk の Web 画面から Service Account Token またはユーザー API トークンを取得します。
  2. GitHub リポジトリの Settings > Secrets and variables > Actions を開きます。
  3. リポジトリシークレットとして SNYK_TOKEN を作成し、トークンを保存します。

GitHub Actions ワークフローの記述

リポジトリ内に .github/workflows/snyk-code.yml を作成します:

name: Snyk DeepCode AI Security Scan

on:
  push:
    branches: [ "main", "develop" ]
  pull_request:
    branches: [ "main" ]

jobs:
  security-gate:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      security-events: write

    steps:
      - name: Checkout Source Code
        uses: actions/checkout@v4

      - name: Install Snyk CLI
        uses: snyk/actions/setup@master

      - name: Run Snyk DeepCode AI SAST Scan
        env:
          SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
        run: |
          snyk code test \
            --severity-threshold=high \
            --sarif-file-output=snyk-code.sarif

      - name: Upload SARIF Results to GitHub Code Scanning
        if: always()
        uses: github/codeql-action/upload-sarif@v3
        with:
          sarif_file: snyk-code.sarif

CLI 実行パラメータと終了コードの理解

snyk code test はスキャン結果に応じて標準終了コードを返します:

GitHub Advanced Security との連携

--sarif-file-output=snyk-code.sarif で静的解析標準フォーマット(SARIF)を出力し、github/codeql-action/upload-sarif でアップロードすることで、DeepCode AI の検知結果をリポジトリの Security > Code scanning alerts タブで一元管理できます。


5. 脆弱性修正フロー:DeepCode AI による自動修正とローカルでのシフトレフト

脆弱性をブロックするだけでなく、開発者が迅速かつ容易に修正できる環境を整えることが大切です。

  1. PR 上での 1 クリック自動修正: DeepCode AI が脆弱性を検知すると、Snyk は修正コード案を提示します。対応している場合、開発者は画面上から修正 PR を自動生成させ、サニタイズ処理や安全な代替関数の適用を即座に完了できます。
  2. IDE 拡張機能によるシフトレフト(早期発見): VS Code、IntelliJ IDEA、Eclipse などに Snyk Security プラグインを導入します。ローカル IDE 上で同じ DeepCode AI エンジンがリアルタイムにテイント経路を警告するため、コミット前に手元で脆弱性を潰すことができます。
  3. .dcignore によるスキャン対象の除外: 自動生成されたモック、ビルド成果物、外部ライブラリを誤ってスキャンしないよう、リポジトリルートに .dcignore ファイルを配置します:
    dist/
    build/
    vendor/
    **/*.spec.ts
    **/*.test.js
    

6. エンジニアリングチーム向け段階的導入戦略

既存のレガシーコードが存在するプロジェクトで初日からすべての脆弱性をブロックすると、開発現場に大きな混乱を招きます。以下の段階的な導入ロードマップが推奨されます:

フェーズPR チェック設定CI/CD パイプライン動作チームの目標
フェーズ 1:可視化とベースライン測定PR チェックを有効化するが、GitHub では**任意(非ブロック)**に設定。インラインコメントはオン。CI で snyk code test を実行し、continue-on-error: true で動作させる。SARIF をアップロード。DeepCode AI の検出結果に慣れ、既存コードの脆弱性傾向を把握する。
フェーズ 2:重大・高重大度のブロックブランチ保護で Snyk チェックを必須化。失敗条件を High / Critical に設定。パイプラインで --severity-threshold=high を指定し、高重大度のみブロック。SQL インジェクションやリモートコード実行などの致命的リスクのマージを確実に阻止する。
フェーズ 3:継続的ガバナンスと自動化重要サービスで Medium レベルへ拡大。DeepCode AI Fix を本格活用。定期スキャンで --report を送信して資産台帳を更新。除外ポリシーの定期見直し。新規脆弱性の混入ゼロを維持し、過去のセキュリティ負債を計画的に削減する。

GitHub ネイティブの PR チェックと GitHub Actions による CI/CD ゲートを連携させることで、開発の俊敏性を損なうことなく強固なコードセキュリティ体制を確立できます。


参考文献