本番環境に脆弱なコードが混入するのを未然に防ぐことは、現代の DevSecOps における最重要課題です。従来の静的アプリケーションセキュリティテスト(SAST)ツールは、スキャンに膨大な時間がかかり、偽陽性(誤検知)が多く、難解なアラートログによって開発者の作業を停滞させがちでした。Snyk Code の中核エンジンである DeepCode AI は、シンボリック AI(論理ルールエンジン)とセキュリティ特化の機械学習モデルを融合させることで、コードの意味論的解析を数秒から数十秒で完了し、極めて高い精度と低い誤検知率を実現しています。
脆弱なコードが保護ブランチへマージされるのを確実に阻止するため、DevOps およびエンジニアリングチームは通常、以下の「2層防御(Layered Defense)」アプローチを採用します。
- GitHub ネイティブ Pull Request(PR)チェック(SCM 連携): 開発者が PR を作成・更新した際に自動で差分スキャンを実行し、インラインコメントやサマリー表で結果をフィードバック。GitHub のブランチ保護ルールと連動してマージをブロックします。
- 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 アーキテクチャを採用しています。
- シンボリック解析・セマンティックエンジン: 数学的に厳密な論理検証を用いてテイント伝播経路(信頼できないユーザー入力が無害化されずに SQL クエリやコマンド実行部に達していないか)を追跡し、誤検知を最小限に抑えます。
- セキュリティ特化型 AI モデル: JavaScript、TypeScript、Python、Java、Go、C#、PHP、C/C++ など主要言語の構文やフレームワークの仕様を学習しており、文脈に応じた脆弱性を瞬時に検知します。
- DeepCode AI Fix(Agent Fix): 脆弱性を検知すると、コードの文脈に即した本番対応可能な修正差分(Diff)を自動生成し、開発者は GitHub PR 上で 1 クリックで修正を適用できます。
スキャンは通常 1 分未満で完了するため、開発チームのデプロイ速度を犠牲にすることなくセキュリティ検査を日常の開発フローに組み込めます。
2. 第1層:GitHub ネイティブ Pull Request チェックの設定
GitHub ネイティブの PR チェックは、Snyk と GitHub の Webhook 連携によって動作し、CI サーバーの実行時間枠(Runner 分)を消費することなく、PR の変更点に対する即時フィードバックを提供します。
ステップ 1:前提条件の確認
- Snyk の Group Admin または該当組織(Organization)の管理者権限を持つアカウント。
- Snyk Web UI の Settings > Integrations > GitHub にて GitHub リポジトリが連携済みであること。
- 対象リポジトリが Snyk にプロジェクト(Project)としてインポートされていること。
- 組織設定で Snyk Code が有効化されていること。
ステップ 2:Snyk 側で PR チェックの失敗条件を設定
- Snyk Web UI にログインし、Settings > Integrations > GitHub を開きます。
- Pull Request Checks の設定エリアへ移動します。
- 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 を有効にします。
- 設定を保存します。組織全体に適用することも、個別プロジェクト単位でオーバーライドすることも可能です。
ステップ 3:PR サマリーとインラインコメントの有効化
Snyk の PR エクスペリエンス設定で以下をオンにします:
- PR Issue Summary Comments:PR ごとに検出された脆弱性の件数と重大度内訳をまとめたテーブル形式のコメントを自動投稿します。
- Inline Comments:GitHub の Files changed タブにおいて、問題のあるコード行に直接 DeepCode AI が指摘と修正アドバイスをインラインコメントとして残します。
3. GitHub ブランチ保護ルールによるマージの強制ブロック
Snyk 側で PR チェックを「Failed」に設定しただけでは、GitHub 上で開発者がマージ操作を行うのを完全には阻止できません。これを必須条件にするには、GitHub の Branch Protection Rules(ブランチ保護ルール) を設定します。
手順は以下の通りです:
- 対象の GitHub リポジトリを開き、Settings > Branches を選択します。
- Branch protection rules セクションで Add rule をクリック(または
mainなどの既存ルールを Edit)します。 - Require a pull request before merging(マージ前に PR を必須化)にチェックを入れます。
- Require status checks to pass before merging(マージ前にステータスチェックの成功を必須化)にチェックを入れます。
- Require branches to be up to date before merging を有効にして、マージ先ブランチの最新コードと同期した状態で検証されるようにします。
- ステータスチェックの検索欄で、Snyk のチェック(通常
snyk/codeまたはcode/snyk)を検索して選択します。 - ページ下部の Save changes をクリックして保存します。
これで設定は完了です。DeepCode AI がしきい値を超える脆弱性を検知した場合、GitHub の「Merge pull request」ボタンは無効化され、脆弱性が解消されるまでマージできなくなります。
4. 第2層:GitHub Actions を用いた CI/CD パイプラインゲートの構築
PR のレビュー画面でのチェックに加え、CI/CD パイプラインに snyk code test を組み込むことで、自動ビルド、ステージング反映、定期ビルドなどすべての工程で一貫したセキュリティゲートを維持できます。
認証情報の登録
- Snyk の Web 画面から Service Account Token またはユーザー API トークンを取得します。
- GitHub リポジトリの Settings > Secrets and variables > Actions を開きます。
- リポジトリシークレットとして
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 はスキャン結果に応じて標準終了コードを返します:
0:スキャン成功。指定しきい値以上の脆弱性は検出されませんでした。1:しきい値以上の脆弱性が検出されました。パイプラインステップは失敗し、以降の処理が中断されます。2:CLI の実行時エラー(ネットワークエラーや認証失敗など)。3:対象ディレクトリ内に対応する言語やプロジェクトが検出されませんでした。
GitHub Advanced Security との連携
--sarif-file-output=snyk-code.sarif で静的解析標準フォーマット(SARIF)を出力し、github/codeql-action/upload-sarif でアップロードすることで、DeepCode AI の検知結果をリポジトリの Security > Code scanning alerts タブで一元管理できます。
5. 脆弱性修正フロー:DeepCode AI による自動修正とローカルでのシフトレフト
脆弱性をブロックするだけでなく、開発者が迅速かつ容易に修正できる環境を整えることが大切です。
- PR 上での 1 クリック自動修正: DeepCode AI が脆弱性を検知すると、Snyk は修正コード案を提示します。対応している場合、開発者は画面上から修正 PR を自動生成させ、サニタイズ処理や安全な代替関数の適用を即座に完了できます。
- IDE 拡張機能によるシフトレフト(早期発見): VS Code、IntelliJ IDEA、Eclipse などに Snyk Security プラグインを導入します。ローカル IDE 上で同じ DeepCode AI エンジンがリアルタイムにテイント経路を警告するため、コミット前に手元で脆弱性を潰すことができます。
.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 ゲートを連携させることで、開発の俊敏性を損なうことなく強固なコードセキュリティ体制を確立できます。
参考文献
- DeepCode AI | AI Code Review | AI Security for SAST | Snyk AI | Snyk
- Pull Request checks | Scan, fix, and prevent | Snyk User Docs
- Configure Pull Request checks | Scan, fix, and prevent | Snyk User Docs
- Code test | Developer tools | Snyk User Docs
- GitHub actions for Snyk setup and checking for vulnerabilities | Developer tools | Snyk User Docs
- About protected branches - GitHub Docs