Sysdig × Snyk SCA Enrichment 連携手順 — Runtime の脆弱性を「修正対象のソースコード」まで一気通貫で追う
はじめに
Sysdig Secure の Runtime Vulnerability Findings は、本番環境のコンテナで実際に動いているパッケージから脆弱性を検知する強力な機能です。ただし、ここで分かるのは「prod に何が刺さっているか」までで、開発側に修正を投げる際は「どのリポジトリの・どのブランチの・どのマニフェストを直すか」までを別途特定する必要があります。
この runtime 側の脆弱性と SDLC 側のソースコードを繋ぐのが、本記事で扱う Sysdig × Snyk SCA Inbound Integration です。設定後は Sysdig の脆弱性詳細画面に Snyk 由来の Repository / Branch / Commit / File Path / Remediation / Vendor Link が enrich されて表示されます。
本記事では、ゼロからこの連携を構築し、実際に enrichment 表示まで確認する手順をチュートリアル形式で整理します。
対象読者
- Sysdig Secure を導入済みで、Snyk SCA との連携を検討している設定担当者
- Runtime 脆弱性から開発側への fix 依頼までを自動化したい SecOps エンジニア
- Sysdig SE / セキュリティ営業で、顧客 PoC の手順を抑えたい方
この記事で分かること
- Sysdig × Snyk SCA enrichment 連携の全体像とアーキテクチャ
- サンプルアプリ準備から enrichment 表示までのエンドツーエンド手順
- OCI image source label と Snyk Project URL の役割
- Sysdig UI 上での enrichment 表示の確認ポイント
1. 連携の全体像
1.1 何が連携されるのか
Sysdig × Snyk SCA Integration は Inbound 型の連携です。Snyk 側の Open Source Project が持つ SCA 情報(依存パッケージの脆弱性、修正バージョン、ソースコードの位置情報)を Sysdig 側に取り込み、Sysdig が runtime で検出した同じパッケージの脆弱性に**メタデータを付加(enrich)**します。
つまり:
1.2 マッチングの仕組み
Sysdig が runtime image を Snyk Project に紐付けるキーは OCI Image Source Label です。
LABEL org.opencontainers.image.source="https://github.com/<owner>/<repo>"
この URL が Snyk 側で onboard した GitHub Project の URL と一致した時点で、両者の SCA データが結合されます。
1.3 全体構成
2. 前提条件
| 項目 | 要件 |
|---|---|
| Sysdig Secure | SaaS / On-Prem いずれも可。本記事は SaaS US East を前提 |
| Sysdig Agent | 対象クラスタに deploy 済、Runtime Scanner が Running |
| Snyk | Group / Organization が存在し、GitHub Integration が設定済 |
| Snyk API Token | User API Token または Service Account Token |
| Snyk Org ID | Snyk Settings → General で確認可 |
| Kubernetes Cluster | Sysdig agent が動いている任意のクラスタ |
| Container Registry | image push 先(本記事は Google Artifact Registry を使用) |
| GitHub Account | サンプル repo を作成・push できる account |
3. 手順
3.1 サンプル Node.js アプリの準備
意図的に脆弱な依存を含む Node.js アプリを用意します。
package.json
{
"name": "sysdig-snyk-sca-demo",
"version": "1.0.0",
"description": "Sysdig x Snyk SCA enrichment verification demo app",
"main": "index.js",
"scripts": {
"start": "node index.js"
},
"engines": {
"node": ">=18"
},
"dependencies": {
"express": "4.17.1",
"lodash": "4.17.4",
"minimist": "1.2.0",
"axios": "0.21.0",
"node-fetch": "2.6.0",
"ws": "7.4.0",
"moment": "2.29.1",
"qs": "6.5.2"
}
}
代表的に検出される CVE:
| Package | Version | 既知 CVE |
|---|---|---|
| lodash | 4.17.4 | CVE-2019-10744 (Prototype Pollution) |
| minimist | 1.2.0 | CVE-2020-7598, CVE-2021-44906 |
| axios | 0.21.0 | CVE-2020-28168 (SSRF) |
| body-parser (express 経由) | 1.19.0 | CVE-2024-45590 (DoS) |
| moment | 2.29.1 | CVE-2022-31129 (ReDoS) |
index.js
const express = require('express');
const _ = require('lodash');
const minimist = require('minimist');
const app = express();
const args = minimist(process.argv.slice(2));
const port = args.port || process.env.PORT || 3000;
app.get('/', (req, res) => {
res.json(_.merge({}, { app: 'sysdig-snyk-sca-demo', status: 'ok' }));
});
app.get('/health', (req, res) => res.status(200).send('OK'));
app.listen(port, () => console.log(`listening on :${port}`));
3.2 Dockerfile(OCI Source Label が肝心)
連携のマッチングキーになるので、org.opencontainers.image.source は必ず設定します。
FROM node:18-bullseye-slim
LABEL org.opencontainers.image.source="https://github.com/<owner>/sysdig-snyk-sca-demo"
LABEL org.opencontainers.image.title="sysdig-snyk-sca-demo"
LABEL org.opencontainers.image.description="Sysdig x Snyk SCA enrichment demo"
WORKDIR /app
COPY package.json ./
RUN npm install --omit=dev
COPY index.js ./
EXPOSE 3000
CMD ["node", "index.js"]
ラベル値の URL は GitHub 上の repo URL と完全一致させる必要があります(https:// 始まり、.git 無し)。
3.3 GitHub リポジトリ作成 & push
git init -b main
git add .
git commit -m "Initial commit: sysdig-snyk-sca-demo"
gh repo create <owner>/sysdig-snyk-sca-demo --public --source=. --remote=origin --push
3.4 Snyk への repo onboarding
- https://app.snyk.io にログイン
- 対象 Organization を選択
-
Add project → GitHub を選択
- GitHub Integration が未設定の場合は Settings → Integrations → GitHub → Connect を先に実施
- 一覧から
<owner>/sysdig-snyk-sca-demoを選び Add selected repositories -
Projects タブで
package.jsonが import され、脆弱性が検出されることを確認
新規 repo が一覧に出ない場合は、GitHub 側の Snyk App が新 repo へのアクセス権を持っていない可能性があります。
https://github.com/settings/installationsで Snyk App の Repository access を確認してください。
3.5 Docker image build & registry push
GAR を使う例:
gcloud auth configure-docker asia-northeast1-docker.pkg.dev --quiet
docker buildx build --platform linux/amd64 \
-t asia-northeast1-docker.pkg.dev/<project>/<repo>/sysdig-snyk-sca-demo:v1 \
--push .
push 後、image に label が反映されていることを確認:
docker inspect asia-northeast1-docker.pkg.dev/<project>/<repo>/sysdig-snyk-sca-demo:v1 \
--format '{{json .Config.Labels}}' | jq
# => "org.opencontainers.image.source": "https://github.com/<owner>/sysdig-snyk-sca-demo"
3.6 Kubernetes へ deploy
deployment.yaml
apiVersion: v1
kind: Namespace
metadata:
name: sca-demo
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: sysdig-snyk-sca-demo
namespace: sca-demo
labels:
app: sysdig-snyk-sca-demo
spec:
replicas: 1
selector:
matchLabels:
app: sysdig-snyk-sca-demo
template:
metadata:
labels:
app: sysdig-snyk-sca-demo
spec:
containers:
- name: app
image: asia-northeast1-docker.pkg.dev/<project>/<repo>/sysdig-snyk-sca-demo:v1
imagePullPolicy: Always
ports:
- containerPort: 3000
readinessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 5
periodSeconds: 10
kubectl apply -f deployment.yaml
kubectl -n sca-demo rollout status deploy/sysdig-snyk-sca-demo
3.7 Sysdig × Snyk Integration の設定
3.7.1 Snyk 側で必要情報を取得
- API Token: Snyk 右上アバター → Account settings → Auth Token → クリックして表示・コピー
- Organization ID: Snyk → 対象 Org → Settings (歯車) → General に表示される UUID をコピー
3.7.2 Sysdig 側で Integration を登録
Sysdig Secure UI で:
- Integrations → Source Code Management → Snyk(または Settings → Integrations → Snyk)
- Add Integration をクリック
- フォームに入力:
-
Name: 任意(例:
snyk-sca) - API Token: 3.7.1 で取得した token
- Org ID: 3.7.1 で取得した UUID
-
Region: Snyk が US instance なら
US、EU ならEU
-
Name: 任意(例:
- Test connection → Save
設定後、Integration 詳細画面で Status: Connected と Last Sync タイムスタンプが入ることを確認します。
3.8 Sysdig UI で enrichment を確認
3.8.1 image が runtime scan に検出されているか
Sysdig Secure → Vulnerabilities → Runtime で以下を絞り込み:
- Cluster: 対象クラスタ名
- Namespace:
sca-demo - Image:
sysdig-snyk-sca-demo
リストに対象 image とその CVE 群が表示されたら scan は成功しています。
3.8.2 OCI label が Sysdig に認識されているか
任意の image を選択 → Inventory ビュー(または Image detail)→ Detail タブで Docker labels を確認。
org.opencontainers.image.source : https://github.com/<owner>/sysdig-snyk-sca-demo
が表示されていれば、Sysdig はマッチングに使うキーを取得できています。
3.8.3 enrichment の表示確認
任意の CVE(例:lodash の CVE-2019-10744)をクリックして詳細パネルを開き、以下を確認します。
| 確認項目 | enrich 完了の表示 |
|---|---|
| Severity の "by" |
by NVD ではなく by Snyk
|
| External Links |
security.snyk.io/vuln/SNYK-JS-... リンクが表示 |
| Remediations | 具体的な fix version(例:Upgrade lodash to 4.17.21) |
| Source Code / Repository | GitHub repo URL、branch、commit が表示 |
| File Path |
/app/node_modules/... ではなく、ソース側 package.json
|
すべて埋まっていれば、Runtime からソースコードまでの追跡パスが完成しています。
4. 反映タイミングについて
Sysdig × Snyk Integration の enrichment は、設定直後に即時反映されるわけではなく、最大24時間程度の sync 待ちが公式に明記されています。実測上は数十分〜数時間で反映されることが多いです。
設定直後に表示が確認できない場合は、以下の順で切り分けます。
- Integration Status: Connected であるか
- Last Sync が更新されているか
- Snyk 側 Project に対象 CVE が出ているか
- Sysdig UI の Image Detail で
org.opencontainers.image.sourceが認識されているか - Snyk Project Origin URL と OCI label URL が完全一致しているか(
.gitの有無、case など)
これらすべて OK で 24時間 待っても enrichment が表示されない場合は Sysdig Support 起票案件です。
5. まとめ
| 観点 | Sysdig 単体 | Snyk SCA 連携追加後 |
|---|---|---|
| Runtime に何が刺さっているか | ✅ | ✅ |
| パッケージ名 / version | ✅ | ✅ |
| どの repo の・どの branch・どの commit | ❌ | ✅ |
| どの dependency file に書かれている | ❌ | ✅ |
| 具体的な upgrade 経路 | "Fix available" のみ | ✅ |
| 修正の開発側オーナー特定 | ❌ | ✅ |
Sysdig 単体でも runtime 脆弱性の検知はできますが、Snyk SCA 連携を追加することで「SecOps → DevOps への投げ返しに必要な情報」が同一画面で取得できるようになります。すでに Snyk を SCA / SAST で導入済の組織にとっては、既存投資を runtime 側まで延伸させる最短経路の連携と言えます。
設定自体は API Token と Org ID と OCI label の3点で成立する素直な構成です。一方で enrichment 表示までの sync 待ちは比較的長く、24h を見越したスケジュールで運用すると安全です。