Snyk + GitHub Actions で、脆弱性を含むパッケージの混入を防止する CI ワークフローを作る
こんにちは、製造ビジネステクノロジー部の若槻です。
Snyk は開発者向けのセキュリティプラットフォームで、OSS やコードなどの脆弱性を検出・修正するためのツールを提供しています。
直近だと次のような記事でも紹介されています。
今回は、Snyk + GitHub Actions で、脆弱性を含むパッケージの混入を防止する CI ワークフロー を作成する方法を紹介します。
Snyk Tokenの取得、設定
GitHub Actions から Snyk に接続するための Token を取得および設定します。
Snyk のマネジメントコンソールから、Account Settings > General を開きます。Token の KEY を控えます。

GitHub の Secrets に Snyk Token を設定します。ここでは Repository の Secrets に SNYK_TOKEN という名前で設定しました。
gh secret set SNYK_TOKEN --body "$SNYK_TOKEN"
Snyk Node Action で脆弱性をスキャンする CI を作る
Snyk Node Action を使えば、Snyk による Node プロジェクトのスキャンを GitHub Actions Workflow に組み込むことができます。
snyk/actions/node アクションを GitHub Actions ワークフローで次のように使用します。
name: CI
on: pull_request
jobs:
Integration:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
- run: npm ci
- name: Run Snyk
uses: snyk/actions/node@master
env:
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
with:
command: test
プルリクエストにコミットをプッシュすると、CI ワークフローが実行されました。今回は脆弱性が検出されなかったため実行が成功しました。

続いて、意図的に古い(脆弱性を含んだ)バージョンのパッケージをインストールして脆弱性を発生させてみます。
npm i vitest@1.0.0
コミットをプッシュすると、今度はワークフローが失敗しました。Snyk によってパッケージ(Vitest)の脆弱性が検出されていますね。

記載の URL を開くと、脆弱性の詳細が確認できます。

これにより、脆弱性があれば CI を失敗させて、解消されるまではプルリクエストのマージやデプロイ不可とするワークフローが作れますね。
その他の便利な使い方
Snyk Action では、他にも次のような使い方ができます。
- 一定の Severity 以上の脆弱性の場合のみ CI を失敗させる
- プロジェクトの脆弱性を継続的に監視する
上記は以下の記事でも紹介していますので、併せてご覧ください。
おわりに
今回は Snyk を紹介しましたが、これを例えば GitHub Dependabot version updates と組み合わせることにより、
- npm パッケージのアップデートは自身でローカルで行わない。Dependabot などに任せる
- 脆弱性が含まれるパッケージアップデートは Snyk で検出し、マージを抑止する
のような運用が可能になります。「効率的なアップデート運用はきちんと行いたい。しかし何としてでも脆弱性を混入させたくない」という場合に有効です。サプライチェーン攻撃が隆盛している昨今にスピード感のある開発を維持するためにはこういった取り組みは重要ですね。
以上






