关于 container-security
container-security 是一项容器镜像扫描技能,可发现漏洞和 Dockerfile 问题并指导修复。它涵盖操作系统软件包、应用依赖及基础镜像问题。
主要功能
- 01扫描本地、镜像仓库或归档镜像
- 02检查操作系统软件包和应用依赖
- 03区分基础镜像漏洞
- 04按严重性筛选问题
- 05提供修复及 Dockerfile 建议
- 06重建镜像后重新扫描
适用场景
- 01部署前检查容器镜像
- 02判断漏洞来自基础镜像还是新增层
- 03规划软件包、依赖或基础镜像更新
- 04重建镜像后验证修复
MCP 相关
该技能说明如何调用 `mcp_snyk_snyk_container_scan` 扫描容器镜像。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ snyk/ studio-recipes --skill container-security安装后在 Claude Code 中输入/container-security确认已加载。
附带文件references/base-image-recommendations.mdreferences/dockerfile-best-practices.md
详细介绍
容器安全扫描器
容器镜像全面安全分析指南,涵盖操作系统漏洞、应用依赖项和 Dockerfile 最佳实践。
核心原则:从基础开始保护容器——使用安全的基础镜像、尽量减少软件包数量、不存在漏洞。
快速开始
1. Identify image to scan (local, registry, or archive)
2. Run snyk_container_scan with image name
3. Analyze results: OS packages + application deps
4. Provide remediation guidance
5. Optionally fix Dockerfile issues
阶段 1:识别镜像
步骤 1.1:解析用户输入
从用户请求中提取镜像引用(例如,myapp:latest、nginx:1.25、gcr.io/project/app:v1、sha256:abc123... 或 ./image.tar)。
步骤 1.2:确定扫描范围
询问或推断:
- 应用漏洞:是否包含应用依赖项?(默认:v1.1090.0+ 中包含)
- 基础镜像:是否单独分析基础镜像漏洞?(有助于了解哪些部分由你控制)
- 平台:对于多架构镜像,使用哪个平台?(linux/amd64、linux/arm64)
阶段 2:执行扫描
步骤 2.1:基本扫描
调用 mcp_snyk_snyk_container_scan,并传入:
image:镜像名称或路径
步骤 2.2:高级扫描选项
如需更全面的分析,请调用 mcp_snyk_snyk_container_scan,并传入:
image:镜像名称file:Dockerfile 路径(可提供更好的修复建议)app_vulns:true(扫描应用依赖项)severity_threshold:"high"(仅筛选高危和严重漏洞)
步骤 2.3:基础镜像分析
要区分继承而来的漏洞和新增漏洞:
- 调用
mcp_snyk_snyk_container_scan,传入image和exclude_base_image_vulns: true——仅显示由你添加的层引入的漏洞。 - 不传入该标记再次调用——显示包含基础操作系统在内的完整情况。
阶段 3:分析结果
步骤 3.1:分类调查结果
| 来源 | 描述 | 你的控制方式 |
|---|---|---|
| 基础操作系统软件包 | 由基础镜像安装 | 更换基础镜像 |
| 其他操作系统软件包 | 通过 apt/yum 安装 | 更新或移除 |
| 应用依赖项 | Node 模块、Python 软件包 | 更新版本 |
| Dockerfile 问题 | 配置错误 | 直接修复 |
步骤 3.2:生成摘要
## Container Scan Results: [image:tag]
### Overview
| Category | Critical | High | Medium | Low |
|----------|----------|------|--------|-----|
| OS Packages | X | Y | Z | W |
| App Dependencies | A | B | C | D |
| **Total** | X+A | Y+B | Z+C | W+D |
### Base Image Analysis
- **Base**: [base image detected]
- **Vulnerabilities from base**: [count]
- **Vulnerabilities you added**: [count]
### Top Priority Issues
| Severity | Package | Vulnerability | Fix Available |
|----------|---------|---------------|---------------|
| Critical | openssl | CVE-2024-XXXX | Yes - 3.0.12 |
| High | libcurl | CVE-2024-YYYY | Yes - 8.5.0 |
步骤 3.3:确定修复策略
操作系统软件包:在 Dockerfile 中更新软件包、升级基础镜像,或使用 distroless/精简基础镜像。
应用依赖项:更新源清单中的版本,并使用更新后的依赖项重新构建镜像。
没有可用的修复方案:记录已接受的风险,考虑使用替代软件包,或等待上游修复。
阶段 4:修复指导
步骤 4.1:升级基础镜像
如果基础镜像存在漏洞:
## Base Image Recommendation
**Current**: node:16-alpine
**Vulnerabilities**: 15 (3 Critical, 5 High)
**Recommended**: node:20-alpine
**Vulnerabilities**: 2 (0 Critical, 1 High)
### Dockerfile Change
```dockerfile
# Before
FROM node:16-alpine
# After
FROM node:20-alpine
迁移说明
- Node 20 在 [list] 中存在不兼容变更
- 部署前进行全面测试
### Step 4.2: Package Updates
For individual package vulnerabilities:
软件包修复:openssl
当前版本:3.0.8 存在漏洞:CVE-2024-XXXX(严重) 修复版本:3.0.12
添加到 Dockerfile
# Add before your application layer
RUN apk update && apk upgrade openssl
### Step 4.3: Application Dependency Fixes
应用依赖项修复
软件包:lodash(通过 npm 安装) 当前版本:4.17.15 修复版本:4.17.21
步骤
- 更新 package.json: "lodash": "^4.17.21"
- 重新构建镜像:docker build -t myapp:fixed .
- 验证修复:snyk container test myapp:fixed
### Step 4.4: Dockerfile Best Practices
Key improvements to recommend:
```dockerfile
# 1. Pin specific tags (not latest)
FROM node:20.10.0-alpine3.19
# 2. Run as non-root
RUN addgroup -g 1001 appgroup && \
adduser -u 1001 -G appgroup -D appuser
USER appuser
# 3. Multi-stage builds (smaller image, fewer vulns)
FROM node:20 AS builder
WORKDIR /app
COPY . .
RUN npm ci && npm run build
FROM node:20-alpine
COPY --from=builder /app/dist /app
CMD ["node", "/app/index.js"]
# 4. Minimize packages
RUN apt-get install -y --no-install-recommends curl
阶段 5:验证
步骤 5.1:重新构建镜像
# Rebuild with no cache to ensure fresh packages
docker build --no-cache -t myapp:fixed .
步骤 5.2:重新扫描
调用 mcp_snyk_snyk_container_scan,并传入:
image:myapp:fixedfile:./Dockerfile
步骤 5.3:比较结果
## Fix Verification
| Metric | Before | After | Change |
|--------|--------|-------|--------|
| Critical | 3 | 0 | -3 ✅ |
| High | 5 | 1 | -4 ✅ |
| Medium | 12 | 8 | -4 ✅ |
| Total | 20 | 9 | -11 ✅ |
### Remaining Issues
- 1 High: No fix available upstream (document risk)
- 8 Medium: Low priority (schedule for next sprint)
端到端示例
用户:“扫描我的 app:latest 镜像并帮我修复。”
步骤 1 — 运行扫描:
mcp_snyk_snyk_container_scan(image="app:latest", app_vulns=true)
步骤 2 — 工具返回(输出示例):
{
"summary": "Found 18 vulnerabilities (2 Critical, 6 High, 10 Medium)",
"baseImage": "node:16-alpine",
"vulnerabilities": [
{ "severity": "critical", "pkgName": "openssl", "version": "3.0.8",
"fixedIn": "3.0.12", "id": "CVE-2024-0001" },
{ "severity": "high", "pkgName": "lodash", "version": "4.17.15",
"fixedIn": "4.17.21", "id": "CVE-2021-23337" }
]
}
步骤 3 — 提供结构化回复:
## Scan Results: app:latest
Base image: node:16-alpine | 2 Critical · 6 High · 10 Medium
### Immediate Actions
1. Upgrade base image → node:20-alpine (eliminates ~14 vulns)
2. Pin openssl ≥ 3.0.12 in Dockerfile (CVE-2024-0001, Critical)
3. Update lodash to ^4.17.21 in package.json (CVE-2021-23337, High)
### Dockerfile patch
FROM node:20-alpine # was node:16-alpine
RUN apk add --no-cache openssl>=3.0.12
步骤 4 — 应用修复后,重新构建并扫描以确认问题已解决。
常见场景
场景 1:“扫描我的 Docker 镜像”
1. Invoke snyk_container_scan(image="app:latest")
2. Summarize findings by category
3. Recommend highest-priority fixes
4. Provide Dockerfile changes
场景 2:“保护我的 Dockerfile”
1. Review Dockerfile for best practices
2. Build image if not already built
3. Invoke snyk_container_scan(image=..., file="./Dockerfile")
4. Combine scan results with Dockerfile review
5. Provide unified remediation
场景 3:“寻找更安全的基础镜像”
1. Identify current base image and vulnerabilities
2. Scan alternative base images
3. Compare vulnerability counts
4. Recommend best option with migration notes
基础镜像快速参考
| 运行时 | 推荐基础镜像 | 说明 |
|---|---|---|
| Node.js | node:20-alpine | 最小,但可能缺少某些库 |
| Node.js | node:20-slim | 基于 Debian,兼容性更好 |
| Python | python:3.12-slim | 平衡性良好 |
| Python | python:3.12-alpine | 最小 |
| Java | eclipse-temurin:21-jre-alpine | 仅包含 JRE |
| Go | gcr.io/distroless/static | 无 shell,攻击面最小 |
| .NET | mcr.microsoft.com/dotnet/aspnet:8.0-alpine | 仅包含运行时 |
Distroless 选项(gcr.io/distroless/):static(Go/Rust)、base(大多数语言)、java、nodejs——均无 shell,攻击面最小。
错误处理
| 错误 | 解决方案 |
|---|---|
| 本地未找到镜像 | docker pull <image> · 检查名称拼写 · 确认可访问镜像仓库 |
| 需要镜像仓库身份验证 | docker login <registry> · 确认凭据和权限 |
| 扫描超时 | 重试 · 先在本地拉取镜像 · 改为扫描 .tar 归档文件 |
约束
- 部署前扫描:切勿部署未经扫描的镜像
- 固定版本:使用特定镜像标签,而非
latest - 记录例外情况:如果漏洞无法修复,请记录原因
- 定期重新扫描:应每周重新扫描镜像,以发现新的 CVE
- 多阶段构建:优先使用更小的生产镜像