Snyk 依赖安全扫描¶
一句话概述:Snyk 是开发者安全平台,在你写代码的时候就自动扫描依赖包中的安全漏洞,并提供一键修复(自动创建升级 PR),支持 npm/pip/Maven/Go 等主流包管理器,免费版够个人用。
核心知识点¶
| 概念 | 白话解释 |
|---|---|
| SCA | 软件组成分析,扫描你用的第三方库有没有已知漏洞 |
| SAST | 静态应用安全测试,扫描你自己写的代码有没有安全问题 |
| 依赖漏洞 | 你引用的库存在安全漏洞,比如 log4j 漏洞 |
| 可达性分析 | 2026 新功能,判断漏洞函数是否真的被你的代码调用到 |
| 自动修复 PR | Snyk 自动创建 GitHub PR 升级有漏洞的依赖 |
| CVSS 评分 | 漏洞严重程度评分,0-10 分,越高越严重 |
| SBOM | 软件物料清单,列出所有依赖及其版本 |
安装配置¶
# 安装 Snyk CLI
npm install -g snyk # npm 全局安装
# 或者用独立安装
curl -fsSL https://static.snyk.io/cli/latest/snyk-linux -o snyk
chmod +x snyk && sudo mv snyk /usr/local/bin/
# 认证
snyk auth # 打开浏览器登录(免费注册)
# 或用 Token
snyk auth <your-token>
# 验证
snyk --version # 查看版本
IDE 集成¶
GitHub 集成¶
1. https://app.snyk.io → Integrations → GitHub
2. 授权 Snyk 访问你的仓库
3. 选择要监控的仓库
4. Snyk 自动扫描并在发现漏洞时创建 PR
基本使用¶
扫描项目¶
# 扫描当前项目的依赖漏洞
snyk test # 扫描 package.json/requirements.txt/go.mod 等
# 输出:
# ✗ 发现 3 个漏洞(1 高危,1 中危,1 低危)
# 每个漏洞显示:包名、版本、漏洞描述、修复建议
# 扫描并显示所有依赖
snyk test --all-projects # 扫描 monorepo 中的所有项目
# 扫描 Docker 镜像
snyk container test nginx:latest # 扫描容器镜像中的漏洞
# 扫描 IaC(基础设施即代码)
snyk iac test # 扫描 Terraform/K8s/CloudFormation 配置
# 扫描自己的代码(SAST)
snyk code test # 扫描源代码中的安全问题
修复漏洞¶
# 自动修复
snyk fix # 自动升级有漏洞的依赖到安全版本
# Snyk 会选择最小的升级路径,尽量不破坏兼容性
# 查看修复建议
snyk test --json | snyk-to-html -o report.html # 生成 HTML 报告
# 忽略某个漏洞(如果你确认不影响)
snyk ignore --id=SNYK-JS-LODASH-567746 # 按漏洞 ID 忽略
snyk ignore --id=SNYK-JS-LODASH-567746 --reason="我们没用到这个函数" # 加原因
# 会生成 .snyk 文件记录忽略策略
持续监控¶
# 把项目注册到 Snyk 持续监控
snyk monitor # 上传依赖信息到 Snyk 平台
# 新漏洞被发现时会通过邮件/Slack 通知你
# 也会自动创建 Fix PR(如果集成了 GitHub)
高级用法¶
CI/CD 集成¶
# .github/workflows/snyk.yml
name: Snyk Security
on: [push, pull_request]
jobs:
snyk:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: 安装依赖
run: npm ci
- name: Snyk 依赖扫描
uses: snyk/actions/node@master
env:
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
with:
args: --severity-threshold=high # 只报高危和严重漏洞
- name: Snyk 代码扫描
uses: snyk/actions/node@master
env:
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
with:
command: code test
严重度过滤¶
snyk test --severity-threshold=high # 只报告高危和严重漏洞
snyk test --severity-threshold=critical # 只报告严重漏洞
# 级别:low / medium / high / critical
JSON 输出¶
snyk test --json # JSON 格式输出(用于脚本处理)
snyk test --json | jq '.vulnerabilities | length' # 统计漏洞数
snyk test --sarif # SARIF 格式(GitHub Security 支持)
策略文件¶
# .snyk - 忽略策略文件
version: v1.5.0
ignore:
SNYK-JS-LODASH-567746:
- '*':
reason: "我们没用到受影响的函数"
expires: 2026-12-31T00:00:00.000Z # 到期后重新提醒
patch: {}
Python 项目扫描¶
# Python 项目
snyk test --file=requirements.txt # 指定依赖文件
snyk test --file=Pipfile # Pipenv 项目
snyk test --file=pyproject.toml # Poetry 项目
snyk test --command=python3 # 指定 Python 版本
常见报错¶
| 报错信息 | 原因 | 解决方案 |
|---|---|---|
Authentication required | 没登录 | snyk auth 登录 |
Could not detect package manager | 找不到依赖文件 | --file= 指定依赖文件 |
Failed to get vulns | 网络问题 | 检查网络连接或代理设置 |
| 漏洞太多改不完 | 项目依赖太旧 | 用 --severity-threshold=high 先修高危 |
No supported target files detected | 目录没有已知的项目文件 | 确认在正确的项目目录 |
| Fix PR 跟现有代码冲突 | 升级可能不兼容 | 手动检查并解决冲突 |
速查表¶
# CLI 命令
snyk auth # 登录认证
snyk test # 扫描依赖漏洞
snyk code test # 扫描代码(SAST)
snyk container test <镜像> # 扫描容器
snyk iac test # 扫描 IaC
snyk fix # 自动修复
snyk monitor # 持续监控
snyk ignore --id=<SNYK-ID> # 忽略漏洞
snyk policy # 查看策略
# 常用参数
--severity-threshold=high # 严重度过滤
--all-projects # 扫描所有子项目
--json # JSON 输出
--sarif # SARIF 输出
--file=<文件> # 指定依赖文件
# 支持的包管理器
npm / yarn / pnpm # JavaScript
pip / pipenv / poetry # Python
maven / gradle # Java
go mod # Go
NuGet # .NET
Composer # PHP
Cargo # Rust
CocoaPods # Swift/iOS
# 免费额度
# 200 次开源测试/月
# 100 次代码测试/月
# 100 次容器测试/月
# 300 次 IaC 测试/月
# 无限的 GitHub 仓库监控
参考:Snyk 官网 | Snyk 文档 | Snyk 漏洞数据库